파이썬으로 비대칭 키 암호화 구현하기 - 공개키 서명 및 인증

비대칭 키 암호화는 암호화와 복호화에 서로 다른 키를 사용하는 암호화 방식입니다. 이 방식은 공개키와 개인키를 사용하여 데이터를 암호화하고 복호화할 수 있습니다. 이번 튜토리얼에서는 파이썬을 사용하여 공개키 서명 및 인증을 구현하는 방법에 대해 알아보겠습니다.

1. 비대칭 키 생성

비대칭 키 암호화를 사용하기 위해 먼저 공개키와 개인키를 생성해야 합니다. 파이썬에서는 cryptography 라이브러리를 사용하여 키를 생성할 수 있습니다. 아래는 비대칭 키 생성 코드의 예시입니다.

from cryptography.hazmat.primitives.asymmetric import rsa
from cryptography.hazmat.primitives import serialization

# 키 쌍 생성
private_key = rsa.generate_private_key(
    public_exponent=65537,
    key_size=2048,
)
public_key = private_key.public_key()

# 개인키 저장
with open("private_key.pem", "wb") as f:
    f.write(private_key.private_bytes(
        encoding=serialization.Encoding.PEM,
        format=serialization.PrivateFormat.PKCS8,
        encryption_algorithm=serialization.NoEncryption(),
    ))

# 공개키 저장
with open("public_key.pem", "wb") as f:
    f.write(public_key.public_bytes(
        encoding=serialization.Encoding.PEM,
        format=serialization.PublicFormat.SubjectPublicKeyInfo,
    ))

위의 코드에서는 rsa.generate_private_key() 함수를 사용하여 개인키를 생성한 후, 이를 이용하여 공개키를 추출합니다. 그리고 개인키와 공개키를 각각 private_key.pempublic_key.pem 파일로 저장합니다.

2. 메시지 암호화

비대칭 키 암호화에서는 공개키로 메시지를 암호화하고, 개인키로 암호문을 복호화할 수 있습니다. 아래는 파이썬을 사용하여 메시지를 암호화하는 코드의 예시입니다.

from cryptography.hazmat.primitives.asymmetric import padding

# 메시지 암호화
message = b"Hello, World!"
with open("public_key.pem", "rb") as f:
    public_key = serialization.load_pem_public_key(
        f.read(),
        backend=default_backend(),
    )

ciphertext = public_key.encrypt(
    message,
    padding.OAEP(
        mgf=padding.MGF1(algorithm=hashes.SHA256()),
        algorithm=hashes.SHA256(),
        label=None
    )
)

print(ciphertext)

위의 코드에서는 serialization.load_pem_public_key() 함수를 사용하여 저장된 공개키를 로드합니다. 그리고 public_key.encrypt() 함수를 사용하여 메시지를 암호화합니다. 암호문은 ciphertext 변수에 저장되며, 출력할 수 있습니다.

3. 암호문 복호화

암호문을 복호화하기 위해서는 개인키가 필요합니다. 아래는 파이썬을 사용하여 암호문을 복호화하는 코드의 예시입니다.

from cryptography.hazmat.primitives.asymmetric import padding

# 암호문 복호화
with open("private_key.pem", "rb") as f:
    private_key = serialization.load_pem_private_key(
        f.read(),
        password=None,
        backend=default_backend(),
    )

decrypted_message = private_key.decrypt(
    ciphertext,
    padding.OAEP(
        mgf=padding.MGF1(algorithm=hashes.SHA256()),
        algorithm=hashes.SHA256(),
        label=None
    )
)

print(decrypted_message)

위의 코드에서는 serialization.load_pem_private_key() 함수를 사용하여 저장된 개인키를 로드합니다. 그리고 private_key.decrypt() 함수를 사용하여 암호문을 복호화합니다. 복호화된 메시지는 decrypted_message 변수에 저장되며, 출력할 수 있습니다.

마무리

이번 튜토리얼에서는 파이썬을 사용하여 비대칭 키 암호화의 한 종류인 공개키 서명 및 인증을 구현하는 방법에 대해 알아보았습니다. 비대칭 키 암호화는 보안성이 높은 암호화 방식으로, 암호화와 복호화에 서로 다른 키를 사용하기 때문에 안전한 데이터 전송에 활용될 수 있습니다.