代码位置:https://github.com/zhouyangchao/AES
支持128bit/192bit/256bit加密,已通过测试,跟标准实现结果一致。
test_case需要安装CUnit库,sample程序演示了libaes.so的使用方法。
具体原理我就不罗嗦了,可以看这里:http://zh.wikipedia.org/wiki/高级加密标准
下面是128bit的加解密流程图:
192bit/256bit的加密过程基本一致,只是轮数更多,对应的参数如下:
可以看到AES主要由四个子过程(以及逆过程)组成:
add_round_key(轮密钥加):当前分组和轮密钥按位进行异或;
sub_bytes(字节替换):用一个256长度的S盒进行分组的字节替换;
shift_rows(行位移):将操作块矩阵转置后进行行位移,再转置回来; mix_columns(列混淆):利用域GF(2
8)上的算数特性进行替代。
具体实现可以参考源码中对应的函数实现,以及对应的逆过程实现。
扩展密钥的生成,也可以参考实现代码,伪代码如下:
key_expansion (uint8_t key[(Nr-6)*4], uint32_t expanded_key[(Nr+1)*4]
{
do {
GET_UINT32(expanded_key[i], key, i*4);
} while(++i < Nk);
do {
temp = expanded_key[i-1];
if ((i%Nk) == 0)
temp = SUB_WORD(ROTL8(temp)) ^ RCON[i/Nk-1];
else if ((Nk == 8 && (i%Nk) == 4)
temp = SUB_WORD (temp);
expanded_key[i] = expanded_key[i-Nk]^temp;
} while (++i < (Nr+1)*4);
}
其中的GET_UINT32将4字节数据写入一个字(4字节);SUB_WORD是对字的每个字节进行S盒替换;ROTL8对字循环左移一个字节。RCON(轮常量)是一个长度为10的字数组,如下所示:
具体实现最好还是参考代码,每个过程都能找到对应的函数。
里面的sample程序演示了使用方法。