안경잡이개발자

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
반응형