[파이썬] 대칭키 암호화와 비대칭키 암호화의 개념

정보 보안은 현대 사회에서 매우 중요한 문제입니다. 개인정보, 금융 데이터, 국가 비밀 등 많은 종류의 데이터가 인터넷을 통해 주고받아지는데, 이를 안전하게 보호하기 위해 암호화 기술이 사용됩니다. 암호화 기술은 데이터를 암호화하여 해독할 수 있는 사람이 제한적이 되도록 합니다.

암호화 기술에는 대칭키 암호화와 비대칭키 암호화 두 가지 주요한 개념이 있습니다. 이 두 가지 방식에 대해 알아보도록 하겠습니다.

대칭키 암호화 (Symmetric-key encryption)

대칭키 암호화는 암호화와 복호화에 동일한 키를 사용하는 방식입니다. 즉, 데이터를 암호화할 때 사용한 키와 데이터를 해독하기 위해 사용되는 키가 동일합니다. 대칭키 암호화는 단순하고 빠르지만, 키를 안전하게 공유해야 한다는 단점이 있습니다.

import cryptography
from cryptography.fernet import Fernet

# 키 생성
key = Fernet.generate_key()

# 암호화 객체 생성
cipher_suite = Fernet(key)

# 데이터 암호화
data = b"Hello World"
encrypted_data = cipher_suite.encrypt(data)

# 데이터 복호화
decrypted_data = cipher_suite.decrypt(encrypted_data)

print("Original data:", data)
print("Encrypted data:", encrypted_data)
print("Decrypted data:", decrypted_data)

위의 예제 코드에서는 Python의 cryptography 라이브러리를 사용하여 대칭키 암호화를 구현하였습니다. Fernet 클래스는 대칭키를 생성하고, 암호화 및 복호화를 처리하는데 사용됩니다.

비대칭키 암호화 (Asymmetric-key encryption)

비대칭키 암호화는 암호화와 복호화에 서로 다른 키를 사용하는 방식입니다. 암호화할 때 사용하는 키를 공개키(public key)라고 하며, 복호화할 때 사용하는 키를 개인키(private key)라고 합니다. 이러한 방식은 대칭키 암호화보다 안전하나 처리 속도가 느리다는 단점이 있습니다.

from cryptography.hazmat.primitives import serialization, hashes
from cryptography.hazmat.primitives.asymmetric import rsa, padding

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

# 공개키 생성
public_key = private_key.public_key()

# 텍스트 데이터 암호화
message = b"Hello World"
encrypted_data = public_key.encrypt(
    message,
    padding.OAEP(
        mgf=padding.MGF1(algorithm=hashes.SHA256()),
        algorithm=hashes.SHA256(),
        label=None
    )
)

# 텍스트 데이터 복호화
decrypted_data = private_key.decrypt(
    encrypted_data,
    padding.OAEP(
        mgf=padding.MGF1(algorithm=hashes.SHA256()),
        algorithm=hashes.SHA256(),
        label=None
    )
)

print("Original data:", message)
print("Encrypted data:", encrypted_data)
print("Decrypted data:", decrypted_data)

위의 예제 코드에서는 cryptography 라이브러리의 rsa 모듈을 사용하여 비대칭키 암호화를 구현하였습니다. generate_private_key() 함수를 사용하여 개인키와 공개키를 생성하고, encrypt()decrypt() 메서드를 사용하여 데이터를 암호화 및 복호화합니다.

결론

대칭키 암호화와 비대칭키 암호화는 데이터 보안을 위해 사용되는 중요한 기술입니다. 대칭키 암호화는 간단하고 빠르지만, 키를 안전하게 공유해야 하는 단점이 있습니다. 반면 비대칭키 암호화는 대칭키 암호화보다 안전하지만 처리 속도가 느리다는 단점이 있습니다. 암호화 기술을 사용할 때는 데이터의 중요성에 따라 적절한 방식을 선택해야 합니다.