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 ] <<