IT/Python

[Python] 파이썬을 이용한 암호화 및 복호화 기법 학습하기

멋진 선배 2025. 1. 18. 15:45
반응형

안녕하세요. 파이썬을 이용한 암호화와 복호화 기법에 대해 알아보려고 해요. 정보 보안이 중요해지는 요즘, 이 기술을 이해하고 활용하는 것은 정말 중요하답니다. 자~! 그럼 시작해보도록 하겠습니다.

암호화와 복호화란?

먼저, 암호화와 복호화가 무엇인지 간단히 설명드릴게요.

  1. 암호화 : 정보를 읽을 수 없는 형태로 변화하는 과정
  2. 복호화 : 암호화된 정보를 다시 원래 형태로 되돌리는 과정

이 두 과정을 통해 우리는 중요한 저보를 안전하게 보호하고 전송할 수 있어요.

파이썬으로 시작하는 암호화/복호화

파이썬은 암호화와 복호화를 구현하기에 아주 좋은 언어예요. 다양한 라이브러리를 제공하고 있어 초보자도 쉽게 시작할 수 있답니다.

1.간단한 대칭키 암호화 : Caeser Cipher

가장 간단한 암호화 방식 중 하나인 Casear Cipher부터 시작해볼까요?

실행 겨로가

def encrypt(text, shift):
    result = ""
    for char in text:
        if char.isalpha():
            ascii_offset = 65 if char.isupper() else 97
            result += chr((ord(char) - ascii_offset + shift) % 26 + ascii_offset)
        else:
            result += char
    return result

def decrypt(text, shift):
    return encrypt(text, -shift)

# 사용 예시
message = "Hello, World!"
shift = 3
encrypted = encrypt(message, shift)
decrypted = decrypt(encrypted, shift)

print(f"원본 메시지: {message}")
print(f"암호화된 메시지: {encrypted}")
print(f"복호화된 메시지: {decrypted}")

이 코드는 각 문자를 지정된 수만큼 알파벳 순서를 밀어서 암호화해요. 간단하지만 암호화의 기본 개념을 이해하기 좋답니다.

2.더 안전한 암호화 : AES(Advanced Encryption Standard)

실제 어플리케이션에서는 더 강력한 암호화 방식이 필요해요. AES는 현대적이고 안전한 암호화 알고리즘 중 하나랍니다.

from cryptography.fernet import Fernet

def generate_key():
    return Fernet.generate_key()

def encrypt_message(message, key):
    f = Fernet(key)
    return f.encrypt(message.encode())

def decrypt_message(encrypted_message, key):
    f = Fernet(key)
    return f.decrypt(encrypted_message).decode()

# 사용 예시
key = generate_key()
message = "This is a secret message"
encrypted = encrypt_message(message, key)
decrypted = decrypt_message(encrypted, key)

print(f"원본 메시지: {message}")
print(f"암호화된 메시지: {encrypted}")
print(f"복호화된 메시지: {decrypted}")

이 코드는 'cryptography' 라이브러리의 Fernet 클래스를 사용해요. Fernet은 AES 알고리즘을 기반으로 한 안전한 대칭 암호화를 제공합니다. 

3.공개키 암호화 : RSA

대칭키 암호화와 달리, 공개키 암호화는 암호화와 복호화에 서로 다른 키를 사용해요. RSA는 가장 널리 사용되는 공개키 암호화 알고리즘 중 하나랍니다.

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

def generate_key_pair():
    private_key = rsa.generate_private_key(
        public_exponent=65537,
        key_size=2048
    )
    public_key = private_key.public_key()
    return private_key, public_key

def encrypt_message(message, public_key):
    encrypted = public_key.encrypt(
        message.encode(),
        padding.OAEP(
            mgf=padding.MGF1(algorithm=hashes.SHA256()),
            algorithm=hashes.SHA256(),
            label=None
        )
    )
    return encrypted

def decrypt_message(encrypted_message, private_key):
    decrypted = private_key.decrypt(
        encrypted_message,
        padding.OAEP(
            mgf=padding.MGF1(algorithm=hashes.SHA256()),
            algorithm=hashes.SHA256(),
            label=None
        )
    )
    return decrypted.decode()

# 사용 예시
private_key, public_key = generate_key_pair()
message = "This is a secret message for RSA"
encrypted = encrypt_message(message, public_key)
decrypted = decrypt_message(encrypted, private_key)

print(f"원본 메시지: {message}")
print(f"암호화된 메시지: {encrypted}")
print(f"복호화된 메시지: {decrypted}")

이 코드는 RSA 알고리즘을 사용하여 공개키와 개인키를 생성하고, 이를 이용해 메세지를 암호화하고 복호화해요.

암호화 시 주의할 점

암호화를 구현할 때는 몇 가지 주의해야 할 점이 있어요.

  1. 키 관리 : 암호화 키를 안전하게 보관하는 것이 매우 중요해요. 키가 노출되면 암호화의 의미가 없어지닌깐요.
  2. 안전한 알고리즘 선택 : Caesar Cipher와 같은 단순한 알고리즘은 학습용으론 좋지만, 실제 사용에는 적합하지 않아요.  AES나 RSA와 같은 검증된 알고리즘을 사용하세요.
  3. 랜덤성 확보 : 암호화에 사용되는 난수는 정말 무작위여야 해요. 파이썬의 기본 random 모듈 대신 'os.urandom()'이나 'secrets'모듈을 사용하는 것이 좋답니다.
  4. 패딩: 블록 암호화 알고리즘을 사용할 때는 적절한 패딩을 사용해야 해요. PKCS7 같은 표준 패딩 방식을 사용하세요.

마치며

지금까지 파이썬을 이용한 암호화와 복호화 기법에 대해 알아보았어요. 간단한 Caesar Cipher부터 현대적인 AES, RSA 알고리즘까지 다양한 방식을 살펴보았죠.

 

암호화는 정보 보안의 기본이에요. 하지만 올바르게 사용하지 않으면 오히려 위험할 수 있어요. 항상 최신의 보안 권장사항을 따르고, 가능하다면 검증된 라이브러리를 사용하는 것이 좋답니다.

 

여러분도 이제 파이썬으로 기본적인 암호화와 복호화를 구현할 수 있게 되었어요. 더 깊이 공부하고 싶다면, 암호학의 기본 원리와 다양한 알고리즘에 대해 학습해보는 것은 어떨까요?

 

암호화의 세계는 정말 흥미진진하답니다. 여러분의 코딩 여정에 이 지식이 도움이 되길 바라요. 안전한 코딩하세요!

 

반응형