프롤로그
자 지금까지
2024.01.17 - [보안 스터디/암호학] - [암호학] 암호화 해킹 #4 (대칭키 암호, Symmetric-key Cryptography)
대칭키 암호에 대해서 배우고, 블록 암호화 스트림 암호를 대해서 배웠다.
스트림 암호인 ARC4를 구현했었다.
2024.01.18 - [보안 스터디/암호학] - [암호학] 암호화 해킹 #7 (스트림 암호와 ARC4)
블록 암호에 대해서는 파이스텔 구조와 SPN 구조가 있다는 것을 알고 각각 DES와 AES에 대해서 이해하고 이를 직접 구현해보았다.
2024.01.18 - [보안 스터디/암호학] - [암호학] 암호화 해킹 #5 (3DES 및 구현)
2024.01.18 - [보안 스터디/암호학] - [암호학] 암호화 해킹 #6 (AES 및 구현)
이를 이제 매트랩에서 활용하기 위해 매트랩에서 파이썬 코드 실행 시키는 법을 배워서 매트랩에서 DES와 AES 둘다 실행해보았다.
2024.01.18 - [스펙업/2024 winter-study] - [MATLAB] 매트랩에서 파이썬 코드 실행하기 (3DES)
2024.01.19 - [스펙업/2024 winter-study] - [MATLAB] 매트랩에서 파이썬 코드 실행하기 (AES)
이제 최종목표 -1 단계인 파일을 불러와서 이를 암호화 파일로 저장하고 다시 복호화해서 파일로 저장하는 법을 알아보자.
파일을 불러와서 3DES로 암호화 한 후 파일로 저장하기 + 복호화
코드
from Crypto.Cipher import DES3
from Crypto.Hash import SHA256 as SHA
from os import path;
KSIZE = 1024
class myDES():
def __init__(self, keytext, ivtext):
hash = SHA.new()
hash.update(keytext.encode("utf-8"))
key = hash.digest()
self.key = key[:24]
hash.update(ivtext.encode('utf-8'))
iv = hash.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()
def main():
keytext = 'samsjang'
ivtext = '1234'
filename = 'D:\github\cryp\chap02\plain.txt'
encfilename = filename+'.enc'
myCipher = myDES(keytext, ivtext)
myCipher.enc(filename)
myCipher.dec(encfilename)
if __name__ == "__main__":
main()
코드 분석
DES 코드들에 대한 설명은
2024.01.18 - [보안 스터디/암호학] - [암호학] 암호화 해킹 #5 (3DES 및 구현)
2024.01.18 - [스펙업/2024 winter-study] - [MATLAB] 매트랩에서 파이썬 코드 실행하기 (3DES)
여기에 대부분 설명이 되어있다.
암호화 과정 분석
def enc(self, filename):
encfilename = filename + '.enc'
header, filler = self.makeEncInfo(filename)
des3 = DES3.new(self.key, DES3.MODE_CBC, self.iv)
filename으로 지정된 파일 내용을 1KB씩 일거서 3DES로 암호화 한 후 새로운 파일에 저장하는 방식이다. 1kb 설정은 맨 위쪽에 전역변수로 KSIZE = 1024로 설정해놓았다.
header와 filler 는 makeEncInfo(filename) 을 호출하여 헤더와 '0' 문자열을 얻고 각각 변수 header 와filler 에 담는다.
h = open(filename, 'rb')
hh = open(encfilename, "wb+")
암호화 하려는 파일은 읽기모드로, 암호화된 파일 내용을 저장하기 위한 파일을 쓰기 모드로 오픈하여 둔다.
enc = header.encode('utf-8')
content = h.read(KSIZE)
content = enc+content
파일을 1KB만큼 읽어서 content에 담고, header를 content 앞에 추가한다. 만약 파일의 내용이 1KB미만이면 남아있는 거 전부 읽는다.
while content:
if len(content) < KSIZE:
content += filler.encode('utf-8')
enc = des3.encrypt(content)
hh.write(enc)
content = h.read(KSIZE)
content 이 내용이 없을 때까지 while구문을 수행하는데, content의 크기가 KSIZE(1KB)보다 작다면 파일을 끝까지 읽었다는 의미이므로 이 부분에서는 0 문자열을 content에 추가한다.
content를 3DES로 암호화하고 파일에 저장한 후, 파일에서 다시 1KB만큼 읽어 content에 담는다.
복호화 과정 분석
h = open(filename, 'wb+')
hh = open(encfilename, 'rb')
암호화랑 반대로 복호화 된 내용을 저장할 파일을 쓰기 모드로 열고, 암호화 된 파일을 읽는다.
content = hh.read(8)
dec = des3.decrypt(content)
header = dec.decode()
fillersize = int(header.split("#")[0])
최초 8바이트를 읽어 3DES로 복호화 한다. 최소 9바이트는 헤더이므로 "#"을 구분자로 헤더를 분리한 후 첫 번째 멤버를 정수로 변환하면 파일의 끝부분에 추가된 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)
암호화 파일에서 1KB를 먼저 읽고 content에 담은 후, while 구문으로 진입한다. 그리고 content에 대용이 없을 때까지 수행한다. 암호화 때 추가한 0 문자열을 제거하고 파일에 저장한다.
실행결과
이 평문을 암호화 되면
뭔가 암호화된 파일이 생기고 이걸 복호화 하면
원문과 같아진 것을 확인할 수 있다.
파일을 불러와서 AES로 암호화 한 후 파일로 저장하기 + 복호화
코드
from Crypto.Cipher import AES
from Crypto.Hash import SHA256 as SHA
from os import path;
KSIZE = 1024
class myAES():
def __init__(self, keytext, ivtext):
hash = SHA.new()
hash.update(keytext.encode("utf-8"))
key = hash.digest()
self.key = key[:16]
hash.update(ivtext.encode('utf-8'))
iv = hash.digest()
self.iv = iv[:16]
def makeEncInfo(self, filename):
fillersize = 0
filesize = path.getsize(filename)
if filesize%16 !=0:
fillersize = 16-filesize%16
filler = '0'*fillersize
header = "%d" %(fillersize)
gap = 16-len(header)
header += "#"*gap
return header, filler;
def enc(self, filename):
encfilename = filename + '.enc'
header, filler = self.makeEncInfo(filename)
aes = AES.new(self.key, AES.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 = aes.encrypt(content)
hh.write(enc)
content = h.read(KSIZE)
h.close()
hh.close()
def dec(self, encfilename):
filename = encfilename + '.dec'
aes = AES.new(self.key, AES.MODE_CBC, self.iv)
h = open(filename, 'wb+')
hh = open(encfilename, 'rb')
content = hh.read(16)
dec = aes.decrypt(content)
header = dec.decode()
fillersize = int(header.split("#")[0])
content = hh.read(KSIZE)
while content:
dec = aes.decrypt(content)
if len(dec) < KSIZE:
if fillersize !=0:
dec = dec[:-fillersize]
h.write(dec)
content = hh.read(KSIZE)
h.close()
hh.close()
def main():
keytext = 'samsjang'
ivtext = '1234'
filename = 'D:\github\cryp\chap02\plain.txt'
encfilename = filename+'.enc'
myCipher = myAES(keytext, ivtext)
myCipher.enc(filename)
myCipher.dec(encfilename)
if __name__ == "__main__":
main()
코드분석은 위와 같으므로 넘어가겠다.
실행결과
실행결과도 마찬가지로 잘 되는 것을 확인할 수 있다.
에필로그
책에 나온 대칭키 암호 파트는 끝났다. 하지만 이제 우리는 최종단계인 저것들을 매트랩에서 실행시키는 것이 목표이기 떄문에 그것만 하면 원하는 목표는 이룰 수 있다. 이제 매트랩에서 실행시키고 스터디 내용 발표 정리만 하면 된다.
'보안 스터디 > 암호학' 카테고리의 다른 글
[암호학] 암호화 해킹 #7 (스트림 암호와 ARC4) (0) | 2024.01.18 |
---|---|
[암호학] 암호화 해킹 #6 (AES 및 구현) (0) | 2024.01.18 |
[암호학] 암호화 해킹 #5 (3DES 및 구현) (1) | 2024.01.18 |
[암호학] 암호화 해킹 #4 (대칭키 암호, Symmetric-key Cryptography) (0) | 2024.01.17 |
[암호학] 암호화 해킹 #3 (전치 암호 도구 만들기) (5) | 2024.01.14 |