C语言实现AES(标准方法)

代码位置:https://github.com/zhouyangchao/AES

支持128bit/192bit/256bit加密,已通过测试,跟标准实现结果一致。

test_case需要安装CUnit库,sample程序演示了libaes.so的使用方法。


具体原理我就不罗嗦了,可以看这里:http://zh.wikipedia.org/wiki/高级加密标准

下面是128bit的加解密流程图:

C语言实现AES(标准方法)_第1张图片


192bit/256bit的加密过程基本一致,只是轮数更多,对应的参数如下:

C语言实现AES(标准方法)_第2张图片


可以看到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的字数组,如下所示:

C语言实现AES(标准方法)_第3张图片


具体实现最好还是参考代码,每个过程都能找到对应的函数。

里面的sample程序演示了使用方法。

你可能感兴趣的:(算法,Linux,C/C++,AES)