“2025年的第一篇Blog”
前言
有些敏感信息在上传内容时需要AES加密和哈希函数,本着不重复造轮子的宗旨,就上ST官网找了一下有没有相关的加密库能拿来直接用。
结果找到了STM32CubeExpansion_Crypto库,下面我将记录一下我如何移植的库和移植过程中遇到的问题。
正文
一、下载官方库文件
进入到ST官网,找到库的描述和下载界面
从描述可以看出,这个库几乎支持所有常见的加解密方式,对stm32的型号支持也非常的全面。

这里我选择的版本是V4.3.0,下载后解压会得到一个名为STM32CubeExpansion_Crypto_V4.3.0的文件夹
二、移植库文件
打开下载的文件夹后,里面包含:
- 内核驱动
- 加密库
- 各个MCU开发板的例程

其中我们需要做的就是把加密库移植到我们自己的工程中:
-
复制Middlewares文件夹至本地工程的根目录中

-
添加include文件至工程设置

-
添加所需文件至工程目录
下图这个文件是加密库中就有的,我们只需要选择对应的内核添加就可以

还有一个cmox_low_level.c文件,需要我们从例程中复制出来到自己的文件夹中,这个文件里面是加密库初始化时需要用到的函数。
-
添加加密库初始化时需要的函数
由于加密库的使用需要硬件CRC的功能,所以我们需要打开cmox_low_level.c文件,添加CRC使能函数,这里我使用的是HAL库,所以就使能了CRC的功能和时钟。可以根据自己工程的使用情况添加CRC的使能函数。

也同样是因为加密库用到了硬件CRC,我踩了一个小坑。
因为工程中使用了MODBUS通讯,所以CRC被我初始化成了CRC-16的模式。
最终导致我移植完测试的时候,发现加密最终结果并不是正确的。
让我屏蔽了CRC初始化后,结果回复正常。
所以得出加密过程中需要CRC是默认配置下才能输出正确的密文。
我的解决方案是:在加密函数执行前,初始化CRC成默认配置,加密完成后再恢复成CRC-16。
CRC默认配置如下(HAL库):
CRC_HandleTypeDef tmp_hcrc; tmp_hcrc.Instance = CRC; tmp_hcrc.Init.DefaultPolynomialUse = DEFAULT_POLYNOMIAL_ENABLE; tmp_hcrc.Init.DefaultInitValueUse = DEFAULT_INIT_VALUE_ENABLE; tmp_hcrc.Init.InputDataInversionMode = CRC_INPUTDATA_INVERSION_NONE; tmp_hcrc.Init.OutputDataInversionMode = CRC_OUTPUTDATA_INVERSION_DISABLE; tmp_hcrc.InputDataFormat = CRC_INPUTDATA_FORMAT_BYTES; if (HAL_CRC_Init(&tmp_hcrc) != HAL_OK) { return 1; }
三、测试移植结果
测试哈希函数SHA-256的计算结果:经比对结果正确

总结
成功移植ST官方加密库,总的来说移植过程还是比较简单的,没有遇到什么比较大的坑。
ST的官方例程给的也是比较详细,比对官方例程很容易进行移植。