PYTHON/네트워크보안과 블록체인
[PYTHON] 비대칭 키 암호화
G허니
2024. 8. 11. 20:09
RSA(Rivest-Shamir-Adleman)는 비대칭 암호화 알고리즘으로, 공개키와 개인키를 사용하여 데이터를 안전하게 암호화하고 복호화하는 데 사용됩니다. RSA는 1977년에 MIT의 Ron Rivest, Adi Shamir, Leonard Adleman에 의해 개발되었습니다.
RSA의 주요 특징
- 비대칭 암호화: RSA는 두 개의 키를 사용합니다. 하나는 공개키(public key)로, 누구나 사용할 수 있으며 데이터를 암호화하는 데 사용됩니다. 다른 하나는 개인키(private key)로, 오직 소유자만 알고 있으며 암호화된 데이터를 복호화하는 데 사용됩니다.
- 보안성: RSA의 보안성은 큰 소수(prime number)의 곱을 기반으로 합니다. 현재 알고리즘으로는 소수를 인수분해하는 것이 매우 어려운 문제로 여겨지기 때문에 RSA는 안전하다고 평가됩니다.
- 키 길이: RSA의 보안성은 키 길이에 따라 달라집니다. 일반적으로 2048비트 이상의 키 길이가 권장됩니다.
from cryptography.hazmat.backends import default_backend
from cryptography.hazmat.primitives.asymmetric import rsa
from cryptography.hazmat.primitives import hashes
from cryptography.hazmat.primitives.asymmetric import padding
from cryptography.hazmat.primitives import serialization
import base64
from cryptography.fernet import Fernet
# 공개키와 개인키 로드
with open("public_key.pem", "rb") as key_file:
public_key = serialization.load_pem_public_key(key_file.read(), backend=default_backend())
with open("private_key.pem", "rb") as key_file:
private_key = serialization.load_pem_private_key(key_file.read(), password=None, backend=default_backend())
# 평문 입력
plain_text = input("평문 메시지를 입력하시오 : ")
# AES 키 생성
aes_key_original = Fernet.generate_key()
fernet = Fernet(aes_key_original)
# 평문을 AES로 암호화
enc_msg = fernet.encrypt(plain_text.encode())
# AES 키를 RSA 공개키로 암호화
enc_key = base64.b64encode(public_key.encrypt(
aes_key_original,
padding.OAEP(
mgf=padding.MGF1(algorithm=hashes.SHA256()),
algorithm=hashes.SHA256(),
label=None
)
)).decode()
### Receiver
# AES 키를 복호화
aes_key = private_key.decrypt(
base64.b64decode(enc_key),
padding.OAEP(
mgf=padding.MGF1(algorithm=hashes.SHA256()),
algorithm=hashes.SHA256(),
label=None
)
)
# AES 키로 암호문 복호화
decrypt_msg = fernet.decrypt(enc_msg).decode()
# 출력
print("평문 :", plain_text)
print("복호문 :", decrypt_msg)
- 키 로드: 공개키(public_key.pem)와 개인키(private_key.pem)를 파일에서 읽어옵니다. 이는 RSA 암호화 및 복호화에 사용됩니다.
- 평문 입력: 사용자로부터 평문 메시지를 입력받습니다.
- AES 키 생성: Fernet를 사용하여 AES 대칭키(aes_key_original)를 생성합니다. 이 키는 메시지를 암호화하는 데 사용됩니다.
- AES 암호화: 입력된 평문을 AES로 암호화하여 enc_msg에 저장합니다.
- RSA 공개키로 AES 키 암호화: AES 키를 RSA 공개키로 암호화하여 enc_key에 저장합니다. 이 과정에서는 OAEP(Optimal Asymmetric Encryption Padding) 패딩을 사용하여 보안을 강화합니다.
- AES 키 복호화: 수신자는 개인키를 사용하여 암호화된 AES 키(enc_key)를 복호화합니다.
- AES 복호화: 복호화된 AES 키를 사용하여 암호화된 메시지(enc_msg)를 복호화합니다.
- 출력: 원래 평문과 복호화된 메시지를 출력합니다.
깃허브