[파이썬] 공개키와 개인키 생성 및 관리 방법

공개키와 개인키는 암호화 및 보안 시스템에서 중요한 요소입니다. 이들은 대칭 암호화 대신 비대칭 암호화를 사용하는 공개키 인프라(PKI)에서 사용됩니다. 이번 글에서는 Python에서 공개키와 개인키를 생성하고 관리하는 방법에 대해 살펴보겠습니다.

1. 공개키와 개인키의 개념

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에서 공개키와 개인키를 생성하고 관리하는 방법에 대해 알아보았습니다. 이러한 암호화 기법은 네트워크 통신 및 데이터 보호와 같은 보안 요구사항을 충족하는 데 매우 유용합니다. 공개키와 개인키의 생성과 저장, 그리고 활용에 대해 잘 이해하면 안전하고 신뢰할 수 있는 시스템을 개발할 수 있습니다.