c语言aes填充方式,C语言实现AES(标准方法)

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

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

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

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

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

70954f10909db6034e3f348237b02857.png

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

c4772ed81776851315c051dd042fc160.png

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

5c344bd2531b885558c44fc342208536.png

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

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值