공개키와 개인키는 암호화 및 보안 시스템에서 중요한 요소입니다. 이들은 대칭 암호화 대신 비대칭 암호화를 사용하는 공개키 인프라(PKI)에서 사용됩니다. 이번 글에서는 Python에서 공개키와 개인키를 생성하고 관리하는 방법에 대해 살펴보겠습니다.
1. 공개키와 개인키의 개념
-
공개키(Public Key): 공개키는 다른 사람들이 암호를 암호화할 수 있는 키입니다. 이 키는 모든 사용자에게 공개됩니다. 암호를 보낼 때, 이 키를 사용하여 데이터를 암호화합니다.
-
개인키(Private Key): 개인키는 공개키와 짝을 이루는 비밀 키입니다. 개인키는 개인적으로 보호되어야 하며, 이를 사용하여 공개키로 암호화된 데이터를 복호화할 수 있습니다.
2. 공개키와 개인키 생성하기
Python에서 공개키와 개인키를 생성하기 위해서는 cryptography
라이브러리를 사용할 수 있습니다. 이 라이브러리는 다양한 암호화 관련 기능을 제공합니다.
다음은 cryptography
를 사용하여 공개키와 개인키를 생성하는 예제 코드입니다:
from cryptography.hazmat.backends import default_backend
from cryptography.hazmat.primitives.asymmetric import rsa
# Generate private key
private_key = rsa.generate_private_key(
public_exponent=65537,
key_size=2048,
backend=default_backend()
)
# Generate public key from private key
public_key = private_key.public_key()
위의 코드에서는 rsa.generate_private_key
함수를 사용하여 개인키를 생성하고, public_key
메서드를 호출하여 이를 기반으로 공개키를 생성합니다.
3. 공개키와 개인키 저장하기
공개키와 개인키는 향후 사용을 위해 안전하게 저장되어야 합니다. 일반적으로 공개키는 다른 사람들과 공유되므로 공개하기 쉽게 저장될 수 있습니다. 개인키는 반드시 안전하게 보호되어야 하며, 대부분의 경우 암호로 보호됩니다.
개인키를 저장하기 위해 다음의 코드를 사용할 수 있습니다:
from cryptography.hazmat.primitives import serialization
# Save private key to a file
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(pem)
공개키를 저장하기 위해서도 비슷한 방법을 사용할 수 있습니다:
# Save public key to a file
pem = public_key.public_bytes(
encoding=serialization.Encoding.PEM,
format=serialization.PublicFormat.SubjectPublicKeyInfo
)
with open('public_key.pem', 'wb') as f:
f.write(pem)
4. 저장된 공개키와 개인키 불러오기
앞에서 생성 및 저장한 공개키와 개인키를 다시 불러오려면 다음의 코드를 사용할 수 있습니다:
from cryptography.hazmat.backends import default_backend
from cryptography.hazmat.primitives import serialization
# Load private key from file
with open('private_key.pem', 'rb') as key_file:
private_key = serialization.load_pem_private_key(
key_file.read(),
password=None,
backend=default_backend()
)
# Load public key from file
with open('public_key.pem', 'rb') as key_file:
public_key = serialization.load_pem_public_key(
key_file.read(),
backend=default_backend()
)
위의 코드에서는 serialization.load_pem_private_key
함수를 사용하여 개인키를 불러오고, serialization.load_pem_public_key
함수를 사용하여 공개키를 불러옵니다.
5. 공개키와 개인키의 활용
Python에서 공개키와 개인키를 사용하여 암호화와 복호화를 수행할 수 있습니다.
from cryptography.hazmat.primitives import hashes
from cryptography.hazmat.primitives.asymmetric import padding
message = b"Hello, World!"
# Encrypt the message using the public key
encrypted_message = public_key.encrypt(
message,
padding.OAEP(
mgf=padding.MGF1(algorithm=hashes.SHA256()),
algorithm=hashes.SHA256(),
label=None
)
)
# Decrypt the message using the private key
decrypted_message = private_key.decrypt(
encrypted_message,
padding.OAEP(
mgf=padding.MGF1(algorithm=hashes.SHA256()),
algorithm=hashes.SHA256(),
label=None
)
)
print(decrypted_message.decode())
위의 코드에서는 공개키로 메시지를 암호화한 후 개인키로 다시 복호화하는 예제입니다.
결론
Python에서 공개키와 개인키를 생성하고 관리하는 방법에 대해 알아보았습니다. 이러한 암호화 기법은 네트워크 통신 및 데이터 보호와 같은 보안 요구사항을 충족하는 데 매우 유용합니다. 공개키와 개인키의 생성과 저장, 그리고 활용에 대해 잘 이해하면 안전하고 신뢰할 수 있는 시스템을 개발할 수 있습니다.