Computer >> 컴퓨터 >  >> 프로그래밍 >> Python

Python에서 cryptography 라이브러리로 데이터를 암호화하고 복호화하는 방법

이 튜토리얼에서는 Python의 cryptography 라이브러리를 사용하여 문자열과 같은 데이터를 암호화하고 복호화하는 방법을 알아봅니다.

암호화(Encryption)는 정보를 인가된 당사자만 접근할 수 있도록 인코딩하는 과정입니다. 이를 통해 아무나 열람하거나 접근해서는 안 되는 데이터를 안전하게 보호할 수 있습니다.

대칭 키 암호화란?

이 예제에서는 대칭 키 암호화(symmetric encryption) 방식을 사용합니다. 대칭 키 암호화는 데이터를 암호화할 때 사용한 동일한 키로 복호화도 가능한 방식을 의미합니다.

여기서 사용하는 cryptography 라이브러리는 AES 알고리즘을 기반으로 구축되어 있으며, Fernet 클래스를 통해 손쉽게 활용할 수 있습니다.

Python에서 데이터 암호화하기

1. 라이브러리 설치

먼저 cryptography 라이브러리를 설치합니다:

pip3 install cryptography

다음으로 cryptography 라이브러리에서 Fernet을 임포트하고 키(key)를 생성합니다. 이 키는 대칭 방식의 암호화 및 복호화에 반드시 필요합니다.

2. 키 생성하기

generate_key() 메서드를 호출하여 키를 생성합니다:

from cryptography.fernet import Fernet

def generate_key():
    """
    키를 생성하고 파일로 저장합니다.
    """
    key = Fernet.generate_key()
    with open("secret.key", "wb") as key_file:
        key_file.write(key)

키 생성은 위 메서드를 딱 한 번만 실행하면 됩니다.

주의: 생성된 키는 반드시 안전한 곳에 보관해야 합니다. 키를 분실하면 해당 키로 암호화된 데이터를 더 이상 복호화할 수 없습니다.

3. 키 불러오기

키를 생성했다면, 데이터를 암호화하기 위해 코드에서 해당 키를 불러와야 합니다:

def load_key():
    """
    현재 디렉터리에서 `secret.key` 파일을 읽어 반환합니다.
    """
    return open("secret.key", "rb").read()

4. 메시지 암호화하기

이제 메시지를 암호화할 준비가 되었습니다. 암호화는 다음 세 단계로 진행됩니다:

  • 1단계 – 메시지를 인코딩(bytes)합니다.
  • 2단계 – Fernet 클래스를 초기화합니다.
  • 3단계 – 인코딩된 메시지를 encrypt() 메서드에 전달합니다.

메시지 인코딩:

message = "message I want to encrypt".encode()

Fernet 클래스 초기화:

f = Fernet(key)

메시지 암호화:

encrypted_message = f.encrypt(message)

전체 코드 예제

다음은 Python에서 메시지를 암호화하는 완전히 동작하는 전체 예제입니다:

from cryptography.fernet import Fernet

def generate_key():
    """
    키를 생성하고 파일로 저장합니다.
    """
    key = Fernet.generate_key()
    with open("secret.key", "wb") as key_file:
        key_file.write(key)

def load_key():
    """
    이전에 생성한 키를 불러옵니다.
    """
    return open("secret.key", "rb").read()

def encrypt_message(message):
    """
    메시지를 암호화합니다.
    """
    key = load_key()
    encoded_message = message.encode()
    f = Fernet(key)
    encrypted_message = f.encrypt(encoded_message)

    print(encrypted_message)

if __name__ == "__main__":
    encrypt_message("encrypt this message")

실행 결과:

b'gAAAAABesCUIAcM8M-_Ik_-I1-JD0AzLZU8A8-AJITYCp9Mc33JaHMnYmRedtwC8LLcYk9zpTqYSaDaqFUgfz-tcHZ2TQjAgKKnIWJ2ae9GDoea6tw8XeJ4='

Python에서 데이터 복호화하기

메시지를 복호화하려면 Fernet 라이브러리의 decrypt() 메서드를 호출하면 됩니다. 단, 복호화에도 키가 필요하므로 마찬가지로 키를 먼저 불러와야 한다는 점을 기억하세요.

from cryptography.fernet import Fernet

def load_key():
    """
    이전에 생성한 키를 불러옵니다.
    """
    return open("secret.key", "rb").read()

def decrypt_message(encrypted_message):
    """
    암호화된 메시지를 복호화합니다.
    """
    key = load_key()
    f = Fernet(key)
    decrypted_message = f.decrypt(encrypted_message)

    print(decrypted_message.decode())

if __name__ == "__main__":
    decrypt_message(b'gAAAAABesCUIAcM8M-_Ik_-I1-JD0AzLZU8A8-AJITYCp9Mc33JaHMnYmRedtwC8LLcYk9zpTqYSaDaqFUgfz-tcHZ2TQjAgKKnIWJ2ae9GDoea6tw8XeJ4=')

실행 결과:

encrypt this message

마무리

이처럼 Python의 cryptography 라이브러리와 Fernet 클래스를 활용하면 몇 줄의 코드만으로도 AES 기반의 강력한 대칭 키 암호화를 손쉽게 구현할 수 있습니다. 핵심은 키를 안전하게 보관하는 것이며, 키가 유출되거나 분실되지 않도록 관리하는 것이 무엇보다 중요합니다.