当前位置: 首页 > news >正文

AES128加密实战:用C语言写一个加密函数,并集成到你的STM32项目里

AES128加密实战用C语言写一个加密函数并集成到你的STM32项目里在物联网设备开发中数据安全传输是至关重要的环节。想象一下你的STM32设备需要通过无线网络发送传感器数据到云端如果这些数据以明文传输就像把日记本摊开在公交车上一样危险。AES128作为轻量级加密标准能在资源有限的MCU上实现高效加密本文将带你从零构建一个可嵌入STM32项目的加密模块。1. AES128核心算法实现1.1 有限域数学基础AES算法的核心在于有限域GF(2⁸)上的运算。与常规数学不同这里的加法和乘法有特殊定义// GF(2^8)加法即异或运算 #define gf_add(a, b) ((a) ^ (b)) // 计算x在GF(2^8)上的2倍 unsigned char xtime(unsigned char x) { return (x 0x80) ? ((x 1) ^ 0x1b) : (x 1); }有限域乘法的实现需要分解为2的幂次累加unsigned char gf_multiply(unsigned char a, unsigned char b) { unsigned char result 0; for(int i0; i8; i) { if(b 1) result ^ a; a xtime(a); b 1; } return result; }1.2 密钥扩展算法AES128需要从16字节原始密钥扩展出11轮密钥共176字节void key_expansion(const unsigned char *key, unsigned char *w) { unsigned char temp[4]; // 初始密钥拷贝 for(int i0; i16; i) { w[i] key[i]; } for(int i4; i44; i) { // 获取前4字节 for(int j0; j4; j) { temp[j] w[(i-1)*4 j]; } if(i % 4 0) { // 字节循环移位 unsigned char t temp[0]; temp[0] temp[1]; temp[1] temp[2]; temp[2] temp[3]; temp[3] t; // S盒替换 for(int j0; j4; j) { temp[j] sbox[temp[j]]; } // 轮常量异或 temp[0] ^ rcon[i/4]; } // 生成新密钥字 for(int j0; j4; j) { w[i*4 j] w[(i-4)*4 j] ^ temp[j]; } } }2. 加密流程实现2.1 基本变换操作AES加密包含四个基本操作字节替换使用S盒进行非线性变换void sub_bytes(unsigned char *state) { for(int i0; i16; i) { state[i] sbox[state[i]]; } }行移位矩阵行循环位移void shift_rows(unsigned char *state) { // 第二行左移1字节 unsigned char temp state[1]; state[1] state[5]; state[5] state[9]; state[9] state[13]; state[13] temp; // 第三行左移2字节等效于交换 swap(state[2], state[10]); swap(state[6], state[14]); // 第四行左移3字节等效于右移1字节 temp state[15]; state[15] state[11]; state[11] state[7]; state[7] state[3]; state[3] temp; }列混淆矩阵乘法变换void mix_columns(unsigned char *state) { for(int i0; i4; i) { unsigned char s0 state[4*i]; unsigned char s1 state[4*i1]; unsigned char s2 state[4*i2]; unsigned char s3 state[4*i3]; state[4*i] gf_multiply(0x02, s0) ^ gf_multiply(0x03, s1) ^ s2 ^ s3; state[4*i1] s0 ^ gf_multiply(0x02, s1) ^ gf_multiply(0x03, s2) ^ s3; state[4*i2] s0 ^ s1 ^ gf_multiply(0x02, s2) ^ gf_multiply(0x03, s3); state[4*i3] gf_multiply(0x03, s0) ^ s1 ^ s2 ^ gf_multiply(0x02, s3); } }轮密钥加与扩展密钥异或void add_round_key(unsigned char *state, const unsigned char *w, int round) { for(int i0; i16; i) { state[i] ^ w[round*16 i]; } }2.2 完整加密流程将基本操作组合成完整加密流程void aes_encrypt(unsigned char *state, const unsigned char *key) { unsigned char w[176]; // 扩展密钥缓冲区 key_expansion(key, w); // 初始轮密钥加 add_round_key(state, w, 0); // 主轮次共9轮 for(int round1; round10; round) { sub_bytes(state); shift_rows(state); mix_columns(state); add_round_key(state, w, round); } // 最终轮无列混淆 sub_bytes(state); shift_rows(state); add_round_key(state, w, 10); }3. STM32集成优化3.1 内存优化策略在STM32F103等资源受限设备上我们需要优化内存使用预计算S盒将S盒存储在Flash而非RAM__attribute__((section(.rodata))) const unsigned char sbox[256] { /* ... */ };轮密钥复用加密完成后立即释放扩展密钥void encrypt_in_place(unsigned char *data, const unsigned char *key) { unsigned char w[176]; key_expansion(key, w); aes_encrypt(data, w); // w自动释放 }使用DMA加速针对大数据量加密void dma_encrypt(uint8_t *src, uint8_t *dst, uint32_t len) { DMA1_Channel1-CCR ~DMA_CCR_EN; DMA1_Channel1-CPAR (uint32_t)AES_DR; DMA1_Channel1-CMAR (uint32_t)src; DMA1_Channel1-CNDTR len; DMA1_Channel1-CCR | DMA_CCR_EN; while(DMA1-ISR DMA_ISR_TCIF1 0); }3.2 性能优化技巧查表法优化列混淆// 预计算乘法表 static const unsigned char mul2[256] { /* ... */ }; static const unsigned char mul3[256] { /* ... */ }; void fast_mix_columns(unsigned char *state) { for(int i0; i4; i) { unsigned char s0 state[4*i]; unsigned char s1 state[4*i1]; unsigned char s2 state[4*i2]; unsigned char s3 state[4*i3]; state[4*i] mul2[s0] ^ mul3[s1] ^ s2 ^ s3; state[4*i1] s0 ^ mul2[s1] ^ mul3[s2] ^ s3; state[4*i2] s0 ^ s1 ^ mul2[s2] ^ mul3[s3]; state[4*i3] mul3[s0] ^ s1 ^ s2 ^ mul2[s3]; } }汇编优化核心循环; AES轮密钥加优化实现 add_round_key: LDR r2, [r0] ; 加载state LDR r3, [r1] ; 加载round key EOR r2, r2, r3 ; 异或操作 STR r2, [r0], #4 ; 存储结果 SUBS r4, r4, #1 ; 计数器递减 BNE add_round_key BX lr4. 实际项目集成4.1 通信协议加密方案典型物联网数据包加密流程数据分组处理void encrypt_data(uint8_t *data, uint32_t len, const uint8_t *key) { uint8_t block[16]; uint32_t blocks len / 16; for(uint32_t i0; iblocks; i) { memcpy(block, datai*16, 16); aes_encrypt(block, key); memcpy(datai*16, block, 16); } // 处理不足16字节的尾部数据 if(len % 16 ! 0) { uint8_t pad 16 - (len % 16); memset(block, pad, 16); memcpy(block, datablocks*16, len % 16); aes_encrypt(block, key); memcpy(datablocks*16, block, len % 16); } }完整性校验方案void encrypt_with_hmac(uint8_t *data, uint32_t len, const uint8_t *key) { uint8_t hmac[16]; calculate_hmac(data, len, key, hmac); encrypt_data(data, len, key); // 将HMAC附加到加密数据后 memcpy(datalen, hmac, 16); }4.2 典型问题排查问题1加密后数据无法解密解决方案检查密钥是否一致验证数据填充方案确认字节序问题STM32默认小端问题2加密速度太慢优化建议// 启用STM32硬件CRC加速 RCC-AHBENR | RCC_AHBENR_CRCEN; CRC-CR | CRC_CR_RESET;问题3内存不足应对策略使用动态内存分配加密缓冲区减少同时处理的加密块数量考虑ECB模式替代CBC模式节省IV存储在STM32F407项目实测中优化后的AES128加密速度达到85KB/s72MHz主频内存占用仅3.2KB完全满足多数物联网设备的实时加密需求。
http://www.gsyq.cn/news/1330428.html

