AES简介
高级加密标准(Advanced Encryption Standard,AES),在密码学中又称Rijndael加密法,是美国联邦政府采用的一种区块加密标准。这个标准用来替代原先的DES,已经被多方分析且广为全世界所使用。经过五年的甄选流程,高级加密标准由美国国家标准与技术研究院(NIST)于2001年11月26日发布于FIPS PUB 197,并在2002年5月26日成为有效的标准。2006年,高级加密标准已然成为对称密钥加密中最流行的算法之一。
AES基于被称为代换-置换网络的设计原理,代换和置换的组合,并且在软件和硬件中都很能有效实现,与其前身DES不同,AES不使用Feistel网络。AES是Rijndael的变体,其固定块大小为128位,密钥大小为128,192或256位。 相比之下,Rijndael规范本身是以块和密钥大小来指定的,这些大小可以是32位的任意倍数,最小值为128,最多为256位。
AES操作建立在称为“State”(状态)的4×4列的列主序字节矩阵,尽管某些版本的Rijndael具有较大的块大小,并且在该状态中具有其他列。大多数AES计算是在特定的有限域中完成的。
举个例子,这里有16个字节b0,b1,……,b15,用矩阵表示为:
AES是一个迭代性密码,轮数取决于密钥长度,轮数如下:
- 密钥长度为128比特,则轮数为10
- 密钥长度为192比特,则轮数为12
- 密钥长度为256比特,则轮数为14
每轮由几个处理步骤组成,每个处理步骤包含四个相似但不同的阶段,包括依赖于密钥本身的阶段。 使用一组反向轮来用相同的密钥将密文转换回原始明文。
加解密过程
AES的加密过程描述如下:
KeyExpansions—轮密钥使用Rijndael算法的密钥编排密码密钥导出。AES需要为每个回合加一个单独的128位的循环密钥块。
InitialRound
- AddRoundKey—状态的每个字节用按位异或的轮密钥块组合
Rounds
- SubBytes—非线性替代步骤,其中根据查找表将每个字节替换为另一个。
- ShiftRows—一种转置步骤,其中状态的最后三行循环地移动一定数量的步骤。
- MixColumns—混合操作,其操作在状态的列上,组合每列中的四个字节。
- AddRoundKey
Final Round (no MixColumns)
- SubBytes
- ShiftRows
- AddRoundKey
SubBytes
操作SubBytes使用一个S盒对State的每一个字节都进行一个独立的代换,其中S盒是一个16*16的矩阵,其中行号和列号都用十六进制表示。
比如:00通过S盒的代换为S[0][0]=63。若是逆向字节替换,那么S-1[6][3]=00
S盒的矩阵表示为:
// 0 1 2 3 4 5 6 7 8 9 a b c d e f
0x63, 0x7c, 0x77, 0x7b, 0xf2, 0x6b, 0x6f, 0xc5, 0x30, 0x01, 0x67, 0x2b, 0xfe, 0xd7, 0xab, 0x76, // 0
0xca, 0x82, 0xc9, 0x7d, 0xfa, 0x59, 0x47, 0xf0, 0xad, 0xd4, 0xa2, 0xaf, 0x9c, 0xa4, 0x72, 0xc0, // 1
0xb7, 0xfd, 0x93, 0x26, 0x36, 0x3f, 0xf7, 0xcc, 0x34, 0xa5, 0xe5, 0xf1, 0x71, 0xd8, 0x31, 0x15, // 2
0x04, 0xc7, 0x23, 0xc3, 0x18, 0x96, 0x05, 0x9a, 0x07, 0x12, 0x80, 0xe2, 0xeb, 0x27, 0xb2, 0x75, // 3
0x09, 0x83, 0x2c, 0x1a, 0x1b, 0x6e, 0x5a, 0xa0, 0x52, 0x3b, 0xd6, 0xb3, 0x29, 0xe3, 0x2f, 0x84,