AES 단문 메세지 암 복호화


  1. from Crypto.Cipher import AES  
  2. from Crypto.Hash import SHA256 as SHA  
  3.   
  4. class myAES():  
  5.     def __init__(self, keytext, ivtext):  
  6.         hash = SHA.new()  
  7.         hash.update(keytext.encode('utf-8'))  
  8.         key = hash.digest()  
  9.         self.key = key[:16]  
  10.   
  11.         hash.update(ivtext.encode('utf-8'))  
  12.         iv = hash.digest()  
  13.         self.iv = iv[:16]  
  14.   
  15.     def makeEnabled(self, palintext):  
  16.         fillersize = 0  
  17.         textsize = len(plaintext)  
  18.   
  19.         if textsize % 16 != 0:  
  20.             fillersize = 16 - textsize % 16  
  21.   
  22.         filler = '0' * fillersize  
  23.         header = '%d' % (fillersize)  
  24.         gap = 16 - len(header)  
  25.   
  26.         return header + plaintext + filler  
  27.   
  28.     def enc(self, plaintext):  
  29.         plaintext = self.makeEnabled(plaintext)  
  30.         aes = AES.new(self.key, AES.MODE_CBC, self.iv)  
  31.         encmsg = aes.encrypt(plaintext)  
  32.   
  33.         return encmsg  
  34.   
  35.     def dec(self, ciphertext):  
  36.         aes = AES.new(self.key, AES.MODE_CBC, self.iv)  
  37.         decmsg = aes.decrypt(ciphertext)  
  38.   
  39.         header = decmsg[:16].decode()  
  40.         fillersize = int(header.split('#')[0])  
  41.   
  42.         if fillersize != 0:  
  43.             decmsg = decmsg[16:-fillersize]  
  44.   
  45.         return decmsg  


[코드 1] AES 단문 메세지 암 복호화 코드 aesformsg.py



AES의 활용 예는 key의 크기(128, 192, 256 bit) 와 암호화 블록 크기(128bit)가 다른것 빼고는

3DES와 비슷하다. (3DES - pycrypto 3desformsg.py 참고)



설명


  1.         self.key = key[:16]  


myAES 클래스의 생성자에서 self.key 값을 16byte로 만든다.

AES는 192bit, 256bit 키를 지원하므로, 키 크기를 바꾸고자 하는 경우 다음과 같이 한다.


 self.key = key[:24] 

 192bit key로 암호화 할 경우

 self.key = key

 256bit key로 암호화 할 경우  



  1.     def makeEnabled(self, palintext):  


인자로 입력되는 plaintext의 크기가 16byte 배수가 아닐 경우 문자 '0'을 plaintext 끝에 추가하여 16byte의 배수로 만들고 이에 대한 정보를 헤더로 구성한 후 결과를 리턴한다.


헤더 구조는 3DES와 동일하게 구성하되, 헤더 크기는 16byte로 한다.

만약 plaintext를 16byte 배수로 만들기 위해 추가된 '0'의 개수가 12개일 경우 헤더는 다음과 같이 구성된다.


header = '12##############'


  1.         plaintext = self.makeEnabled(plaintext)  


AES로 암호화하기 전

myAES 클래스의 makeEnabled( )로 plaintext를 "헤더 + 원래 정보 + '0' + 문자열" 로 변환한다.


  1.         header = decmsg[:16].decode()  
  2.         fillersize = int(header.split('#')[0])  
  3.   
  4.         if fillersize != 0:  
  5.             decmsg = decmsg[16:-fillersize]  


복호화된 정보 decmsg의 처음 16byte를 변수 header에 할당한다.

split('#')으로 header를 '#'을 구분자로 분리한다. 

분리된 값 중 첫 번째를 정수로 변환하여 fillersize에 할당한다.


fillersize는 원래 정보 뒤에 추가한 문자 '0'의 개수이므로 

decmsg를 16에서 -fillersize까지 슬라이싱 하면 원래 정보가 추출된다.

'Crypto > pycrypto' 카테고리의 다른 글

RSA 공개키 암호 구현 - pycrypto  (0) 2017.02.05
3DES, AES 파일 암호화, 복호화 - pycrypto  (0) 2017.02.04
3. ARC4 - pycrypto  (0) 2017.02.03
1. 3DES - pycrypto  (0) 2017.02.02

+ Recent posts