250x250
Notice
Recent Posts
«   2024/07   »
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30 31
관리 메뉴

일상 코딩

파이썬 깨지지않는 암호화 OTP(One-Time-Pad) XOR 이용한 암호화 및 복호화 본문

Python/고전 컴퓨터 알고리즘

파이썬 깨지지않는 암호화 OTP(One-Time-Pad) XOR 이용한 암호화 및 복호화

polarcompass 2021. 1. 30. 18:30
728x90

암호화 전체 코드는 아래와 같다.

from secrets import token_bytes
from typing import Tuple

def random_key( length: int ) -> int:
    # length 만큼 임의의 바이트를 생성한다.
    tb: bytes = token_bytes(length) # token_byte() 메서드 사용하여 pseudo-random 데이터 생성한다.
    # 바이트를 비트 문자열로 변환한 후 반환한다.
    return int.from_bytes(tb,"big")

# 암호화 과정 메소드
def encrypt( original: str ) -> Tuple[int, int]:
    original_bytes: bytes = original.encode() # 문자열을 encode() 메소드 사용하여 UTF-8 바이트 시퀀스로 변환한다.
    dummy: int = random_key(len(original_bytes))
    original_key: int = int.from_bytes(original_bytes, "big")
    encrypted: int = original_key ^ dummy # XOR
    return dummy, encrypted

# 복호화 과정 메소드
def decrypt( key1: int, key2: int) -> str:
    decrypted: int = key1 ^ key2 # XOR
    temp: bytes = decrypted.to_bytes((decrypted.bit_length() + 7) // 8, "big")
    return temp.decode() # decode() 메소드로 문자열로 반환한다.

if __name__ == '__main__':
    key1, key2 = encrypt("One-Time-Pad!")
    print (key1) # 17132409679249131172667847460591
    print(key2) # 11989342967608885754737531331278
    result: str = decrypt(key1, key2)
    print(result) # One-Time-Pad!

전체적인 그림은

더미 데이터를 만들고

암호화하고자 하는 글을 UTF-8 encode() 메소드를 사용하여 바이트 형식으로 만든 후 

더미 데이터 X 암호화 문장 을 XOR 논리형식으로 비트 단위 연산을 한다.

그러면 얻어지는것이 encrypt() 메소드를 통해 

(dummy, encrypted) 를 튜플 형식으로 반환 받게된다.

 

그 다음은 복호화 과정으로

반환받은 튜플을 key1, key2로하여 다시 XOR 비트 단위 연산을 하여 복호화 해주는 것이다.

그 이후에는 7을 더하고 8로 나누어 주어 바이트 형식으로 바꾸는 코드를 넣고

바이트 형식으로 바꾼것을 UTF-8 형식의 decode() 메소드를 통하여 다시 문자열로 바꿔 준다.

 

전체적인 그림은 이런 것이고 자세한 것은 코드를 보시면서 나름대로 해석하여 보시면 될것 이다.

728x90