PHP-AES标准Rijndael算法

1.前言

AES( Advanced Encryption Standard )高级加密标准,又称 Rijndael加密法。它是由 美国国家标准与技术研究院 (NIST)于2001年11月26日发布于FIPS PUB 197,并在2002年5月26日成为有效的标准 。 该算法由比利时密码学家Joan Daemen和Vincent Rijmen所设计,结合两位作者的名字 而命名。AES标准支持固定分组128位,密钥长度可以是128位、192位、256位。

2.工作模式

我们知道,对明文进行加密的过程中,如果明文超过了分组大小,那么就需要进行切割处理,而AES提供给我们多种工作模式,分别是:ECB(电子密码本)、CBC(密文分组链接)、CFB(密文反馈)、OFB(输出反馈)、CTR(计数器),而我们今天只针对128位的明文进行加密解密处理,分组工作模式不在我们今天讨论的范畴。

3.介绍

3.1 状态矩阵

AES算法中的状态矩阵是垂直排列的,如下图所示。

明文第一步需要转换成状态矩阵,而初始密钥在进行扩展密钥之前也需要转化成状态矩阵。在对密文进行解密时,最后需要将状态矩阵还原为明文矩阵。

3.2 密钥扩展

密钥扩展会生成44组4个字节的轮密钥,每16个字节为1轮密钥,在进行轮密钥加的时候,需要将处理过的明文状态矩阵根据每轮的密钥进行加密处理。下面我们来看一个例子,假如初始密钥16位为: abcdefghijklmnop ,那么它的初始轮密钥如下所示:

接下来还需要生成40组W,计算公式如下:

W[n] = W[n-4] xor W[n-1] (if n%4 !== 0)

W[n] = W[n-4] xor 字节替换(循环左移1位(W[n-1])) xor 轮常量[(n/4) – 1] (if n%4 === 0)

循环左移:如0x12345678 => 0x34567812

轮常量是固定的数组如下所示:

3.3 字节替换

字节替换,是利用AES提供的S盒来进行替换的,其中高4位代表行数,而低4位则代表列数。在解密时,也用相同的规则在S逆盒中进行替换还原。

3.4 行移位

行移位第0行无需移动,第i行则向左循环移动i次,解密时则向右循环移动i次。下面时一个例子:

3.5列混合

列混合的操作是基于有限域伽罗华域的计算,详情请参考:https://www.cnblogs.com/pitmanhuang/p/16175550.html

在进行列混合操作时,将状态矩阵与固定的常量矩阵进行有限域的乘积,将结果异或得出列混合后的值。其中加密和解密的常量值数组是不同的,它们分别为:

4.代码示例

 

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注