python 에서 AES 사용법
update 2023-08-24:
이제 PyCrypto 모듈은 더이상 maintain 되지 않는다.
PyCrypto
PyCrypto module 을 사용한다.pip install pycrypto
windows pycrypto binary 는 아래 링크에서 가져오면 된다.
- http://www.voidspace.org.uk/python/modules.shtml#pycrypto
- python 3.4 버전 exe : https://github.com/axper/python3-pycrypto-windows-installer
- python 3.5 버전 : https://github.com/sfbahr/PyCrypto-Wheels
example
>>> from Crypto.Cipher import AES >>> from Crypto.Util import Counter >>> >>> key = b''*16 >>> pt = b''*1000000 >>> ctr = Counter.new(128) >>> cipher = AES.new(key, AES.MODE_CTR, counter=ctr) >>> ct = cipher.encrypt(pt)
출처 : https://www.dlitz.net/software/pycrypto/api/current/Crypto.Util.Counter-module.html
- 다른 예제 : encryption - How AES in CTR works for Python with PyCrypto? - Stack Overflow
- Python example: Encryption using AES in Counter Mode
- https://github.com/ricmoo/pyaes : Crypto.Cipher 의 AES 와 python 으로 만든 AES 의 속도를 비교한다. Crypto.Cipher 의 내부가 궁금할 때 드려다 보면 된다.
Counter
counter 는 여기를 보면 이해가 좀 쉽다. counter mode 에서는 key 와 counter 값(1,2,3,4,...)를 input 으로 받아서 AES encrypt 를 하는데, 이렇게 되면 언제나 같은 sequence 의 결과가 나온다. 그래서 counter 와 nonce (매번 unique 한 값)와 counter 의 값을 합해서 이것과 key 를 input 으로 해서 AES encrypt 를 한다.하지만 만약 계속 다른 key 를 사용하는 것이라면 굳이 nonce+counter 가 매번 다를 필요는 없다.(참고)
- AESEncrypt(key, `${nonce}${counter}`)
- iv와 nonce 의 차이: What is the main difference between a key, an IV and a nonce?
size
Counter.new(128)counter 의 size 는 AES CTR mode 의 block 크기인 16byte 가 되어야 한다. 아니면 error 가 난다.
Counter.new(120, prefix=b'A')만약 위와 같이 prefix 를 1byte 넣었다면, Counter 의 nbit 은 15byte(120bit) 가 되어야 한다. 참고로 byte 단위로 쪼개지기 때문에 nbit 는 8의 배수로 설정되어야 한다. 안그러면 error 가 난다.
AES CTR mode
python f:\aes-ctr.py -i f:\input.txt -o ciphertext -k abcdef1234567890abcdef1234567890 -iv 01010101010101010101010101010101
openssl
openssl.exe enc -aes-128-ctr -in f:\input.txt -out f:\output.openssl.txt -K abcdef1234567890abcdef1234567890 -iv 01010101010101010101010101010101
See Also
- 암호화의 두가지 방식 - 대칭키 방식, 공개키 방식
- AES Rijndael Cipher explained as a Flash animation : animation 으로 AES 를 설명
- aes tutorial, cryptography Advanced Encryption Standard AES Tutorial,fips 197 - YouTube : 영어로 설명
- https://dmyz.org/en/archives/1182 : php, python, js 에서 같은 암호화 값을 얻는 예제, CBC mode
- from php openssl to pycrypto (CTR mode) : php 의 openssl 을 pyrypto 로 변경할 때
댓글 없음:
댓글 쓰기