일상 코딩
파이썬 깨지지않는 암호화 OTP(One-Time-Pad) XOR 이용한 암호화 및 복호화 본문
Python/고전 컴퓨터 알고리즘
파이썬 깨지지않는 암호화 OTP(One-Time-Pad) XOR 이용한 암호화 및 복호화
polarcompass 2021. 1. 30. 18:30728x90
암호화 전체 코드는 아래와 같다.
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
'Python > 고전 컴퓨터 알고리즘' 카테고리의 다른 글
[python/파이썬] 미로찾기: DFS 깊이 우선 탐색 알고리즘 방법 적용 (0) | 2022.04.19 |
---|---|
[python/파이썬] 코딩테스트에서 많이 나오는 X,S,G,* 이용한 미로 만들기 maze.py (0) | 2022.04.19 |
파이썬 압축 알고리즘 DNA 시퀀스를 이용한 압축 알고리즘 (0) | 2021.01.30 |
파이썬을 통한 라이프니츠 공식으로 파이 계산하기 (0) | 2021.01.24 |
피보나치 수열 알고리즘 in 파이썬 python 고전 컴퓨터 알고리즘 (0) | 2021.01.22 |