암호화(Cryptography)는 데이터를 안전하게 보호하기 위해 정보를 인코딩하는 과정입니다. 이를 통해 민감한 데이터를 저장하거나 전송할 때 무단 접근을 방지할 수 있습니다. 암호화는 다양한 응용 분야에서 사용되며, 파이썬은 암호화를 수행하기 위한 다양한 라이브러리를 제공합니다. 이번 글에서는 파이썬을 사용하여 암호화의 기초 개념을 배우고, 간단한 암호화 및 복호화 작업을 수행하는 방법을 알아보겠습니다.

1. 암호화의 기본 개념

암호화는 데이터를 읽을 수 없는 형태로 변환하는 과정입니다. 암호화된 데이터를 해독하려면 올바른 키가 필요합니다. 암호화는 크게 두 가지로 분류할 수 있습니다:

  • 대칭키 암호화(Symmetric Key Encryption): 암호화와 복호화에 동일한 키를 사용하는 방식입니다. AES, DES 등이 대표적인 대칭키 알고리즘입니다.
  • 비대칭키 암호화(Asymmetric Key Encryption): 공개키와 개인키라는 두 개의 키를 사용하는 방식입니다. 공개키로 암호화된 데이터는 개인키로만 복호화할 수 있습니다. RSA, ECC 등이 대표적인 비대칭키 알고리즘입니다.

2. 파이썬의 암호화 라이브러리

파이썬은 다양한 암호화 라이브러리를 제공하며, 대표적으로 cryptography, PyCryptodome, hashlib 등이 있습니다. 이 글에서는 cryptography 라이브러리를 사용하여 대칭키 암호화와 비대칭키 암호화를 구현해보겠습니다.

2.1. Cryptography 라이브러리 설치

cryptography 라이브러리는 암호화 작업을 쉽게 수행할 수 있는 파이썬 라이브러리입니다. pip 명령어를 사용하여 설치할 수 있습니다.

pip install cryptography

3. 대칭키 암호화

먼저 대칭키 암호화의 대표적인 알고리즘인 AES(Advanced Encryption Standard)를 사용하여 데이터를 암호화하고 복호화하는 방법을 알아보겠습니다.

3.1. AES 암호화

from cryptography.hazmat.primitives.ciphers import Cipher, algorithms, modes
from cryptography.hazmat.primitives import padding
from cryptography.hazmat.backends import default_backend
import os

# 대칭키 생성
key = os.urandom(32)  # 256비트 키 생성
iv = os.urandom(16)  # 초기화 벡터(IV) 생성

# 암호화할 데이터
data = b"Secret Message"

# 데이터 패딩 (AES는 블록 크기가 128비트이므로 데이터 크기를 맞춰야 함)
padder = padding.PKCS7(algorithms.AES.block_size).padder()
padded_data = padder.update(data) + padder.finalize()

# AES 암호화
cipher = Cipher(algorithms.AES(key), modes.CBC(iv), backend=default_backend())
encryptor = cipher.encryptor()
encrypted_data = encryptor.update(padded_data) + encryptor.finalize()

print("Encrypted data:", encrypted_data)

3.1.1. 코드 설명

  • 대칭키 및 IV 생성: os.urandom()을 사용하여 32바이트(256비트) 키와 16바이트 IV를 생성합니다.
  • 데이터 패딩: AES는 블록 암호이므로, 데이터의 길이가 블록 크기의 배수여야 합니다. PKCS7 패딩을 사용하여 데이터의 길이를 조정합니다.
  • AES 암호화: 생성한 키와 IV를 사용하여 데이터를 암호화합니다. CBC(Cipher Block Chaining) 모드를 사용하여 암호화합니다.

3.2. AES 복호화

암호화된 데이터를 복호화하여 원래의 메시지를 복원합니다.

# AES 복호화
decryptor = cipher.decryptor()
decrypted_data = decryptor.update(encrypted_data) + decryptor.finalize()

# 패딩 제거
unpadder = padding.PKCS7(algorithms.AES.block_size).unpadder()
unpadded_data = unpadder.update(decrypted_data) + unpadder.finalize()

print("Decrypted data:", unpadded_data)

3.2.1. 코드 설명

  • AES 복호화: 암호화와 동일한 키와 IV를 사용하여 데이터를 복호화합니다.
  • 패딩 제거: 복호화된 데이터에서 PKCS7 패딩을 제거하여 원래의 메시지를 복원합니다.

4. 비대칭키 암호화

이제 비대칭키 암호화의 대표적인 알고리즘인 RSA(Rivest-Shamir-Adleman)를 사용하여 데이터를 암호화하고 복호화하는 방법을 알아보겠습니다.

4.1. RSA 키 생성

먼저 RSA 키 쌍(공개키와 개인키)을 생성합니다.

from cryptography.hazmat.primitives.asymmetric import rsa
from cryptography.hazmat.primitives import serialization

# RSA 키 쌍 생성
private_key = rsa.generate_private_key(
    public_exponent=65537,
    key_size=2048,
    backend=default_backend()
)

