This blog post gives example code how to do AES encryption and decryption in Python. The crypto implementations shown are written in C, but they have a Python interface. For pure Python implementations, have a look at Python_AES in tlslite or SlowAES.

Example Python code using the AES implementation in alo-aes:

#! /usr/bin/python2.4 # by pts@fazekas.hu at Sat Nov 7 11:45:38 CET 2009 # Download installer from http://www.louko.com/alo-aes/alo-aes-0.3.tar.gz import aes # Must be 16, 24 or 32 bytes. key = '(Just an example for testing :-)' # Must be a multiple of 16 bytes. plaintext = 'x' * 16 * 3 o = aes.Keysetup(key) # This uses ECB (simplest). alo-aes supports CBC as well (with o.cbcencrypt). ciphertext = o.encrypt(plaintext) assert (ciphertext.encode('hex') == 'fe4877546196cf4d9b14c6835fdeab1a' * 3) assert len(ciphertext) == len(plaintext) assert ciphertext != plaintext # almost always true decrypted = o.decrypt(ciphertext) assert plaintext == decrypted print 'benchmarking' plaintext = ''.join(map(chr, xrange(237)) + map(chr, xrange(256))) * 9 * 16 assert len(plaintext) == 70992 for i in xrange(1000): assert plaintext == o.decrypt(o.encrypt(plaintext))

Example Python code using the AES implementation in PyCrypto:

#! /usr/bin/python2.4 # by pts@fazekas.hu at Sat Nov 7 12:04:44 CET 2009 # based on # http://www.codekoala.com/blog/2009/aes-encryption-python-using-pycrypto/ # Download installer from # http://ftp.dlitz.net/pub/dlitz/crypto/pycrypto/pycrypto-2.1.0b1.tar.gz from Crypto.Cipher import AES # Must be 16, 24 or 32 bytes. key = '(Just an example for testing :-)' # Must be a multiple of 16 bytes. plaintext = 'x' * 16 * 3 o = AES.new(key) # This uses ECB (simplest). PyCrypto aes supports CBC (with AES.new(key, # aes.MODE_ECB)) as well. ciphertext = o.encrypt(plaintext) assert (ciphertext.encode('hex') == 'fe4877546196cf4d9b14c6835fdeab1a' * 3) assert len(ciphertext) == len(plaintext) assert ciphertext != plaintext # almost always true decrypted = o.decrypt(ciphertext) assert plaintext == decrypted print 'benchmarking' plaintext = ''.join(map(chr, xrange(237)) + map(chr, xrange(256))) * 9 * 16 assert len(plaintext) == 70992 for i in xrange(1000): assert plaintext == o.decrypt(o.encrypt(plaintext))

Please note how similar the two example codes are. (Only the import and the object creation are different.)

On an Intel Centrino T2300 1.66GHz system, PyCrypto seems to be about 8% faster than alo-aes. The alo-aes implementation is smaller, because it contains only AES.

## No comments:

Post a Comment