비대칭 키 암호화는 암호화와 복호화에 서로 다른 키를 사용하는 암호화 방식입니다. 이 방식은 공개키와 개인키를 사용하여 데이터를 암호화하고 복호화할 수 있습니다. 이번 튜토리얼에서는 파이썬을 사용하여 공개키 서명 및 인증을 구현하는 방법에 대해 알아보겠습니다.
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.pem
과 public_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
변수에 저장되며, 출력할 수 있습니다.
마무리
이번 튜토리얼에서는 파이썬을 사용하여 비대칭 키 암호화의 한 종류인 공개키 서명 및 인증을 구현하는 방법에 대해 알아보았습니다. 비대칭 키 암호화는 보안성이 높은 암호화 방식으로, 암호화와 복호화에 서로 다른 키를 사용하기 때문에 안전한 데이터 전송에 활용될 수 있습니다.