)
STM32F103CBT6实战mbedtls v2.24.0的SHA1加密从零实现在物联网设备开发中数据安全传输是基础要求。SHA1作为经典哈希算法虽然已不推荐用于高安全场景但在资源受限的STM32F103CBT6这类Cortex-M3内核MCU上仍是验证加密库移植的理想起点。本文将手把手带你在72MHz主频的STM32F103上用mbedtls v2.24.0实现字符串SHA1加密并通过串口输出验证结果。1. 环境准备与工程创建1.1 硬件与工具链配置所需物料清单STM32F103CBT6最小系统板64KB Flash/20KB RAMST-Link V2调试器USB-TTL串口模块用于输出调试信息开发环境配置步骤安装Keil MDK 5.29需包含STM32F1xx Device Family Pack下载STM32CubeMX 6.0.1获取mbedtls 2.24.0源码包 官方GitHub发布页 # 示例Linux下获取源码 wget https://github.com/ARMmbed/mbedtls/archive/refs/tags/v2.24.0.tar.gz tar -xzvf v2.24.0.tar.gz1.2 CubeMX基础工程生成新建Project选择STM32F103CBTx型号配置时钟树HSE 8MHz → PLLCLK 72MHzSYSCLK 72MHzAPB1 Prescaler /2 (36MHz)启用USART1波特率1152008数据位/无校验生成MDK-ARM工程时勾选Copy only necessary library files注意务必在Project Manager选项卡中勾选Generate peripheral initialization as a pair of .c/.h files以保持代码整洁。2. mbedtls库裁剪与移植2.1 源码目录结构整合将下载的mbedtls-2.24.0解压后按以下结构组织工程文件Your_Project/ ├── Core/ ├── Drivers/ ├── mbedtls/ │ ├── include/ # 头文件 │ └── library/ # 源文件 └── MDK-ARM/关键操作// 在main.h中添加全局宏定义 #define MBEDTLS_CONFIG_FILE mbedtls/config-mini-tls1_1.h2.2 配置文件优化修改config-mini-tls1_1.h实现最小功能集/* System support */ #define MBEDTLS_HAVE_ASM //#define MBEDTLS_HAVE_TIME // 注释掉时间相关功能 /* mbed TLS modules */ #define MBEDTLS_SHA1_C // 启用SHA1模块 #define MBEDTLS_MD_C #define MBEDTLS_NO_PLATFORM_ENTROPY // 关键禁用平台熵源需要添加到Keil工程的源文件清单mbedtls/library/sha1.cmbedtls/library/md.cmbedtls/library/platform.c3. SHA1功能实现与验证3.1 串口重定向配置在main.c中添加标准IO重定向/* USER CODE BEGIN 4 */ #include stdio.h #ifdef __GNUC__ #define PUTCHAR_PROTOTYPE int __io_putchar(int ch) #else #define PUTCHAR_PROTOTYPE int fputc(int ch, FILE *f) #endif PUTCHAR_PROTOTYPE { HAL_UART_Transmit(huart1, (uint8_t *)ch, 1, HAL_MAX_DELAY); return ch; } /* USER CODE END 4 */3.2 SHA1加密核心代码在main.c中实现测试函数void sha1_demo(const char *input) { uint8_t output[20]; // SHA1结果固定20字节 mbedtls_sha1_context ctx; printf(\r\nOriginal: %s\r\n, input); // 四步完成哈希计算 mbedtls_sha1_init(ctx); mbedtls_sha1_starts(ctx); mbedtls_sha1_update(ctx, (const uint8_t *)input, strlen(input)); mbedtls_sha1_finish(ctx, output); mbedtls_sha1_free(ctx); // 打印十六进制结果 printf(SHA1: ); for(int i0; i20; i) { printf(%02x, output[i]); } printf(\r\n); }调用示例/* USER CODE BEGIN 2 */ sha1_demo(Hello,mbedtls!); sha1_demo(STM32F103CBT6); /* USER CODE END 2 */4. 编译调试与结果验证4.1 常见编译问题解决可能遇到的错误及解决方案错误类型解决方法未定义MBEDTLS_CONFIG_FILE在工程选项→C/C→Define中添加宏缺少platform_entropy_poll启用MBEDTLS_NO_PLATFORM_ENTROPY栈溢出修改startup_stm32f103xb.s中Stack_Size EQU 0x4004.2 运行结果比对使用在线工具验证输出访问 1024Tools Hash计算输入相同字符串选择SHA1算法对比设备串口输出与网页结果示例输出Original: champion666 SHA1: a3f5c7d8e1b9f2d4c6a8b0e5d3f7c9a1b2d4e64.3 性能优化建议通过以下配置提升运行效率// 在stm32f1xx_hal_conf.h中启用硬件CRC #define HAL_CRC_MODULE_ENABLED // 修改mbedtls配置 #define MBEDTLS_SHA1_ALT // 启用硬件加速需实现对应HAL函数工程完整内存占用报告Program Size: Code18256 RO-data672 RW-data48 ZI-data2048约占Flash 28%RAM 10%