프롤로그
암호학을 공부하기 위해 파이썬의
from Crypto.Cipher import DES3
from Crypto.Hash import SHA256 as SHA
import sys
를 사용했었고, 이걸 매트랩에서 똑같이 구현해볼려고 했는데, 매트랩에서는 Cryptograph 와 관련된 Toolbox가 존재하지 않았다. 이를 매트랩에서 활용할려면 결국 파이썬으로 넘겨주고 파이썬에서 실행한 후에 이를 매트랩으로 다시 가져와야한다. 이를 알아보자.
우선 DES를 확인하기 전에 2가지 알아야할 게 있다.
(1) 파이스텔 구조
평문이 주어졌을 때, 입력되는 평문 블록을 좌우 두개 블록으로 분할하고, 좌측 블록을 파이스텔 함수라 불리는 라운드 함수를 적용하여 출력된 결과를 우측 블록에 적용하는 과정을 반복적으로 수행하는 것이다.
오른쪽 블록은 다음 라운드의 왼쪽 블록으로 어떠한 처리도 없이 입력된다.
(2) CBC 모드
블록을 암호화 하기 전에 이전 블록의 암호화된 블록과 XOR 연산을 한 결과를 새로운 암호키로 해서 블록을 암호화 하는 방식이다. 맨 첫 블록은 이전 블록이 없기 때문에 이전 블록 역할을 하는 초기화 벡터가 필요하다.
기존 글에서
2024.01.18 - [보안 스터디/암호학] - [암호학] 암호화 해킹 #5 (3DES 및 구현)
구현한 것은 위 두개를 만족시키기 위해서 파이썬으로 작성하였다. 그리고 3DES는 DES를 보완하기 위해 DES를 그냥 3번 반복하는 과정이다. (물론 저거 이해가 많이 안 되어 있을 때 작성한 거라서 개판으로 적긴함)
(3) DES의 암호키
DES의 암호키는 64비트 암호화 블록 크기를 가진다.를 사용하지만 패리트비트로 인하여 정작 56바이트만 사용하게 된다. 하지만 DES는 이를 3번 반복하기에 56*3 = 168 바이트까지 사용할 수 있다.
우리가 사용한 모듈에서 3DES의 키 크기는 16 or 24바이트만 지원한다. 그리고 초기화벡터는 DES 암호화 블록 크기가 64비트 이기에 초기화벡터도 64비트 즉 8바이트가 되어야 한다.
이 것들을 만드는 함수가 있지만 그냥 SHA256 이용하여 만들었다.
어쨌거나 우리는 결과적으로 CBC모드를 위해서 초기화 하는 벡터 하나, 키값 하나, 평문 하나 이렇게 3개가 필요하다.
MATLAB에서 파일 준비
이렇게 내가 현재 실행하고픈 매트랩 파일과 파이썬 파일을 같이 준비하자.
매트랩은 다음과 같이 작성한다.
% MATLAB에서 파이썬 스크립트 호출 및 데이터 전달
keytext = 'samsjangasssssssss';
ivtext = '12345678';
msg = 'seominjae';
command = ['python DES3.py "' keytext '" "' ivtext '" "' msg '"'];
system(command);
keytext는 키값, ivtext는 초기화 벡터, msg 는 평문이고, 이걸 command 함수로 python 에다가 인자로 넣겠다는 의미이다.
파이썬 코드 준비
from Crypto.Cipher import DES3
from Crypto.Hash import SHA256 as SHA
import sys
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 enc(self, plaintext):
plaintext = make8String(plaintext)
des3 = DES3.new(self.key, DES3.MODE_CBC, self.iv)
encmsg = des3.encrypt(plaintext.encode())
return encmsg
def dec(self, ciphertext):
des3 = DES3.new(self.key, DES3.MODE_CBC, self.iv)
decmsg = des3.decrypt(ciphertext)
return decmsg
def make8String(msg):
msglen = len(msg)
filler = ''
if msglen%8 !=0:
filler = '0'*(8-msglen%8)
msg +=filler
return msg
def main():
if len(sys.argv) != 4:
print("사용법: DES3.py <keytext> <ivtext> <msg>")
sys.exit(1)
keytext = sys.argv[1]
ivtext = sys.argv[2]
msg = sys.argv[3]
myCipher = myDES(keytext, ivtext)
ciphered = myCipher.enc(msg)
deciphered = myCipher.dec(ciphered)
print("Original : \t%s" % msg)
print("Ciphered : \t%s" % ciphered)
print("Deciphered : \t%s" % deciphered)
main()
인자로 받은 것을 실행하는 과정이다. 이렇게 하고 실행하였더니
매트랩에서 정상적으로 실행되었다.
키값 또는 초기화벡터를 변경하였을때 계속 값이 바뀌는 것을 확인할 수 있다.
에필로그
이렇게 DES를 매트랩과 파이썬을 이용하여 출력을 확인하는 방법을 알아보았다.
'스펙업 > 2024 winter-study' 카테고리의 다른 글
[MATLAB] 매트랩에서 파이썬 코드 실행하기 (AES) (0) | 2024.01.19 |
---|---|
[매트랩] 이미지, 영상, 음성 데이터를 bit 데이터로 변환하기 (1) | 2024.01.15 |
[MATLAB] 매트랩에서 C언어 함수 사용하기 (2) | 2024.01.12 |
[MATLAB] 매트랩으로 파일 불러오고 저장하기 (동영상, 사진, 음성) (0) | 2024.01.10 |