【密码学】AES加解密原理及其C++实现算法

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加解密流程

AES的加密过程描述如下:

  1. KeyExpansions—轮密钥使用Rijndael算法的密钥编排密码密钥导出。AES需要为每个回合加一个单独的128位的循环密钥块。

  2. InitialRound

    1. AddRoundKey—状态的每个字节用按位异或的轮密钥块组合
  3. Rounds

    1. SubBytes—非线性替代步骤,其中根据查找表将每个字节替换为另一个。
    2. ShiftRows—一种转置步骤,其中状态的最后三行循环地移动一定数量的步骤。
    3. MixColumns—混合操作,其操作在状态的列上,组合每列中的四个字节。
    4. AddRoundKey
  4. Final Round (no MixColumns)

    1. SubBytes
    2. ShiftRows
    3. 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, 
  • 6
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值