728x90
반응형
지난 피드에서 SHA256을 이용하여 파일에 대한 해시값을 계산해보고, 두 가지 파일에 대한 무결성 확인을 진행하였습니다.
2022.11.21 - [파이썬/프로젝트] - [파이썬] SHA256을 이용한 File 무결성 확인 - 공부하는 도비
오늘은 파이썬의 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을 암호화 한 결과 plain.txt.enc와 plain.txt.enc.dec가 새로 생기게 됩니다.
무결성 검사는 plain.txt 파일과 plain.txt.enc.dec 파일을 가지고 합니다.
만약 암호화/복호화가 정상적으로 잘 되었다면, 두 파일의 해시값을 동일하고, 결과도 파일이 동일하다고 나올 겁니다.
결과는 암호화/복호화가 정상적으로 작동하기 때문에, 두 파일이 동일하다고 나왔습니다.
각 파일을 메모장으로 열어보면, 암호화/복호화가 제대로 되는 것도 확인할 수 있습니다.
반응형
'Python > Project' 카테고리의 다른 글
SHA256을 이용한 File 무결성 확인 - 공부하는 도비 (0) | 2022.11.21 |
---|---|
hashlib의 SHA 사용 - 공부하는 도비 (0) | 2022.11.21 |
hashlib의 MD5 사용 - 공부하는 도비 (0) | 2022.11.21 |
단일 치환 암호 해독 (패턴 분석 공격) - 공부하는 도비 (2) | 2022.11.14 |
파이썬 확장 유클리드 알고리즘(Extended Euclidean Algorithm) 구현 - 공부하는 도비 (0) | 2021.05.21 |