본문 바로가기

개발자 레니는 지금 -/소프트웨어와 함께

[ Python ] binary, file 암호화 AES128, HMAC



Python

file 암호화 AES128, HMAC








 시작 전 테스트환경 살피기

   Time

     2017년 09월 20일 

   OS

     Virtual Box - Linux(Ubuntu 16.04 LTS)

   Language

     Python 2.7


따로 테스트는 진행하였었지만.. 진행하고 수정하는 과정에서 File이 날라가는 바람에.. 참고 하였던 코드와 그 코드를 해석을 포스팅합니다.

코드는 아래 있는 대로 실행하시면 동작은 됩니다.

코드 해석은 pdf 파일로 저장되어 있으니 다운하시거나, 열어서 보시면 됩니다.

다만 초기에 암호화에 들어가는 file인 secret.txt는 만들어주셔야 합니다. 내용은 상관 없습니다.

암호화 된 파일이 제대로 복호화 되었는지 확인은 프로그램 실행 후 생성되는 original.txt를 통해 하시면 됩니다.


# -*- coding:utf-8 -*-


import struct, hashlib, time

import binascii

import os

from Crypto.Cipher import AES



def decrypt_file(key, in_filename, out_filename, chunksize=24 * 1024):

    with open(in_filename, 'rb') as infile:

        origsize = struct.unpack('<Q', infile.read(struct.calcsize('Q')))[0]

        iv = infile.read(16)

        decryptor = AES.new(key, AES.MODE_CBC, iv)

        with open(out_filename, 'wb') as outfile:

            while True:

                chunk = infile.read(chunksize)

                if len(chunk) == 0:

                    break

                outfile.write(decryptor.decrypt(chunk))

            outfile.truncate(origsize)



def encrypt_file(key, in_filename, out_filename=None, chunksize=65536):

    if not out_filename:

        out_filename = in_filename + '.enc'

    iv = 'initialvector123'

    encryptor = AES.new(key, AES.MODE_CBC, iv)

    filesize = os.path.getsize(in_filename)

    with open(in_filename, 'rb') as infile:

        with open(out_filename, 'wb') as outfile:

            outfile.write(struct.pack('<Q', filesize))

            outfile.write(iv)

            while True:

                chunk = infile.read(chunksize)

                if len(chunk) == 0:

                    break

                elif len(chunk) % 16 != 0:

                    chunk += ' ' * (16 - len(chunk) % 16)

                outfile.write(encryptor.encrypt(chunk))



def make_pass():

    timekey = int(time.time())

    return str(timekey)



def main():

    password = make_pass()

    key = hashlib.sha256(password).digest()

    print binascii.hexlify(bytearray(key))

    in_filename = 'secret.txt'

    encrypt_file(key, in_filename, out_filename='output')

    print 'Encrypte Done !'


    #delete original file


    #decrypt

    decrypt_file(key, in_filename='output', out_filename='original.txt')

    outfile = open('original.txt')

    magic = outfile.read(8)

    print 'Magic Number : ' + magic.encode('hex')

    if magic.encode('hex') == 'd0cf11e0a1b11ae1':

        print 'This document is a TXT file.'



main()







 참조내용


1. [Python] 파이썬 AES 암호화 및 복호화

2. 코드해석 PDF 파일 >>  scan.pdf