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

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完全满足多数物联网设备的实时加密需求。

相关文章:

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

AES128加密实战:用C语言写一个加密函数,并集成到你的STM32项目里 在物联网设备开发中,数据安全传输是至关重要的环节。想象一下,你的STM32设备需要通过无线网络发送传感器数据到云端,如果这些数据以明文传输&#xff0…...

从游戏画面Bug到图形学原理:一次深度测试失败的排查与透视矫正插值的深度理解

从游戏画面Bug到图形学原理:深度测试失败的排查与透视矫正插值解析 深夜调试游戏引擎时,屏幕上的三角形边缘突然出现诡异的闪烁——这种被称为"深度冲突"的现象,往往让开发者陷入漫长的调试循环。本文将以一个实际开发中的深度测试…...

CAD新手别再用直线硬画了!用PL命令的‘A’和‘R’快速搞定带半径的圆弧多段线

CAD高效绘图:用PL命令玩转带半径的圆弧多段线 刚接触CAD的设计师常陷入一个误区——用直线工具硬生生拼接出复杂曲线。这种操作不仅效率低下,后期修改更是噩梦。想象一下绘制建筑装饰线条或机械管道弯头时,反复调整几十个线段连接点的场景。其…...

对比官方原价Taotoken活动价带来的Token成本优化感受

🚀 告别海外账号与网络限制!稳定直连全球优质大模型,限时半价接入中。 👉 点击领取海量免费额度 对比官方原价与Taotoken活动价带来的Token成本优化感受 1. 引言:开发者视角下的模型调用成本 对于频繁使用大模型API进…...

ArcGIS 10.2.2许可服务罢工了?别慌,试试这个替换Service.txt和ARCGIS.exe的终极方案

ArcGIS 10.2.2许可服务故障终极修复指南:深入解析文件替换方案 当ArcGIS 10.2.2的许可服务突然罢工,所有常规方法都失效时,那种挫败感只有GIS专业人员才能真正体会。你试过关闭防火墙、调整服务启动类型、甚至重启服务器,但那个令…...

eLabFTW:开源电子实验笔记本如何重塑科研数据管理流程

eLabFTW:开源电子实验笔记本如何重塑科研数据管理流程 【免费下载链接】elabftw :notebook: eLabFTW is the most popular open source electronic lab notebook for research labs. 项目地址: https://gitcode.com/gh_mirrors/el/elabftw 在数字化科研时代&…...

如何在VSCode中实现高效Mermaid图表实时预览:一站式解决方案

如何在VSCode中实现高效Mermaid图表实时预览:一站式解决方案 【免费下载链接】vscode-mermaid-preview Previews Mermaid diagrams 项目地址: https://gitcode.com/gh_mirrors/vs/vscode-mermaid-preview 还在为技术文档中的图表制作而头疼吗?你是…...

【Midjourney放松模式深度解密】:20年AI图像生成专家亲测的4大核心差异与3种误用陷阱

更多请点击: https://kaifayun.com 第一章:Midjourney放松模式的本质定义与演进脉络 放松模式(Relaxed Mode)是Midjourney V6引入的一项关键资源调度机制,其本质并非降低图像生成质量,而是通过动态协调GPU…...

仅剩最后47份!《Midjourney概念艺术创作密钥手册》(含23个受版权保护的材质编码+动态光照参数表)

更多请点击: https://codechina.net 第一章:《Midjourney概念艺术创作密钥手册》核心价值与版权说明 核心价值定位 本手册聚焦于概念艺术创作中“意图—提示—反馈—迭代”的闭环实践,提炼出可复用的提示工程范式、风格锚定策略与跨模态语义…...

【人工智能核心技术详解】7 深度神经网络正则化技术体系_贝叶斯视角下的统一理论

深度神经网络正则化技术体系:贝叶斯视角下的统一理论手册 文章架构总览 #mermaid-svg-lhtjBcaOxIDdpUDM{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes …...

