[ pycrypto를 이용하여 3DES를 활용한 단문 메세지 암호화 도구 구현 ]



  1. from Crypto.Cipher import DES3  
  2. from Crypto.Hash import SHA256 as SHA  
  3.   
  4. class myDES():  
  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[:24]  
  10.   
  11.         hash.update(ivtext.encode('utf-8'))  
  12.         iv = hash.digest()  
  13.         self.iv = iv[:8]  
  14.   
  15.     def enc(self, plaintext):  
  16.         des3 = DES3.new(self.key, DES3.MODE_CBC, self.iv)  
  17.         encmsg = des3.encrypt(plaintext)  
  18.   
  19.         return encmsg  
  20.   
  21.     def dec(self, ciphertext):  
  22.         des3 = DES3.new(self.key, DES3.MODE_CBC, self.iv)  
  23.         decmsg = des3.decrypt(ciphertext)  
  24.   
  25.         return decmsg  
  26.   
  27. if __name__ == '__main__':  
  28.   
  29.     keytext = 'iloveyou'  
  30.     ivtext = '1234'  
  31.     msg = 'imhapppy'  
  32.   
  33.     myCipher = myDES(keytext, ivtext)  
  34.     ciphered = myCipher.enc(msg)  
  35.     deciphered = myCipher.dec(ciphered)  
  36.   
  37.     print "Original   : \t%s" % msg  
  38.     print "Ciphered   : \t%s" % ciphered  
  39.     print "Deciphered : \t%s" % deciphered 


[코드 1] 3DES 단문 메세지 암복호화 코드 - 3desformsg.py



[ 설명 ]



'imhapppy'라는 8자리의 문장을 3DES CBC 모드로 암호화 하고

암호화된 문장을 3DES로 복호화 하는 소스코드 이다.



[ 코드 해석 ]



  1. from Crypto.Cipher import DES3  
  2. from Crypto.Hash import SHA256 as SHA  


3DES 라이브러리 사용을 위해 pycrypto의 필요한 모듈을 import 한다.
pycrypto의 3DES 모듈은 Crypto.Cipher.DES3 이다.

Crypto.Hash.SHA256 모듈은 3DES의 암호키와 초기화 백터를 만들때 활용한다.

SHA를 SHA256의 별명으로 사용한다.


  1. class myDES():  


3DES를 위해 myDES라는 이름의 클래스를 정의한다.

이 클래스에는 암호화를 수행하는 enc( )와 복호화를 수행하는 dec( ) 메소드가 정의되어 있다.


  1.     def __init__(self, keytext, ivtext):  


__init__( )클래스 생성자 이다.

인자 keytext는 3DES 암호키 생성을 위한 문자열이며 ivtext는 초기화 벡터를 위한 문자열이다.

클래스 생성자에서 3DES 객체 생성 시 사용할 키와 초기화 백터를 구한다.


keytext를 3DES가 지원하는 길이로 만들어서 이를 3DES의 키로 활용하면 보다 편리하다.

SHA256 해시는 이런 작업을 수행할 수 있는 훌륭한 도구이다.


  1.         hash = SHA.new()  
  2.         hash.update(keytext.encode('utf-8'))  
  3.         key = hash.digest()  
  4.         self.key = key[:24]  


SHA256.new( )를 이용해 SHA256 객체를 만들고 hash에 할당한다.

hash.update( )를 이용해 SHA256해시를 갱신하고 갱신하기 위해 사용된 인자는 keytext이다.

입력된 인자 값에 따라 갱신되는 해시값이 결정 된다.

SHA256.update( )의 인자로 유니코드로 된 문자열을 입력 받으면 오류메세지가 발생한다.

따라서 인자로 UTF-8로 인코딩한 문자열을 입력한다. 


hash.digest( )로 해시 값을 추출하여 변수 key에 할당한다.

SHA256은 256bit 해시를 생성하므로 변수 key는 256bit = 32byte 이다.


pycrypto에서 제공하는 3DES의 key 크기는 16byte 또는 24byte이다.

따라서 변수 key를 16byte 또는 24byte만큼 슬라이싱 하여 3DES의 key로 사용한다.


  1.         hash.update(ivtext.encode('utf-8'))  
  2.         iv = hash.digest()  
  3.         self.iv = iv[:8


3DES는 64bit 암호화 블록 크기를 가진다. 따라서 초기화 벡터 또한 반드시 64bit가 되어야 한다.

암호키 생성기와 마찬가지로 초기화 벡터를 생성하기 위해서 SHA256 해시를 사용한다.

hash.update( ivtext )로 초기화 벡터를 위한 해시를 갱신하고 hash.digest( ) 해시값을 얻는다.

iv의 처음 8바이트를 초기화 벡터값으로 할당한다.


  1.     def enc(self, plaintext):  
  2.         des3 = DES3.new(self.key, DES3.MODE_CBC, self.iv)  
  3.         encmsg = des3.encrypt(plaintext)  
  4.   
  5.         return encmsg  


enc( )는 인자로 입력된 plaintext에 담긴 문자열을 3DES로 암호화 한다.

암호화를 위해 먼저 DES3.new( )로 3DES 객체를 생성한다. 

DES3.new( )의 인자는 암호키, 운영모드, 초기화 벡터 순서이다


  1.     def dec(self, ciphertext):  
  2.         des3 = DES3.new(self.key, DES3.MODE_CBC, self.iv)  
  3.         decmsg = des3.decrypt(ciphertext)  
  4.   
  5.         return decmsg  


복호화 또한 마찬가지로 DES3.new( )를 이용해 DES3 객체를 생성한다.

des3.decrypt( )로 암호문을 복호화 한다.


※ enc( )와 dec( )가 동일한 코드라서 객체를 만들어 활용하면 안된다.


  1. if __name__ == '__main__':  
  2.   
  3.     keytext = 'iloveyou'  
  4.     ivtext = '1234'  
  5.     msg = 'imhapppy'  
  6.   
  7.     myCipher = myDES(keytext, ivtext)  
  8.     ciphered = myCipher.enc(msg)  
  9.     deciphered = myCipher.dec(ciphered)  
  10.   
  11.     print "Original   : \t%s" % msg  
  12.     print "Ciphered   : \t%s" % ciphered  
  13.     print "Deciphered : \t%s" % deciphered 


암호키 생성을 위한 keytext로 'iloveyou'를, 초기화 벡터 생성을 위한 ivtext로 '1234'를 이용한다.

우리가 기억하는 암호키는 'iloveyou'가 된다. 

실제 운영되는 암호키는 암호키의 SHA256해시값 중 처음 24byte가 된다. ivtext또한 마찬가지이다.

암호화 하려는 메세지는 'imhapppy' 이다.



[ 결과 ]



※ DOS 설정으로 인해 암호화된 문자들이 깨져 보이나 성공적으로 암호화 되었습니다.

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

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

+ Recent posts