背景
由于项目需要,需要在STM32F10x上进行AES-128-CTR解密,怎奈网上资料鱼龙混杂,花费了两天时间才真正找到实现方法。我首先根据甲方提供的信息找到了openssl库,虽然这个库的源代码是C语言写的,但是这个库只适合用在PC机上,根本无法移植到单片机上。在我陷入绝境时偶然看到一篇大神的文章,遭遇和我相同。。。同样历经艰苦才找到解决方案,在此特别感谢,附上连接https://blog.csdn.net/qq_31878855/article/details/69396791。根据这篇文章我终于找到了希望。使用了ST官方的亲儿子库进行解码测试,在解码测试过程中又遇到了一些编码问题,最后终于解决了,终于雨过天晴可以开始新的一天了。
移植库
首先下载官方库stm32-cryp-lib,下载完成解压后可以找到加密解密库,并且还有一些官方给出的例程。
根据这个main函数就可以把相关代码移植到项目中,
移植时只需要将相应的加密库STM32_Cryptographic_Library复制到项目文件目录下,
然后添加头文件引用
#include "crypto.h"
.c文件是不存在的,ST已经将.c问价打包成了库
在keil中添加.lib库的方法是直接添加库文件即可使用库中的函数。
关于不同库文件的适用可以查看官方使用手册
主要包括两个函数
- 加密函数
int32_t STM32_AES_CTR_Encrypt(uint8_t* InputMessage, //输入明文
uint32_t InputMessageLength,
uint8_t *AES128_Key, //key
uint8_t *InitializationVector,
uint32_t IvLength, //iv
uint8_t *OutputMessage, //输出密文
uint32_t *OutputMessageLength);
- 解密函数
int32_t STM32_AES_CTR_Decrypt(uint8_t* InputMessage,
uint32_t InputMessageLength,
uint8_t *AES128_Key,
uint8_t *InitializationVector,
uint32_t IvLength,
uint8_t *OutputMessage, //输出解密的明文
uint32_t *OutputMessageLength);
此时又出现一个问题,客户传来的是加密后的base64编码格式的密文
直接输入到解密函数解密失败,那就需要先进行base64解码,关于解码可以看我的另一篇文章https://mp.csdn.net/mdeditor/102650833#,完成解码,将得到的字符数组转为10进制保存输入到解密函数才能得到对应的明文。
base64_decode(Base64_miwen, Base64_jiema,&DecNumberLength);
for(i=0;i<DecNumberLength;i++){
DecNumber[i] = Base64_jiema[i];
}
进行最终测试
- 首先需要用在线加密网站加密一串字符,在线加密网站http://tool.chacuo.net/cryptaes
- 将密文输入到程序中
char Base64_miwen[] = "+aYwiUJf84DVOqbcS1FVjrDMjAyd1fZw2XFL1bFYQUE=";
unsigned char Base64_jiema[PLAINTEXT_LENGTH];
- 编译程序,下载,通过串口打印结果