AES 단문 메세지 암 복호화
- from Crypto.Cipher import AES
- from Crypto.Hash import SHA256 as SHA
- 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, palintext):
- fillersize = 0
- textsize = len(plaintext)
- if textsize % 16 != 0:
- fillersize = 16 - textsize % 16
- filler = '0' * fillersize
- header = '%d' % (fillersize)
- gap = 16 - len(header)
- 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)
- 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]
- return decmsg
[코드 1] AES 단문 메세지 암 복호화 코드 aesformsg.py
AES의 활용 예는 key의 크기(128, 192, 256 bit) 와 암호화 블록 크기(128bit)가 다른것 빼고는
3DES와 비슷하다. (3DES - pycrypto 3desformsg.py 참고)
설명
- self.key = key[:16]
myAES 클래스의 생성자에서 self.key 값을 16byte로 만든다.
AES는 192bit, 256bit 키를 지원하므로, 키 크기를 바꾸고자 하는 경우 다음과 같이 한다.
self.key = key[:24] |
192bit key로 암호화 할 경우 |
self.key = key |
256bit key로 암호화 할 경우 |
- def makeEnabled(self, palintext):
인자로 입력되는 plaintext의 크기가 16byte 배수가 아닐 경우 문자 '0'을 plaintext 끝에 추가하여 16byte의 배수로 만들고 이에 대한 정보를 헤더로 구성한 후 결과를 리턴한다.
헤더 구조는 3DES와 동일하게 구성하되, 헤더 크기는 16byte로 한다.
만약 plaintext를 16byte 배수로 만들기 위해 추가된 '0'의 개수가 12개일 경우 헤더는 다음과 같이 구성된다.
header = '12##############'
- plaintext = self.makeEnabled(plaintext)
AES로 암호화하기 전
myAES 클래스의 makeEnabled( )로 plaintext를 "헤더 + 원래 정보 + '0' + 문자열" 로 변환한다.
- header = decmsg[:16].decode()
- fillersize = int(header.split('#')[0])
- if fillersize != 0:
- 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 |