프롤로그
자 지금까지
2024.01.17 - [보안 스터디/암호학] - [암호학] 암호화 해킹 #4 (대칭키 암호, Symmetric-key Cryptography)
[암호학] 암호화 해킹 #4 (대칭키 암호, Symmetric-key Cryptography)
프롤로그 이제 암호학 본격적으로 들어가보자 대칭키 암호 대칭키 암호란 암호화에 사용되는 암호키와 복호화에 사용되는 암호키가 동일한 암호화 기법을 말한다. 대칭키 암호 방식으로 암호
taesan-smj.tistory.com
대칭키 암호에 대해서 배우고, 블록 암호화 스트림 암호를 대해서 배웠다.
스트림 암호인 ARC4를 구현했었다.
2024.01.18 - [보안 스터디/암호학] - [암호학] 암호화 해킹 #7 (스트림 암호와 ARC4)
[암호학] 암호화 해킹 #7 (스트림 암호와 ARC4)
프롤로그 대칭키 암호 - 스트림 구조 - 블록 구조 - 파이스텔 방식 - SPN 구조에서 파이스텔 방식에서 2024.01.18 - [보안 스터디/암호학] - [암호학] 암호화 해킹 #5 (3DES 및 구현) [암호학] 암호화 해킹 #
taesan-smj.tistory.com
블록 암호에 대해서는 파이스텔 구조와 SPN 구조가 있다는 것을 알고 각각 DES와 AES에 대해서 이해하고 이를 직접 구현해보았다.
2024.01.18 - [보안 스터디/암호학] - [암호학] 암호화 해킹 #5 (3DES 및 구현)
[암호학] 암호화 해킹 #5 (3DES 및 구현)
프롤로그 아 좀 빡센데 3DES DES(Data Encryption Standard 는 1970년대 IBM에서 파이스텔 블록구조에 기반하여 설계뙤고 개발된 56비트 암호화 알고리즘으로써 되게 인기있었지만 56비트라는 작은 암호키로
taesan-smj.tistory.com
2024.01.18 - [보안 스터디/암호학] - [암호학] 암호화 해킹 #6 (AES 및 구현)
[암호학] 암호화 해킹 #6 (AES 및 구현)
프롤로그 2024.01.17 - [보안 스터디/암호학] - [암호학] 암호화 해킹 #4 (대칭키 암호, Symmetric-key Cryptography) [암호학] 암호화 해킹 #4 (대칭키 암호, Symmetric-key Cryptography) 프롤로그 이제 암호학 본격적
taesan-smj.tistory.com
이를 이제 매트랩에서 활용하기 위해 매트랩에서 파이썬 코드 실행 시키는 법을 배워서 매트랩에서 DES와 AES 둘다 실행해보았다.
2024.01.18 - [스펙업/2024 winter-study] - [MATLAB] 매트랩에서 파이썬 코드 실행하기 (3DES)
[MATLAB] 매트랩에서 파이썬 코드 실행하기 (3DES)
프롤로그 암호학을 공부하기 위해 파이썬의 from Crypto.Cipher import DES3 from Crypto.Hash import SHA256 as SHA import sys 를 사용했었고, 이걸 매트랩에서 똑같이 구현해볼려고 했는데, 매트랩에서는 Cryptograph
taesan-smj.tistory.com
2024.01.19 - [스펙업/2024 winter-study] - [MATLAB] 매트랩에서 파이썬 코드 실행하기 (AES)
[MATLAB] 매트랩에서 파이썬 코드 실행하기 (AES)
프롤로그 파이썬에서 암호화된 내용을 파일로 저장을 하고, 해당 파일을 매트랩에서 불러오려고 했는데, 인코딩 디코딩에서 문제가 생기는지 계속 이상한 특수 문자가 생겨서 저번 글이랑 아예
taesan-smj.tistory.com
이제 최종목표 -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 및 구현)
[암호학] 암호화 해킹 #5 (3DES 및 구현)
프롤로그 아 좀 빡센데 3DES DES(Data Encryption Standard 는 1970년대 IBM에서 파이스텔 블록구조에 기반하여 설계뙤고 개발된 56비트 암호화 알고리즘으로써 되게 인기있었지만 56비트라는 작은 암호키로
taesan-smj.tistory.com
2024.01.18 - [스펙업/2024 winter-study] - [MATLAB] 매트랩에서 파이썬 코드 실행하기 (3DES)
[MATLAB] 매트랩에서 파이썬 코드 실행하기 (3DES)
프롤로그 암호학을 공부하기 위해 파이썬의 from Crypto.Cipher import DES3 from Crypto.Hash import SHA256 as SHA import sys 를 사용했었고, 이걸 매트랩에서 똑같이 구현해볼려고 했는데, 매트랩에서는 Cryptograph
taesan-smj.tistory.com
여기에 대부분 설명이 되어있다.
암호화 과정 분석
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 |