AES算法识别:
1 字节替换
字节替换就是个查表操作 data = table[ ( data >> 4 ) & 0xF ] [ data & 0xF ]
2 行移位
IDA中行移位常见的形式有两种:
移位特征为 :
5 -> 1 , 9 -> 5 , 13 -> 9 , 1 -> 13
10 -> 2 , 14 -> 6 , 2 -> 10 , 6 -> 14
3 -> 7 , 7 -> 11 , 11 -> 15 , 15 -> 3
密钥:密钥长度可以是16字节,24字节,32字节(128位,192位,256位)。根据密钥的长度,算法被分为AES-128、AES-192、AES-256。
填充:
1 AES是以16字节为单位进行加密,故不足16字节需要进行填充
2 除了NONE以外,其他任何模式及时满足16的倍数也要进行填充(PKCS7填充16个0x10)
NONE | 不允许明文长度不是16的倍数 | # |
PKCS7 | 缺多少就补多少个字节的缺量 | 04 04 04 04 |
ZERO | 全补0 | 00 00 00 00 |
ANSI923 | 缺的最后补缺数,其他补0 | 00 00 00 04 |
ISO7816_4 | 缺的第一位补80,其他补00 | 80 00 00 00 |
ISO10126 | 缺的最后一位部缺数,其他补随机数 | 12 87 55 04 |
三种解密方式比较:
密钥长度 | 循环次数 | 密钥拓展长度 | |||
AES-128 | 16字节(4*4) | 10轮,最后一轮没有列混淆 | 176(11*16) | ||
AES-192 | 24字节(4*6) | 12轮,最后一轮没有列混淆 | 208(13*16) | ||
AES-256 | 32字节(4*8) | 14轮,最后一轮没有列混淆 | 240(15*16) |
明文分组排列方式:
0 | 4 | 8 | c |
1 | 5 | 9 | d |
2 | 6 | a | e |
3 | 7 | b | f |
密钥扩展:
1 密钥扩展就是把16 24 32字节的密钥扩展成176(11*16) 208(13*16) 240(15*16)字节的轮密钥,
11*16的11是怎么来的,如下图,共有11次轮密钥加,所以是11*16
* 密钥扩展时会暴露原始密钥
* 由于原始密钥会在拓展密钥的前面,所以AES-128中第一次轮密钥加用到的密钥就是原始密钥
2 nk值16/4=4 24/4=6 32/4=8
加密器:
轮密钥加:
1 第一次轮密钥加时能定位明文
CBC模式:
1 比ECB多一个16字节的初始向量IV,第一次进入加密器之前,先使用IV对明文分组1进行异或运算,之后进入加密器之前使用上一次加密的密文分组对明文分组进行异或运算
IV ^ 明文分组1 >> 加密器 >> 密文1
密文1 ^ 明文分组2 >> 加密器 >> 密文2
密文2 ^ 明文分组3 >> 加密器 >> 密文3