AES算法 —— 原理以及实现

版权声明:如需转载,请注明原文出处,作者:vergilben https://blog.csdn.net/weixin_42751456/article/details/89192531

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的矩阵表示。

AES算法

  1. AddRoundKey (轮密钥加)— 矩阵中的每一个字节都与该次轮秘钥(round key)做XOR运算;每个子密钥由密钥生成方案产生。
  2. SubBytes(字节替代) — 通过非线性的替换函数,用查找表的方式把每个字节替换成对应的字节。
  3. ShiftRows(行移位) — 将矩阵中的每个横列进行循环式移位。
  4. 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,郭三褶

猜你喜欢

转载自blog.csdn.net/weixin_42751456/article/details/89192531
今日推荐