public_key = private_key.public_key()

# 키 저장 (옵션)
pem_private_key = private_key.private_bytes(
    encoding=serialization.Encoding.PEM,
    format=serialization.PrivateFormat.PKCS8,
    encryption_algorithm=serialization.NoEncryption()
)

pem_public_key = public_key.public_bytes(
    encoding=serialization.Encoding.PEM,
    format=serialization.PublicFormat.SubjectPublicKeyInfo
)

print("Private key:", pem_private_key.decode('utf-8'))
print("Public key:", pem_public_key.decode('utf-8'))

4.1.1. 코드 설명

  • RSA 키 쌍 생성: rsa.generate_private_key()를 사용하여 RSA 개인키를 생성하고, 해당 개인키에서 공개키를 추출합니다.
  • 키 저장: 생성된 키를 PEM 형식으로 변환하여 저장할 수 있습니다.

4.2. RSA 암호화

공개키를 사용하여 데이터를 암호화합니다.

from cryptography.hazmat.primitives.asymmetric import padding as rsa_padding
from cryptography.hazmat.primitives import hashes

# 암호화할 데이터
data = b"Secret Message"

# RSA 암호화
encrypted_data = public_key.encrypt(
    data,
    rsa_padding.OAEP(
        mgf=rsa_padding.MGF1(algorithm=hashes.SHA256()),
        algorithm=hashes.SHA256(),
        label=None
    )
)

print("Encrypted data:", encrypted_data)

4.2.1. 코드 설명

  • RSA 암호화: 공개키를 사용하여 데이터를 암호화합니다. OAEP(Optimal Asymmetric Encryption Padding)를 사용하여 안전하게 암호화합니다.

4.3. RSA 복호화

개인키를 사용하여 암호화된 데이터를 복호화합니다.

# RSA 복호화
decrypted_data = private_key.decrypt(
    encrypted_data,
    rsa_padding.OAEP(
        mgf=rsa_padding.MGF1(algorithm=hashes.SHA256()),
        algorithm=hashes.SHA256(),
        label=None
    )
)

print("Decrypted data:", decrypted_data)

4.3.1. 코드 설명

  • RSA 복호화: 개인키를 사용하여 암호화된 데이터를 복호화합니다. 암호화 시 사용된 동일한 패딩 방식(OAEP)을 사용해야 합니다.

5. 해시 함수

해시 함수는 입력 데이터를 고정된 크기의 해시 값으로 변환하는 함수로, 데이터의 무결성을 검증하는 데 사용됩니다. 파이썬의 hashlib 모듈을 사용하여 해시 함수를 구현할 수 있습니다.

5.1. SHA-256 해시 계산

SHA-256 해시 함수를 사용하여 데이터의 해시 값을 계산해보겠습니다.

import hashlib

# 해시 계산할 데이터
data = b"Message to hash"

# SHA-256 해시 계산
hash_object = hashlib.sha256(data)
hex_dig = hash_object.hexdigest()

print("SHA-256 hash:", hex_dig)

5.1.1. 코드 설명

  • SHA-256 해시 계산: hashlib.sha256()을 사용하여 데이터의 SHA-256 해시 값을 계산합니다. hexdigest() 메서드를 사용하여 해시 값을 16진수 문자열로 변환합니다.

6. 암호화를 활용한 프로젝트 아이디어

암호화를 활용하여 다양한 보안 관련 프로젝트를 시도해볼 수 있습니다. 다음은 몇 가지 프로젝트 아이디어입니다:

  • 파일 암호화 도구: 파일을 안전하게 암호화하고, 키

를 사용하여 복호화할 수 있는 도구를 개발합니다.

  • 암호 관리자: 사용자의 암호를 안전하게 저장하고 관리하는 암호 관리 시스템을 구현합니다.
  • 안전한 메시징 애플리케이션: 메시지를 암호화하여 전송하고, 수신자가 이를 복호화하여 읽을 수 있는 안전한 메시징 애플리케이션을 개발합니다.
  • 전자 서명: 문서의 무결성을 보장하기 위해 전자 서명을 생성하고 검증하는 시스템을 개발합니다.

결론

이번 글에서는 파이썬을 사용하여 암호화의 기초 개념을 배우고, 대칭키 암호화(AES)와 비대칭키 암호화(RSA) 방법을 구현하는 방법을 살펴보았습니다. 암호화는 데이터를 안전하게 보호하는 데 중요한 역할을 하며, 다양한 응용 분야에서 사용됩니다. 실습을 통해 암호화의 기본 개념을 익히고, 이를 활용하여 보안 관련 프로젝트를 개발해보세요.


이 글을 통해 파이썬의 암호화 기초 개념을 이해하고, 이를 활용하여 간단한 암호화 및 복호화 작업을 수행하는 방법을 배울 수 있을 것입니다. 암호화 기술을 활용하여 데이터를 안전하게 보호하는 시스템을 개발해보세요!

+ Recent posts