원타임 패드(One-time Pad) 암호 시스템 파이썬(Python) 구현
기타2021. 1. 29. 19:30
728x90
반응형
원타임 패드(One-time Pad) 암호 시스템은 간단하면서도 강력한 암호 시스템이다. 메시지를 주고 받는 두 개체가 동일한 패드(pad)를 공유하고 있다면 중간에서 암호화된 메시지를 가로채도 복호화할 수 없다. 여기에서 중요한 점은 평문과 키의 길이는 같다는 것이다. 평문이 256 bits이라면, 키 또한 256 bits이다.
암호화 및 복호화에 사용되는 공식은 다음과 같다.
(평문 XOR 키) XOR 키 = 평문
파이썬으로 간단히 구현한 것은 다음과 같다. 아래 예시에 등장한 모든 키(key)와 평문(message)의 길이는 256 bits이다.
from binascii import hexlify
import random
letters = '0123456789ABCDEF'
def xor(a, b):
length = len(a)
result = []
for i in range(length):
now = int(a[i], 16) ^ int(b[i], 16) # letter -> hex -> xor
result.append(letters[now])
return result
print("---------- 데이터 생성 및 XOR 연산 테스트 ----------");
a = [random.choice(letters) for i in range(64)] # 256 bits
b = [random.choice(letters) for i in range(64)] # 256 bits
print(f"A = 0x{''.join(a)}") # A 출력
print(f"B = 0x{''.join(b)}") # B 출력
print(f"A xor B = 0x{''.join(xor(a, b))}") # A xor B 출력
# 암호화 함수
def encrypt(message, key):
encrypted_message = xor(message, key)
return encrypted_message
# 복호화 함수
def decrypt(encrypted_message, key):
message = xor(encrypted_message, key)
return message
print("---------- 사용 예시 1 ----------");
key = [random.choice(letters) for i in range(64)] # 256 bits
message = [random.choice(letters) for i in range(64)] # 256 bits
encrypted_message = encrypt(message, key)
decrypted_message = decrypt(encrypted_message, key)
print(f"Key = 0x{''.join(key)}") # Key 출력
print(f"Message = 0x{''.join(message)}") # Message 출력
print(f"Encrypted Message = 0x{''.join(encrypted_message)}") # 암호화 결과 출력
print(f"Decrypted Message = 0x{''.join(decrypted_message)}") # 복호화 결과 출력
print("---------- 사용 예시 2 ----------");
message = "HELLO APPLE BANANA CARROT DURIAN"
print("문자열 메시지:", message)
message = message.encode()
message = hexlify(message).decode().upper()
encrypted_message = encrypt(message, key)
decrypted_message = decrypt(encrypted_message, key)
print(f"Key = 0x{''.join(key)}") # Key 출력
print(f"Message = 0x{''.join(message)}") # Message 출력
print(f"Encrypted Message = 0x{''.join(encrypted_message)}") # 암호화 결과 출력
print(f"Decrypted Message = 0x{''.join(decrypted_message)}") # 복호화 결과 출력
result = bytearray.fromhex(''.join(decrypted_message)).decode()
print("복호화된 문자열 메시지:", result)
실행 결과는 다음과 같다.
참고로 원타임 패드 암호 시스템은 두 개체가 서로 동일한 패드(pad)를 공유하고 있어야 한다는 점에서 현실적으로 적용하기에 어려운 점이 있다. 그리고 평문과 키의 길이가 동일해야 한다는 특징을 기억할 필요가 있다.
728x90
반응형
'기타' 카테고리의 다른 글
우분투(Ubuntu) 커널(Kernel) 소스코드 수정 및 빌드하는 방법 (0) | 2021.02.01 |
---|---|
디스크 Identifier 변경 방법 + 두 개의 저장장치가 동일한 Disk Identifier (UUID) 값을 가질 때의 문제점 (4) | 2021.02.01 |
내 컴퓨터의 윈도우(Windows) 운영체제 버전 확인하는 방법 (0) | 2021.01.27 |
[어도비 프로그램 한 번에 삭제하기] 어도비 클리너(Adobe Cleaner) 설치 및 사용 방법 (feat. Adobe Creative Cloud Cleaner) (0) | 2021.01.27 |
노트북에 물 흘렸을 때 대처 방법 + 물 흘려서 메인보드 망가진 경험 (0) | 2021.01.26 |