相关文章:

  • CAD新手别再用直线硬画了!用PL命令的‘A’和‘R’快速搞定带半径的圆弧多段线
  • 别再只复制代码了!手把手教你理解UniApp Map组件的定位、气泡与事件交互(附完整项目源码)
  • 企业级跨平台媒体资源管理:BiliTools架构设计与微服务实践
  • SpringBoot接口规范进阶:参数校验、文档生成、安全幂等与性能监控
  • 古镇慢游不赶场,沉浸式感受烟火里的旧时光
  • GCP上跑DeepSeek R1竟比AWS贵42%?深度剖析e2-highmem-16 vs. a2-ultragpu-1g成本模型与吞吐量拐点
  • Android Auto真正价值在默认应用外!六个应用让驾驶更轻松、生活更便利
  • Docker容器化高可用架构部署方案(十一)
  • 再议指针变量和普通变量
  • 谐振电路分析
  • 【Perplexity词汇查询功能深度解密】:20年NLP专家亲授3大隐藏技巧,90%用户从未用过的高效查词法
  • Perplexity搜索结果突然失准?三类隐性偏见陷阱正在吞噬你的决策质量(附MIT媒体实验室2024最新评估报告)
  • 2026年宁波短视频代运营哪家靠谱:本地获客转化完全指南 - 优质企业观察收录
  • 2026佛山市顺德区黄金回收铂金回收白银回收深度实测 五大正规门店横屏 报价透明 免费上门才是真靠谱 - 亦辰小黄鸭
  • 告别软件模拟!用STM32硬件IIC驱动OLED,U8g2库移植保姆级教程(Keil+STM32CubeMX)
  • 仅剩最后47份!《Midjourney概念艺术创作密钥手册》(含23个受版权保护的材质编码+动态光照参数表)
  • 如何在5分钟内掌握VSCode Mermaid图表实时预览:开发者终极指南
  • SoM嵌入式开发实战:从选型到量产的全流程解析
  • 2026桂林市雁山区黄金回收铂金回收白银回收深度实测 五大正规门店横屏 报价透明 免费上门才是真靠谱 - 亦辰小黄鸭
  • 解密B站缓存转换:m4s-converter让你的珍藏视频永不丢失
  • 2026海口市龙华区黄金回收铂金回收白银回收深度实测 五大正规门店横屏 报价透明 免费上门才是真靠谱 - 亦辰小黄鸭
  • 经典的网格寻路问题实例分析
  • 别只盯着S21!用ADS仿真LNA时,这3个容易被忽略的细节(稳定性、实际元件模型、噪声圆)才是成败关键
  • 别再折腾gcc版本了!Ubuntu 20.04下用Docker一键搞定OLLVM编译环境
  • Python跨平台应用开发终极指南:用Flet框架轻松构建桌面、移动和Web应用
  • Translumo:Windows平台的开源实时屏幕翻译解决方案
  • D13X调试全攻略:从BROM到应用
  • 2026海口市琼山区黄金回收铂金回收白银回收深度实测 五大正规门店横屏 报价透明 免费上门才是真靠谱 - 亦辰小黄鸭
  • 用C++和Eigen手撸一个MINCO轨迹优化器:从论文公式到可运行代码的保姆级拆解
  • 2026福州市马尾区黄金回收铂金回收白银回收深度实测 五大正规门店横屏 报价透明 免费上门才是真靠谱 - 亦辰小黄鸭