0.引言
对于加密算法的软件实现,通常已经有很多的成熟的库可供选择,只需要根据自己的要求进行选择即可相应的库即可(有的可能需要进行些许修改)。这里选择的是C语言实现的一个开源密码库mbedTLS,mbedTLS由XySSL发展而来,后改为PolarSSL,PolarSSL被ARM公司收购后改成了mbedTLS,主要用于物联网等安全嵌入式领域。mbedTLS实现了常见的分组加密算法、hash算法、RSA以及ECC公钥密码体制,一个适用于嵌入式的SSL协议以及X509证书等,基本能够满足大部分的嵌入式安全应用。
1.AES加密算法代码分析
这里不再详细的介绍AES的数学原理以及设计思路等,只是结合软件进行代码分析,关于AES的官方文档可以在NIST网站上下载得到。
1)数据结构
数据结构与算法密切相关,通常分组加密算法定义的数据结构都较为类似,mbedTLS的AES定义了如下数据结构:
typedef struct { int nr; /*!< number of rounds */ uint32_t *rk; /*!< AES round keys */ uint32_t buf[68]; /*!< unaligned data */ } mbedtls_aes_context;
2)算法主体
分组加密算法的软件实现通常会采用“查找表”的方式来提高算法的运算速度,通过表格或者预计算表格直接查表得到对应的算法运算结果。
对算法的分析仅仅以加密算法为例,解密算法的过程基本类似,只是前向表格改为逆向表格而已。
下面先给出代码再进行分析:
1 void mbedtls_aes_encrypt( mbedtls_aes_context *ctx, 2 const unsigned char input[16], 3 unsigned char output[16] ) 4 { 5 int i; 6 uint32_t *RK, X0, X1, X2, X3, Y0, Y1, Y2, Y3; 7 8 RK = ctx->rk; 9 10 GET_UINT32_LE( X0, input, 0 ); X0 ^= *RK++; 11 GET_UINT32_LE( X1, input, 4 ); X1 ^= *RK++; 12 GET_UINT32_LE( X2, input, 8 ); X2 ^= *RK++; 13 GET_UINT32_LE( X3, input, 12 ); X3 ^= *RK++; 14 15 for( i = ( ctx->nr >> 1 ) - 1; i > 0; i-- ) 16 { 17 AES_FROUND( Y0, Y1, Y2, Y3, X0, X1, X2, X3 ); 18 AES_FROUND( X0, X1, X2, X3, Y0, Y1, Y2, Y3 ); 19 } 20 21 AES_FROUND( Y0, Y1, Y2, Y3, X0, X1, X2, X3 ); 22 23 X0 = *RK++ ^ \ 24 ( (uint32_t) FSb[ ( Y0 ) & 0xFF ] ) ^ 25 ( (uint32_t) FSb[ ( Y1 >> 8 ) & 0xFF ] <<

本文分析了mbedTLS库中AES加密算法的C语言实现,重点介绍了数据结构、算法主体,包括轮密钥加、轮变换过程,并详细解释了查找表在提高运算速度中的作用。此外,还探讨了有限域运算在预计算过程中的应用,如对数表用于有限域的乘法操作。
最低0.47元/天 解锁文章
963

被折叠的 条评论
为什么被折叠?