如何在5分钟内掌握VSCode Mermaid图表实时预览:开发者终极指南

如何在5分钟内掌握VSCode Mermaid图表实时预览:开发者终极指南 【免费下载链接】vscode-mermaid-preview Previews Mermaid diagrams 项目地址: https://gitcode.com/gh_mirrors/vs/vscode-mermaid-preview 还在为编写技术文档时需要在代码编辑器与图表预览工…...

SoM嵌入式开发实战:从选型到量产的全流程解析

1. 项目概述:为什么SoM正在重塑嵌入式开发 在嵌入式系统开发这个行当里干了十几年,我亲眼见证了开发模式从“一切从零开始”到“模块化集成”的巨大转变。早期做一个项目,从选型MCU、画原理图、设计PCB、焊接调试,再到底层驱动移植…...

FanControl:Windows平台终极风扇控制解决方案

FanControl:Windows平台终极风扇控制解决方案 【免费下载链接】FanControl.Releases This is the release repository for Fan Control, a highly customizable fan controlling software for Windows. 项目地址: https://gitcode.com/GitHub_Trending/fa/FanCont…...

经典的网格寻路问题实例分析

经典的网格寻路问题消除墙砖 这一设置会导致地形发生变化,增加问题处理的难度。让我们先去掉这一要求,这样题目就简化成了经典的 网格寻路问题:给你一个 的网格,其中每个单元格不是 (空)就是 (障…...

按键精灵PC版和手机版到底怎么选?一篇讲清四大版本区别与核心开发流程

按键精灵四大版本深度解析:从需求匹配到高效开发的完整指南 在自动化工具领域,按键精灵凭借其跨平台支持和易用性,成为许多用户的首选。但面对官网提供的四个不同版本——电脑版、手机助手、安卓版和IOS版,不少新手用户会感到困惑…...

别只盯着S21!用ADS仿真LNA时,这3个容易被忽略的细节(稳定性、实际元件模型、噪声圆)才是成败关键

别只盯着S21!用ADS仿真LNA时这3个关键细节才是成败关键 在射频前端设计中,低噪声放大器(LNA)的性能往往决定了整个系统的信噪比表现。许多工程师在使用ADS进行LNA仿真时,常常满足于S21参数达到预期就匆忙进入制版阶段&…...

别再折腾gcc版本了!Ubuntu 20.04下用Docker一键搞定OLLVM编译环境

用Docker容器化技术快速搭建OLLVM混淆编译环境 在逆向工程和移动安全研究领域,代码混淆是一项基础而重要的技术。传统搭建OLLVM环境需要处理复杂的依赖关系、版本冲突等问题,往往让初学者望而却步。本文将介绍如何利用Docker技术,在Ubuntu 20…...

Python跨平台应用开发终极指南:用Flet框架轻松构建桌面、移动和Web应用

Python跨平台应用开发终极指南:用Flet框架轻松构建桌面、移动和Web应用 【免费下载链接】flet Build realtime web, mobile and desktop apps in Python only. No frontend experience required. 项目地址: https://gitcode.com/gh_mirrors/fl/flet 你是否曾…...

Perplexity字体资源查询效率提升300%:基于Chrome DevTools Network + Font Inspector的6步诊断流程

更多请点击: https://intelliparadigm.com 第一章:Perplexity字体资源查询 Perplexity 是一款以语义理解与上下文感知见长的 AI 工具,其官方界面高度依赖定制化字体渲染以保障可读性与品牌一致性。在前端开发或设计系统集成过程中&#xff0…...

无王无帝定乾坤,来自田间第一人:海棠铁哥定千秋

无王无帝定乾坤来自田间第一人序章山河叹岁月悠悠流转,山河几度浮沉。 历代豪杰争雄逐鹿,到头来霸业如烟,功名易逝。 终究难锁万古山河,难稳世代人心。第一章天命 世间最难得千秋基业,天下最珍贵万世清平。 恰逢天命归…...

对比直接调用与通过Taotoken调用的响应时间体感

🚀 告别海外账号与网络限制!稳定直连全球优质大模型,限时半价接入中。 👉 点击领取海量免费额度 对比直接调用与通过Taotoken调用的响应时间体感 1. 开发者日常调试中的网络连接体验 在开发与调试大模型应用时,网络连…...

UE5 Niagara实战:手把手教你用自定义模块实现粒子间的实时位置同步

UE5 Niagara实战:用自定义模块构建粒子间的动态位置同步系统 在实时视觉效果开发中,粒子系统间的交互一直是提升场景动态表现力的关键。当两个发射器的粒子需要建立位置关联时——比如魔法飞弹追踪目标、萤火虫群集飞行或者流体颗粒间的引力作用——直接…...

SQL server 2017镜像库主从同步架构部署

SQL server 2017镜像库主从同步架构部署 目录: 1.主库配置 2.镜像库配置 3.检查状态 4.手工故障转移测试-主备切换 5.添加见证服务器实现自动主备切换 6.自动故障切换测试-主备切换角色 IP 状态 主机名 主库 192.168.56.120 可读写 sqldb2 镜像库(从库&a…...

RELION 5.0完整指南:从零开始掌握冷冻电镜数据处理利器

RELION 5.0完整指南:从零开始掌握冷冻电镜数据处理利器 【免费下载链接】relion Image-processing software for cryo-electron microscopy 项目地址: https://gitcode.com/gh_mirrors/re/relion RELION 5.0(REgularised LIkelihood OptimisatioN…...

嵌入式工程师高薪进阶指南:从软硬兼通到系统思维的跨越

1. 嵌入式行业的现状与人才困境最近几年,和不少同行、猎头以及企业招聘负责人聊下来,一个共识越来越清晰:嵌入式这个行当,正在经历一场深刻的“冰火两重天”。一方面,得益于树莓派、Arduino这类高度集成、生态友好的开…...

【码上爬】 题十一:wasm小试牛刀 wasm文件处理,堆栈分析

暗号:aHR0cHM6Ly9tYXNoYW5ncGEuY29tL3Byb2JsZW0tZGV0YWlsLzExLw题目:先分析数据接口,可以看到m和ts是加密的,但是这里的ts的值应该是一个时间戳,所以主要要逆向的值是m:然后在发起程序的最上面的堆栈下一个…...

别再手动调了!用MATLAB的Text对象属性批量设置图表字体,效率提升90%

MATLAB科研绘图效率革命:Text对象属性批量操控指南 科研工作者常面临一个看似简单却极其耗时的任务——图表字体格式调整。当论文需要提交到不同期刊,每个期刊对图表字体、字号、颜色都有特定要求时,手动逐个修改轴标签、标题和图例的字体属性…...

如何在Windows 11上轻松安装Android应用?APK安装器完整教程

如何在Windows 11上轻松安装Android应用?APK安装器完整教程 【免费下载链接】APK-Installer An Android Application Installer for Windows 项目地址: https://gitcode.com/GitHub_Trending/ap/APK-Installer 想在Windows电脑上运行Android应用却不想安装笨…...

手把手改造libmad:将一次性加载改为流式解码,拯救你的内存不足嵌入式系统

嵌入式音频革命:libmad流式解码改造实战指南 在资源受限的嵌入式环境中处理MP3音频,就像试图用吸管喝光整个游泳池的水——传统的一次性加载方式会让你的系统瞬间窒息。当树莓派Pico这类微控制器只有264KB的RAM时,一个5MB的MP3文件就能让内存…...

洞悉.NET 11:Blazor 与 Microsoft.Extensions.AI 的融合创新实践

洞悉.NET 11:Blazor 与 Microsoft.Extensions.AI 的融合创新实践 前言 在现代 Web 应用开发领域,提升用户体验和智能化交互至关重要。Blazor 凭借其在构建交互式 Web 界面的优势,与专注于 AI 集成的 Microsoft.Extensions.AI 相结合&#xff…...