파이썬(Python) cryptography를 이용한 대칭키 암호화

cryptography 모듈

cryptography 모듈은 파이썬에서 암호화 관련 기능을 제공하는 모듈입니다. 대칭키 암호화와 비대칭키 암호화 방식을 모두 지원하며, Fernet을 이용한 암호화 방법도 제공합니다.

 

Fernet은 PyCryptodome과 같은 다른 암호화 모듈보다 사용하기 쉽고 직관적입니다. 이를 사용하면 암호화와 해독에 필요한 모든 작업을 수행할 수 있습니다. Fernet을 사용하면 안전하고 신뢰성 높은 암호화 키를 생성하고 이를 사용하여 데이터를 안전하게 보호할 수 있습니다. Fernet은 AES알고리즘의 CBC모드만을 지원하고 있으며 파이썬에서 쉽게 사용할 수 있는 강력한 암호화 모듈 중 하나입니다.

 

 

암호화 알고리즘

대칭키 암호화는 하나의 키로 암호화와 복호화를 수행하는 방식입니다. 암호화와 복호화에 같은 키를 사용하기 때문에 속도가 빠르고 간단합니다. 하지만 키를 공유해야하기 때문에 안전성에 취약할 수 있습니다. 

파이썬 cryptography 라이브러리에서는 대표적인 대칭키 암호화 알고리즘으로 AES, ChaCha20 등을 지원합니다. 

오늘 사용할 Fornet 알고리즘도 대칭키 암호화에 해당합니다.

 

비대칭키 암호화는 공개키와 개인키 2개의 키를 사용하여 암호화와 복호화를 수행하는 방식입니다.

공개키는 누구나 알 수 있지만 개인키는 소유자만 가지고 있기 때문에 안전합니다. 하지만 대칭키 암호화에 비해 속도가 느리기 때문에 대량의 데이터를 처리하는 경우에는 대칭키 암호화를 사용하는 것이 좋습니다. 파이썬 cryptography 라이브러리에서는 대표적인 비대칭키 암호화 알고리즘으로 RSA, DSA, ECDSA 등을 지원합니다.

 

 

Fernet 문자열 암호화

pip install cryptography

먼저 Fernet을 사용하기 위해서는 파이썬의 cryptography 모듈을 설치해야 합니다. 아래와 같이 pip 명령어를 사용하여 모듈을 설치할 수 있습니다.

 

from cryptography.fernet import Fernet

key = Fernet.generate_key() # 32바이트의 랜덤한 키 생성
f = Fernet(key)

message = "암호화할 메시지"
encrypted = f.encrypt(message.encode("utf-8")) # 메시지를 암호화
print(encrypted)

이제 Fernet을 사용하여 암호화와 복호화를 수행할 수 있습니다.

Fernet은 AES알고리즘을 사용하여 암호화를 수행하는데, AES알고리즘은 키의 길이가 16바이트(128비트)이거나 32바이트(256비트)여야 합니다.

 

Fernet에서는 32바이트의 키를 사용하는 것이 좋습니다. 위 예제에서는 Fernet.generate_key() 메서드를 사용하여 32바이트의 랜덤한 키를 생성한뒤 key 변수에 저장합니다. 이 키를 이용하여 Fernet 객체를 생성하고, encrypt() 메서드를 사용하여 문자열을 암호화합니다. 암호화된 결과는 바이트 형태로 encrypted 변수에 저장됩니다.

 

이후 print문을 통해서 암호화된 결과가 출력됩니다.

 

bonus +) generate_key()함수로 16바이트 키를 생성하는법 

더보기
from cryptography.fernet import Fernet

# 16바이트(128비트)의 랜덤 키 생성
key = Fernet.generate_key()[:16]

# 생성된 키 출력
print(key)

Fernet에서 generate_key() 함수는 암호화에 사용되는 랜덤 키를 생성합니다. 

기본적으로 이 함수는 32바이트(256비트)의 키를 생성합니다. 하지만, 만약 16바이트(128비트)의 키를 생성하고 싶다면, generate_key() 함수를 호출한 후에 반환된 32바이트의 키를 슬라이싱하여 16바이트만 사용하면 됩니다.

728x90

Fernet 문자열 복호화

decrypted = f.decrypt(encrypted).decode() # 암호화된 문자열을 복호화
print(decrypted)

위 코드에서는 Fernet 객체의 decrypt() 메서드를 사용하여 암호화된 문자열을 복호화합니다. 

이때 반드시 암호화한 대칭키(f)와 일치하여야지 정상적으로 암호문이 복호화됩니다.

 

 

복호화된 결과는 다시 문자열 형태로 반환됩니다. Fernet은 암호화와 복호화를 위한 다양한 메서드와 기능을 제공하고 있습니다. 더 자세한 내용은 cryptography 모듈의 공식 문서를 참고해주세요.

Top