Python/Project

3DES를 사용하여 파일 암/복호화 후 SHA256으로 무결성 확인 - 공부하는 도비

DOVISH WISDOM 2022. 11. 21. 20:48  
728x90
반응형

지난 피드에서 SHA256을 이용하여 파일에 대한 해시값을 계산해보고, 두 가지 파일에 대한 무결성 확인을 진행하였습니다. 

2022.11.21 - [파이썬/프로젝트] - [파이썬] SHA256을 이용한 File 무결성 확인 - 공부하는 도비

 

[파이썬] SHA256을 이용한 File 무결성 확인 - 공부하는 도비

지난 피드에서 파이썬 SHA256이나 MD5 사용법에 대해 알아보았습니다. 2022.11.21 - [파이썬/프로젝트] - [파이썬] hashlib의 SHA 사용 - 공부하는 도비 [파이썬] hashlib의 SHA 사용 - 공부하는 도비 SHA는 "Secure

yang-wistory1009.tistory.com

 

오늘은 파이썬의 Crypto.Cipher 모듈에 있는 DES3를 사용하여, 파일을 암/복호화한 후 평문과 암/복호화 한 파일 두 가지의 무결성을 확인해보도록 하겠습니다. 

 

* Triple DES를 이용하여, 파일을 암/복호화 하는 코드 (Triple_DES_FIle.py)

# Triple_DES_File.py

from Crypto.Cipher import DES3
from hashlib import sha256 
from os import path 
KSIZE = 1024

class myDES():
    def __init__(self, keytext, ivtext):
        key = sha256(keytext.encode('utf-8')).digest()
        self.key = key[:24]

        iv = sha256(ivtext.encode('utf-8')).digest()
        self.iv = iv[:8]

    def makeEncInfo(self, filename):
        fillersize = 0
        filesize = path.getsize(filename)
        if filesize % 8 != 0:
            fillersize = 8-filesize%8
        filler = '0'*fillersize 
        header = '%d' %(fillersize)
        gap = 8 - len(header)
        header += '#'*gap

        return header, filler

    def enc(self, filename):
        encfilename = filename + '.enc'
        header, filler = self.makeEncInfo(filename)
        des3 = DES3.new(self.key, DES3.MODE_CBC, self.iv)

        h = open(filename, 'rb')
        hh = open(encfilename, 'wb+')

        enc = header.encode('utf-8')
        content = h.read(KSIZE)
        content = enc + content

        while content:
            if len(content) < KSIZE:
                content += filler.encode('utf-8')
            enc = des3.encrypt(content)
            hh.write(enc)
            content = h.read(KSIZE)
        h.close()
        hh.close()

    def dec(self, encfilename):
        filename = encfilename + '.dec'
        des3 = DES3.new(self.key, DES3.MODE_CBC, self.iv)

        h = open(filename, 'wb+')
        hh = open(encfilename, 'rb')

        content = hh.read(8)
        dec = des3.decrypt(content)
        header = dec.decode()
        fillersize = int(header.split('#')[0])

        content = hh.read(KSIZE)     
        while content:
            dec = des3.decrypt(content)
            if len(dec) < KSIZE:
                if fillersize != 0:
                    dec = dec[:-fillersize]
            h.write(dec)
            content = hh.read(KSIZE)
        h.close()
        hh.close()

 

* Hash_Check.py

from hashlib import sha256 as SHA 
import Triple_DES_File # Triple_DES_File을 import함
SIZE = 1024*256     # 256KB 크기만큼 파일을 읽음

def getFileHash(filename):
    sha = SHA()
    h = open(filename, 'rb')
    content = h.read(SIZE)
    while content:
        sha.update(content)         # 256KB 만큼 정보를 읽고, 해시 값을 업데이트 함  
        content = h.read(SIZE)      # 파일에서 그 다음 256KB를 읽음
    h.close()
    hashval = sha.digest()          # 최종 해시값 계산
    return hashval 

def hashCheck(file1, file2):
    hashval_1 = getFileHash(file1)
    hashval_2 = getFileHash(file2)
    if hashval_1 == hashval_2:
        print("Two Files Are Same")
    else:
        print("Two Files Are Different")

if __name__ == '__main__':

    keytext = 'dobby'
    ivtext = '1234'
    filename = 'plain.txt'
    encfilename = filename + '.enc'

    myCipher = Triple_DES_File.myDES(keytext, ivtext)
    myCipher.enc(filename)      #plain.txt.enc 생성
    myCipher.dec(encfilename)   #plain.txt.enc.dec 생성

    file1 = 'plain.txt'
    file2 = 'plain.txt.enc.dec'

    hashCheck(file1, file2)

plain.txt
0.00MB

위 코드를 실행시키면, plain.txt을 암호화 한 결과 plain.txt.enc와 plain.txt.enc.dec가 새로 생기게 됩니다.

 

무결성 검사는 plain.txt 파일과 plain.txt.enc.dec 파일을 가지고 합니다.

만약 암호화/복호화가 정상적으로 잘 되었다면, 두 파일의 해시값을 동일하고, 결과도 파일이 동일하다고 나올 겁니다.

 

결과는 암호화/복호화가 정상적으로 작동하기 때문에, 두 파일이 동일하다고 나왔습니다. 


각 파일을 메모장으로 열어보면, 암호화/복호화가 제대로 되는 것도 확인할 수 있습니다. 

평문
암호화 후 결과
복호화 결과

 

반응형