프롤로그
파이썬에서 암호화된 내용을 파일로 저장을 하고, 해당 파일을 매트랩에서 불러오려고 했는데, 인코딩 디코딩에서 문제가 생기는지 계속 이상한 특수 문자가 생겨서 저번 글이랑 아예 차이가 없을 거 같다.
AES(Rijndael 알고리즘)
AES(Advanced Encryption Standard)는 DES를 대체하기 위해 2001년 미국 표준 기술 연구소(NIST)에서 제정한 새로운 암호 표준이다.
SPN 블록 구조를 사용하는데, 키는 128비트, 192비트, 256비트를 지원하며 암호 블록 크기는 128비트 이다.
AES 알고리즘에 대한 공격 방법은 다양하게 알려져 있으나 아직까지 AES로 암호화된 정보가 완전히 해독된 사례가 없기 때문에 안전성이 보장된 알고리즘이라고 할 수 있다.
SPN 구조
(Subsitution Permutation Network)이라는 암호 구조를 사용하는데, 곱 암호의 일종으로 S-Box를 사용하는 치환과 P-box 를 사용한느 순열을 여러 라운드에 걸쳐 반복한다.
AES 구조
평문을 총 4가지 함수를 적용시키는 것을 반복하여 암호화 한다.
제일 처음 AddRoundKey 함수 적용
1~9번 라운드 동안 SubBytes, ShiftRows, MixColumns, AddRoundkey 를 순서대로 반복한다.
마지막에는 MixColumns를 제외하고 한 번씩 더 적용하고 마무리 한다.
자세한 내용은
2024.01.18 - [보안 스터디/암호학] - [암호학] 암호화 해킹 #6 (AES 및 구현)
해당 글에 이 함수들에 대한 설명을 적어두었다.
파이썬 코드 작성
from Crypto.Cipher import AES
from Crypto.Hash import SHA256 as SHA
import sys
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 makeEnabled(self, plaintext):
fillersize = 0
textsize = len(plaintext)
if textsize%16 !=0:
fillersize = 16 - textsize%16
filler = '0'*fillersize
header = "%d" % (fillersize)
gap = 16 - len(header)
header += "#"*gap;
return header + plaintext + filler;
def enc(self, plaintext):
plaintext = self.makeEnabled(plaintext)
aes = AES.new(self.key, AES.MODE_CBC, self.iv)
encmsg = aes.encrypt(plaintext.encode())
return encmsg
def dec(self, ciphertext):
aes = AES.new(self.key, AES.MODE_CBC, self.iv)
decmsg = aes.decrypt(ciphertext)
header = decmsg[:16].decode()
fillersize = int(header.split("#")[0])
if fillersize !=0:
decmsg = decmsg[16:-fillersize]
else:
decmsg = decmsg[16:]
return decmsg;
def main():
# 명령행 인수를 추출
if len(sys.argv) != 4:
print("사용법: AES.py <keytext> <ivtext> <msg>")
sys.exit(1)
keytext = sys.argv[1]
ivtext = sys.argv[2]
msg = sys.argv[3]
myCipher = myAES(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)
if __name__ == "__main__":
main()
저번 코드랑 다를 것은 없지만 바뀐 것은
def main():
# 명령행 인수를 추출
if len(sys.argv) != 4:
print("사용법: AES.py <keytext> <ivtext> <msg>")
sys.exit(1)
keytext = sys.argv[1]
ivtext = sys.argv[2]
msg = sys.argv[3]
딱 이부분만이다.
매트랩 코드 작성
keytext = 'samsjang';
ivtext = '12345678';
msg = 'python3x';
% 파이썬 스크립트 호출 및 데이터 전달
command = ['python AES.py "' keytext '" "' ivtext '" "' msg '"'];
system(command);
system 함수를 이용해서 파이썬 코드를 실행시킨다.
실행결과
파이썬에서의 print와 나머지 함수들이 잘 적용이 된 모습이다.
에필로그
DES3 와 차이가 없어서 저번 거
2024.01.18 - [스펙업/2024 winter-study] - [MATLAB] 매트랩에서 파이썬 코드 실행하기 (3DES)
만 할 줄 알면 바로 따라할 수 있을 것이다.
'스펙업 > 2024 winter-study' 카테고리의 다른 글
[MATLAB] 매트랩에서 파이썬 코드 실행하기 (3DES) (0) | 2024.01.18 |
---|---|
[매트랩] 이미지, 영상, 음성 데이터를 bit 데이터로 변환하기 (1) | 2024.01.15 |
[MATLAB] 매트랩에서 C언어 함수 사용하기 (2) | 2024.01.12 |
[MATLAB] 매트랩으로 파일 불러오고 저장하기 (동영상, 사진, 음성) (0) | 2024.01.10 |