AES加密数据块分组长度必须为128比特,密钥长度可以是128比特、192比特、256比特中的任意一个(如果数据块及密钥长度不足时,会补齐)。AES加密有很多轮的重复和变换。大致步骤如下:1、密钥扩展(KeyExpansion),2、初始轮(Initial Round),3、重复轮(Rounds),每一轮又包括:SubBytes、ShiftRows、MixColumns、AddRoundKey,4、最终轮(Final Round),最终轮没有MixColumns。
AES的加密解密方法如下,其中password只能是16,24或32位的字符串。
# encoding:utf-8 from Crypto.Cipher import AES from Crypto import Random def encrypt(data, password): bs = AES.block_size pad = lambda s: s + (bs - len(s) % bs) * chr(bs - len(s) % bs) iv = Random.new().read(bs) cipher = AES.new(password, AES.MODE_CBC, iv) data = cipher.encrypt(pad(data)) data = iv + data return data def decrypt(data, password): bs = AES.block_size if len(data) <= bs: return data unpad = lambda s : s[0:-ord(s[-1])] iv = data[:bs] cipher = AES.new(password, AES.MODE_CBC, iv) data = unpad(cipher.decrypt(data[bs:])) return data if __name__ == '__main__': data = 'hello world' password = '1111111111111111' #16,24,32位长的密码 encrypt_data = encrypt(data, password) print 'encrypt_data:', encrypt_data decrypt_data = decrypt(encrypt_data, password) print 'decrypt_data:', decrypt_data
如果提示没有Crypto导致执行失败,可以使用pip install pycrypto安装相应模块解决问题。
执行结果如下:
版权声明:本文为博主原创文章,未经博主允许不得转载。
时间: 2024-10-27 02:55:28