[python] PyCrypto로 암호화된 데이터 파일 읽고 쓰기

PyCrypto는 Python을 위한 암호화와 암호 해독 기능을 제공하는 패키지입니다. 이를 사용하여 데이터 파일을 암호화하고 복호화할 수 있습니다.

암호화된 데이터 파일 생성하기

먼저, PyCrypto를 설치해야 합니다. 다음 명령을 사용하여 패키지를 설치할 수 있습니다.

pip install pycrypto

다음은 암호화된 데이터 파일을 생성하는 예제 코드입니다.

from Crypto.Cipher import AES
import os

def encrypt_file(file_path, key):
    chunk_size = 64 * 1024  # 64KB
    output_file_path = file_path + ".enc"

    # 초기화 벡터 생성
    iv = os.urandom(AES.block_size)

    # AES 알고리즘 객체 생성
    cipher = AES.new(key, AES.MODE_CBC, iv)

    with open(file_path, 'rb') as file:
        with open(output_file_path, 'wb') as outfile:
            # 초기화 벡터를 파일에 쓴다.
            outfile.write(iv)

            while True:
                chunk = file.read(chunk_size)
                if len(chunk) == 0:
                    break
                elif len(chunk) % 16 != 0:
                    # PKCS7 패딩 적용
                    chunk += b' ' * (AES.block_size - (len(chunk) % AES.block_size))

                # 암호화된 데이터를 파일에 쓴다.
                outfile.write(cipher.encrypt(chunk))

    print("암호화된 파일을 생성했습니다.")

# 예시 코드 실행
key = b'ThisIsASecretKey'
encrypt_file('data.txt', key)

위의 예제 코드에서는 AES(Advanced Encryption Standard) 알고리즘을 사용하여 파일을 암호화합니다. 긴 텍스트 파일을 읽고 64KB 단위로 암호화하여 새로운 파일을 생성합니다.

암호화된 데이터 파일 읽기

암호화된 데이터 파일을 읽는 것은 약간의 추가 작업이 필요합니다. 아래는 암호화된 데이터 파일을 복호화하여 원본 파일을 얻는 예제 코드입니다.

def decrypt_file(file_path, key):
    chunk_size = 64 * 1024  # 64KB

    # 초기화 벡터를 파일에서 읽는다.
    with open(file_path, 'rb') as file:
        iv = file.read(AES.block_size)

        # AES 알고리즘 객체 생성
        cipher = AES.new(key, AES.MODE_CBC, iv)

        output_file_path = file_path[:-4]  # .enc 확장자 제거

        with open(output_file_path, 'wb') as outfile:
            while True:
                chunk = file.read(chunk_size)

                if len(chunk) == 0:
                    break

                # 복호화된 데이터를 파일에 쓴다.
                outfile.write(cipher.decrypt(chunk))

    print("복호화된 파일을 생성했습니다.")

# 예시 코드 실행
decrypt_file('data.txt.enc', key)

복호화된 데이터는 원래의 데이터 파일과 동일한 이름을 가지지만 .enc 확장자가 제거됩니다.

암호화된 데이터 파일의 암호와 원본 데이터 파일의 암호는 반드시 일치해야 합니다. 그렇지 않으면 복호화 과정에서 오류가 발생합니다.

마치며

PyCrypto를 사용하면 Python을 통해 암호화와 복호화 기능을 손쉽게 구현할 수 있습니다. 이러한 기능은 데이터 파일의 보안을 강화하고 외부에서 접근할 수 없게 만들 수 있습니다.