AES属于一种对称加密算法,每4*4字节矩阵为一体进行加密,加密模式有CBC、ECB、CFB、PGP、OFB、CTR、OPENPGP七种之多,本篇主讲目前广泛使用的CBC模式。
CBC模式必须要有Key(密钥)和IV(偏移量),Key字节长度可以是16位(AES-128)、24位(AES-192)、32位(AES-256),IV字节长度必须为16位。因AES算法会将明文分为若干4*4字节矩阵,所以明文(Source)的字节长度必须为16字节的倍数,如不足16位倍数后面填充0(Padding)。
Python要使用AES加解密需要安装Crypto(py2.7)或者pycryptodome(py3.5+)
# py 2.7
pip install Crypto
# py 3.5+
pip install pycryptodome
Demo:
#coding=utf-8
from Crypto.Cipher import AES
from Crypto.Random import get_random_bytes
def padding(t):
# 字节长度不足16位倍数后面补0
p = len(t) % 16
if p:
return t + ('\0' * (16 - p))
return t
def encrypt(text, key, iv):
encrypted_text = AES.new(key, AES.MODE_CBC, iv).encrypt(padding(text))
return encrypted_text
def decrypt(text, key, iv):
plain_text = AES.new(key, AES.MODE_CBC, iv).decrypt(text)
return plain_text
if __name__ == "__main__":
text = 'aes demo'
# key的字节长度必须为16(*AES-128*)、24(*AES-192*)、32 (*AES-256*)
key = get_random_bytes(16)
# iv的字节长度必须为16
iv = get_random_bytes(16)
encrypted_text = encrypt(text, key, iv)
# 将字节转为16进制字符串
print encrypted_text.encode('hex')
plain_text = decrypt(encrypted_text, key, iv)
print plain_text.decode('utf-8')
不足之处请指教。