aes(英文:advanced encryption standard,中文:高级加密标准),是一种区块加密标准。aes将原始数据分成多个4×4字节矩阵来处理,通过预先定义的密钥对每个字节矩阵中的每个字节进行异或、替换、移位以及线性变换操作来达到加密的目的。密钥长度可以是128,192或256比特。
下面是一个利用python m2crypto库,并使用aes_128_ecb算法进行加密和解密的例子。首先介绍一下几个关键的点:
1、iv(initialization vector),即初始化向量,用于避免相同的数据多次加密都产生相同的密文。最大长度为16字节,超出16字节部分会被忽略,最好是随机产生以增加加密的强度。
2、ecb (electronic codebook,ecb),它会对每个4×4字节矩阵都用同一个密钥进行加密,而且沒有使用 iv。优点是每个字节矩阵都可以独立进行加密,因此可以同时对每个字节矩阵进行加密;缺点是对于相关的数据,加密之后的密文都是一样的。
3、padding,由于aes是以4×4字节矩阵作为单位进行处理,因为待加密数据必须是16的倍数,若不足16的倍数,将会进行填充操作。aes_128_ecb算法加密默认填充模式是pkcs5。
from m2crypto.evp import cipher
from m2crypto import m2
from m2crypto import util
encrypt_op = 1 # 加密操作
decrypt_op = 0 # 解密操作
iv = ‘\0’ * 16 # 初始化变量,对于aes_128_ecb算法无用
private_key = ‘dd7fd4a156d28bade96f816db1d18609’ # 密钥
def encrypt(data):
‘使用aes_128_ecb算法对数据加密’
cipher = cipher(alg = ‘aes_128_ecb’, key = private_key, iv = iv, op = encrypt_op)
buf = cipher.update(data)
buf = buf + cipher.final()
del cipher
# 将明文从字节流转为16进制
output = ”
for i in buf:
output += ‘%02x’ % (ord(i))
return output
def decrypt(data):
‘使用aes_128_ecb算法对数据解密’
# 将密文从16进制转为字节流
data = util.h2b(data)
cipher = cipher(alg = ‘aes_128_ecb’, key = private_key, iv = iv, op = decrypt_op)
buf = cipher.update(data)
buf = buf + cipher.final()
del cipher
return buf