파이썬으로 RSA 공개키 암호화 구현하기

암호학에서 RSA 알고리즘은 공개키 암호화 방식 중 가장 일반적으로 사용되는 알고리즘입니다. 파이썬을 사용하여 간단한 RSA 공개키 암호화를 구현하는 방법을 알아보도록 하겠습니다.

RSA 알고리즘 개요

RSA 알고리즘은 공개키와 개인키를 사용하여 데이터를 암호화하고 복호화하는 방식입니다. 암호화할 데이터를 공개키로 암호화하면, 개인키로만 복호화할 수 있으며, 개인키로 데이터를 암호화하면 공개키로만 복호화할 수 있습니다.

필요한 패키지 설치

RSA 알고리즘을 구현하기 위해 cryptography 패키지를 설치해야합니다. 아래의 명령어를 사용하여 패키지를 설치할 수 있습니다.

pip install cryptography

RSA 키 생성

RSA 알고리즘을 사용하기 위해 공개키와 개인키를 생성해야합니다. 아래의 코드를 사용하여 RSA 키 쌍을 생성할 수 있습니다.

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()

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

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

위의 코드는 2048비트 RSA 키 쌍을 생성하여 개인키와 공개키를 PEM 형식으로 저장합니다. 개인키는 private_key.pem 파일에, 공개키는 public_key.pem 파일에 저장됩니다.

데이터 암호화 및 복호화

RSA 키를 생성한 후에는 데이터를 암호화하고 복호화할 수 있습니다. 아래의 코드를 사용하여 데이터를 암호화 및 복호화할 수 있습니다.

from cryptography.hazmat.primitives.asymmetric import padding

# 공개키로 데이터 암호화
with open('public_key.pem', 'rb') as f:
    public_key = serialization.load_pem_public_key(
        f.read(),
        backend=default_backend()
    )

message = b"Hello, RSA!"

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

# 암호화된 데이터 출력
print(cipher)

# 개인키로 데이터 복호화
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(
    cipher,
    padding.OAEP(
        mgf=padding.MGF1(algorithm=hashes.SHA256()),
        algorithm=hashes.SHA256(),
        label=None
    )
)

# 복호화된 데이터 출력
print(decrypted_message)

위의 코드에서는 public_key.pem 파일에서 공개키를 로드하여 데이터를 암호화하고, private_key.pem 파일에서 개인키를 로드하여 데이터를 복호화합니다.

이제 파이썬을 사용하여 간단한 RSA 공개키 암호화를 구현할 수 있게 되었습니다.

참고 자료