AES 加密解密
高级加密标准(Advanced Encryption Standard,AES)
一、DES 与 AES 比较:
1、DES 采用 56位有效**,AES 采用 多种 **长度
2、DES 对 64位分组数据进行加密,AES对 128位分组数据进行加密
3、不同于 DES ,AES 不是采用 Feistel 结构,而是置换-组合结构
4、DES 中大量的位操作在软件实现方面不是非常方便,而AES 采用了字节操作。
二、图示 AES 加密过程:
对不同长度的**,AES采用不同的加密轮次:
128位 | 192位 | 256位 |
10 | 12 | 14 |
加密过程下面有个视频,我觉得讲得很详细。
三、某些细节:
①: **扩展:简单说就是将原来的**扩展到足够用的长度。
128位**: 扩展到 44字(176字节)
192位**: 扩展到 13*4 = 52 字
256位**: 扩展到 15*4 = 60 字
扩展过程请参考代码(不贴出来)和视频。 fun_KeyExpansion()
②: 轮**加:只是将 数据块和 该轮的**进行异或运算 。
③:字节替换:有个S盒可以进行替换。(相对于 DES 的替换 ,感觉这个函数的实现是小儿科 )
比如现在有一个字节为: 0x19 (16进制!) 则替换为 0xd4
④: 行移位:分成 4 行 第一行不用移位,第二循环左移 8 位 (一个字节 !) 第三行循环移2个字节,第四行移3个字节。
⑤: 列混淆:这里采用了 上的乘法 。
#define GF_01(b) ((byte)b) #define GF_02(b) ((byte)((b < 0x80)? ((b<<1)) : (((b<<1) ^ 0x1b)))) #define GF_03(b) ((byte)(((GF_02(b)))^ (( b))))
这几个宏定义,定义了几个运算 而计算过程参考下图和 线性代数知识。
解密过程调用函数不同,理解了加密解密只是一个逆过程。
四、实现过程的一些解释:
①:首先数据在内存中存放方式:
②:行移位的时候采用按字操作,需要注意字有大小端之分:使用宏定义<Little_Endian> 进行控制