AES算法
高级加密标准(Advanced Encryption Standard,缩写:AES),在密码学中又称Rijndael加密法,是美国联邦政府采用的一种区块加密标准。这个标准用来替代原先的DES,已经被多方分析且广为全世界所使用。严格地说,AES和Rijndael加密法并不完全一样(虽然在实际应用中二者可以互换),因为Rijndael加密法可以支持更大范围的区块和密钥长度:AES的区块长度固定为128 比特,密钥长度则可以是128,192或256比特;而Rijndael使用的密钥和区块长度可以是32位的整数倍,以128位为下限,256比特为上限。包括AES-ECB,AES-CBC,AES-CTR,AES-OFB,AES-CFB。
经过五年的甄选流程,高级加密标准由美国国家标准与技术研究院(NIST)于2001年11月26日发布于FIPS PUB 197,并在2002年5月26日成为有效的标准。2006年,高级加密标准已然成为对称密钥加密中最流行的算法之一。
一. 算法流程
AES加密算法涉及4种操作:字节替代(SubBytes)、行移位(ShiftRows)、列混淆(MixColumns)和轮密钥加(AddRoundKey)。下图给出了AES加解密的流程,从图中可以看出:
(1)解密算法的每一步分别对应加密算法的逆操作
(2)加解密所有操作的顺序正好是相反的。正是由于这几点(再加上加密算法与解密算法每步的操作互逆)保证了算法的正确性。加解密中每轮的密钥分别由种子密钥经过密钥扩展算法得到。算法中16字节的明文、密文和轮子密钥都以一个4x4的矩阵表示。
- AddRoundKey (轮密钥加)— 矩阵中的每一个字节都与该次轮秘钥(round key)做XOR运算;每个子密钥由密钥生成方案产生。
- SubBytes(字节替代) — 通过非线性的替换函数,用查找表的方式把每个字节替换成对应的字节。
- ShiftRows(行移位) — 将矩阵中的每个横列进行循环式移位。
- MixColumns (列混淆)— 为了充分混合矩阵中各个直行的操作。这个步骤使用线性转换来混合每列的四个字节。
以上为AES在加密中的大致流程。
二.代码实现加密解密(python实现)
注意:在使用之前请安装库:pycryptodome
加密过程如下:
import base64
from Crypto.Cipher import AES
# 加密函数,如果text不是16的倍数,那就补足为16的倍数
# 加密文本text必须为16的倍数
def encrypt(text):
while len(text) % 16 != 0:
text += '\0'
return str.encode(text) # 返回bytes
key = input("请输入密码:")
text = input("请输入待加密文本:")
aes = AES.new(encrypt(key), AES.MODE_ECB) # 初始化加密器
encrypted_text = str(base64.encodebytes(aes.encrypt(encrypt(text))),encoding='utf8').replace('\n', '') # 加密
print('加密值:', encrypted_text)
print('注意:加密值已转化为base64')
运行结果如下图:
使用解密脚本验证加密是否成功
import base64
from Crypto.Cipher import AES
def encrypt(text):
while len(text) % 16 != 0:
text += '\0'
return str.encode(text)
key = input("请输入密码:")
text = input("请输入待解密文本:")
aes = AES.new(encrypt(key), AES.MODE_ECB)
text_decrypted = str(
aes.decrypt(base64.decodebytes(bytes(text, encoding='utf8'))) .rstrip(b'\0').decode("utf8")) # 解密
print('原文为:', text_decrypted)
运行结果如下图:
与我们加密时原文相同,证明加密成功。
三.AES的数学基础
1. 有限域GF(28):特征为2的具有28元素的有限域
有限域中的元素表示方法:
① 二进制表示法(字节表示):字节B=b7b6b5b4b3b2b1b0=01010111 ② 十六进制表示法:“57”
③ 多项式表示法:b7x7b6x6b5x5b4x4b3x3b2x2b1x1b0x0“57”表示为x6+x4+x2+x+1 2. 字节运算:有限域GF(28)上的运算
在多项式表示中,GF(28)上两个元素的和仍然是一个次数不超过7的多项式,其系数等于两个元素对应系数的模2加(比特异或)。由于每个元素的加法逆元等于自己,所以减法和加法相同。
要计算GF(28)上的乘法,必须先确定一个GF(2) 上的8次不可约多项式;GF(28)上两个元素的乘积就是这两个多项式的模乘(以这个8次不可约多项式为模)。
在Rijndael密码中,这个8次不可约多项式确定为m(x)= x8+x4+x3+x+1十六进制表示为‘11B’。
3. AES的字表示与运算
AES处理的单位是字节和字,字是4个字节构成的向量。一个字表示为系数在GF(28)上的次数小于4的多项式。
字加法:两多项式系数按位模2 加;
字乘法:设ac是两个字,a(x)和c(x)是其字多项式,乘积为a(x)c(x)mod(x4+1)
附上一个在线加密解密的网站:http://tool.chacuo.net/cryptaes
如需转载,请注明原文出处,作者:vergilben,郭三褶