[Python3] RSA

Alexandria·2024년 3월 3일

Python3 Advanced

목록 보기
8/27
post-thumbnail

1. 비대칭키

키의 길이가 2048인 비대칭 키를 생성합니다.

from Cryptodome.PublicKey import RSA # pip3 install pycryptodomex

rsa_key     = RSA.generate(bits=2048)
private_key = rsa_key.export_key()
public_key   = rsa_key.public_key().export_key()

print(private_key)
print(public_key)

기본적으로 PKCS#1 방식의 키 문자열이 반환됩니다. 즉, 파일로 저장이 가능합니다.

이번에는 개인키를 암호화한 후 파일로 저장해 봅니다.

from Cryptodome.PublicKey import RSA # pip3 install pycryptodomex

rsa_key     = RSA.generate(bits=2048)
private_key = rsa_key.export_key(passphrase="Secret Password", pkcs=8, protection="scryptAndAES256-CBC")
public_key  = rsa_key.public_key().export_key()

with open('private.pem', 'wb') as fp:
    fp.write(private_key)

2. 암호화

저장된 개인키로부터 공개키를 추출한 뒤 이를 이용해 데이터를 암호화해 봅니다.

RSA는 비대칭 키이기 때문에 암호화 후 데이터의 길이가 길어집니다. 그렇기 때문에 데이터를 암호화 시 대칭키를 사용하고, 대칭키를 암호화할 때 비대칭 키를 사용합니다.

from Cryptodome.PublicKey import RSA # pip3 install pycryptodomex
from Cryptodome.Cipher import PKCS1_OAEP

rsa_key     = RSA.import_key(extern_key=open('private.pem', 'rb').read(), passphrase='Secret Password')
cipher      = PKCS1_OAEP.new(rsa_key.public_key())
cipher_text = cipher.encrypt(b'Hello World')
with open('cipher.txt', 'wb') as fp:
    fp.write(cipher_text)
    print(cipher_text)

3. 복호화

공개키로 암호화 시 복호화개인키로 수행해야 합니다. 개인키로 암호화하고 공개키로 복호화 하는 방법은 허용되지 않습니다.

from Cryptodome.PublicKey import RSA # pip3 install pycryptodomex
from Cryptodome.Cipher import PKCS1_OAEP

rsa_key     = RSA.import_key(extern_key=open('private.pem', 'rb').read(), passphrase='Secret Password')
cipher      = PKCS1_OAEP.new(rsa_key)
with open('cipher.txt', 'rb') as fp:
    plain_text  = cipher.decrypt(fp.read()).decode()
    print(plain_text)
profile
IT 도서관

0개의 댓글