[암호학] 암호화 해킹 #8 (3DES와 AES를 이용하여 암호파일 저장)

2024. 1. 19. 01:47· 보안 스터디/암호학
목차
  1. 프롤로그
  2. 파일을 불러와서 3DES로 암호화 한 후 파일로 저장하기 + 복호화
  3. 코드
  4. 코드 분석
  5. 실행결과
  6. 파일을 불러와서 AES로 암호화 한 후 파일로 저장하기 + 복호화
  7. 코드
  8. 실행결과
  9. 에필로그
728x90
반응형

 

프롤로그

자 지금까지

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()

코드분석은 위와 같으므로 넘어가겠다.

 

실행결과

실행결과도 마찬가지로 잘 되는 것을 확인할 수 있다.

 

 

에필로그

책에 나온 대칭키 암호 파트는 끝났다. 하지만 이제 우리는 최종단계인 저것들을 매트랩에서 실행시키는 것이 목표이기 떄문에 그것만 하면 원하는 목표는 이룰 수 있다. 이제 매트랩에서 실행시키고 스터디 내용 발표 정리만 하면 된다.

 

728x90
반응형
저작자표시 비영리 (새창열림)

'보안 스터디 > 암호학' 카테고리의 다른 글

[암호학] 암호화 해킹 #7 (스트림 암호와 ARC4)  (1) 2024.01.18
[암호학] 암호화 해킹 #6 (AES 및 구현)  (0) 2024.01.18
[암호학] 암호화 해킹 #5 (3DES 및 구현)  (1) 2024.01.18
[암호학] 암호화 해킹 #4 (대칭키 암호, Symmetric-key Cryptography)  (1) 2024.01.17
[암호학] 암호화 해킹 #3 (전치 암호 도구 만들기)  (6) 2024.01.14
  1. 프롤로그
  2. 파일을 불러와서 3DES로 암호화 한 후 파일로 저장하기 + 복호화
  3. 코드
  4. 코드 분석
  5. 실행결과
  6. 파일을 불러와서 AES로 암호화 한 후 파일로 저장하기 + 복호화
  7. 코드
  8. 실행결과
  9. 에필로그
'보안 스터디/암호학' 카테고리의 다른 글
  • [암호학] 암호화 해킹 #7 (스트림 암호와 ARC4)
  • [암호학] 암호화 해킹 #6 (AES 및 구현)
  • [암호학] 암호화 해킹 #5 (3DES 및 구현)
  • [암호학] 암호화 해킹 #4 (대칭키 암호, Symmetric-key Cryptography)
성밍쟁
성밍쟁
성밍쟁 공붕방
성밍쟁
너드인의 밤
성밍쟁
전체
오늘
어제
  • 분류 전체보기 (182)
    • 일상 (1)
    • 스펙업 (7)
      • 학회 (0)
      • 멋쟁이사자처럼 (2)
      • 2024 winter-study (5)
    • 코딩테스트 - 백준 (9)
    • 보안 스터디 (56)
      • 시스템 해킹 (10)
      • 리버스 엔지니어링 (0)
      • 웹 해킹 (38)
      • 암호학 (8)
    • bandit (15)
    • 웹 개발 (11)
    • 머신러닝 (0)
    • 데이터베이스 (9)
    • KnockOn (72)
    • DevOps (2)

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

인기 글

태그

  • 드림핵
  • /bin
  • 1074
  • 11656
  • 1193
  • 2563
  • 3Des
  • 9613
  • AES
  • Alias

최근 댓글

최근 글

hELLO · Designed By 정상우.v4.2.2
성밍쟁
[암호학] 암호화 해킹 #8 (3DES와 AES를 이용하여 암호파일 저장)
상단으로

티스토리툴바

개인정보

  • 티스토리 홈
  • 포럼
  • 로그인

단축키

내 블로그

내 블로그 - 관리자 홈 전환
Q
Q
새 글 쓰기
W
W

블로그 게시글

글 수정 (권한 있는 경우)
E
E
댓글 영역으로 이동
C
C

모든 영역

이 페이지의 URL 복사
S
S
맨 위로 이동
T
T
티스토리 홈 이동
H
H
단축키 안내
Shift + /
⇧ + /

* 단축키는 한글/영문 대소문자로 이용 가능하며, 티스토리 기본 도메인에서만 동작합니다.