前言
讲述在嵌入式软件开发中,密码学相关算法知识,以及其应用。
开源算法库,如何适配。算法接口
以小米手环的流程为例
嵌入式之加密应用简述
嵌入式设备间认证
绑定认证
通信
支付
各个应用场景都要求保证数据的安全性
但数据通信通道是不安全的,传输数据是明文,易被监听,如何保证数据的安全性?
所以需要加密,使得 即使他人监听到传输数据,也无法逆推出有效数据。
现代加密协议 TLS 1.3
加密算法概念简述
ECDH(Elliptic Curve Diffie-Hellman) 是一种基于椭圆曲线密码学的密钥交换协议,用于在不安全的通信环境中安全协商共享密钥
AES: 高级加密标准,一种对称加密算法,用于对数据进行加密和解密
主要特性:
对称加密:加密和解密使用相同的密钥
分组密码:将明文分成128位的块进行处理
密钥长度:支持128位、192位、256位三种长度
加密轮数:根据密钥长度不同,分别为10轮、12轮、14轮
加密流程:
字节替换(SubBytes)
行移位(ShiftRows)
列混合(MixColumns)
轮密钥加(AddRoundKey)
应用场景:TLS/SSL、磁盘加密、移动支付、物联网设备等HMAC: 基于密钥的哈希消息认证码,用于验证消息的完整性和来源
特点:
需要密钥才能生成和验证
防止消息被篡改
常用于API认证、数字签名等HKDF: 密钥派生函数,用于从一个主密钥派生出多个安全强度高的子密钥
一个完整的流程:ECDH协商共享密钥,HKDF派生会话密钥,AES加密数据,HMAC验证消息完整性
加密算法说明及用例
ECDH(椭圆曲线迪菲-赫尔曼密钥交换)
ECDH(Elliptic Curve Diffie-Hellman)是一种基于椭圆曲线密码学的密钥交换协议,用于在不安全的通信环境中安全协商共享密钥
核心:双方交换公开参数,生成共享密钥,无需直接传输密钥本身。
流程: 以secp256r1(P-256)曲线为例
- 协商:双方事先约定使用相同的椭圆曲线参数(曲线类型)
- 私钥生成:随机生成一个整数d,私钥的大小(以位数表示)等于曲线阶的比特长度;例如,对于secp256r1(P-256)曲线,私钥是一个256位(32字节)的整数。
- 公钥生成:私钥与基点G通过点乘运算得到
基点G(x,y) 是椭圆曲线的一部分,通常由椭圆曲线的标准定义决定。如果使用标准曲线,则不用协商定义
公钥 Q = d * G,Q值是一个坐标(x,y),在代码中用64个字节表示,其中前32字节表示x坐标,后32字节表示y坐标 - 公钥交换:A设备和B设备通信交换各自的公钥
- 共享密钥计算:设备A和B分别使用 各自的私钥d x 对方的公钥,得到共享密钥S。两者计算出的共享密钥S是相同的。
共享密钥原理:
- 椭圆曲线点乘的交换律,满足:
[d_A \times (d_B \times G) = d_B \times (d_A \times G)] - G是
安全原理:
- 椭圆曲线离散对数问题(ECDLP):从公钥 Q 反推私钥 d 的难度极高,确保攻击者无法破解私钥。
- 与数学的椭圆曲线不同,其作用于有限域,且是取模运算(取余数),基本无法从余数反推出私钥值
优势:
椭圆曲线
有限域
取模运算(取余数)
公钥 = 私钥 * k % 模数
知道公钥,但不可能推算出私钥。
但双方 公钥 * 私钥 % 模数 = 共享密钥 是一致的
生成密钥后,又是如何对数据进行加密的呢
代码以及用例验证
python代码,得到结果
可以用来对照部署在嵌入式设备,验证算法接口的正确性
SHA256
比CRC、CheckSum高级,更安全可靠
SHA256作为一种安全可靠的哈希算法,广泛应用于密码存储、数字签名、数据完整性验证等场景,是现代密码学体系中的重要组成部分。
对ECDH生成的共享密钥进行哈希处理,生成会话密钥
SHA256通过一系列复杂的位运算(包括位移、逻辑运算、模加法等),将输入数据分块处理,最终生成哈希值。整个过程涉及:
数据填充和分块
初始化哈希值
按块进行压缩函数运算
最终输出哈希值
OOB 拼接
HMAC
HKDF
AES
AES128
MD5
加密流程讲述
典型协议流程示例(TLS 1.3)
TLS 1.3是啥
客户端与服务器协商参数:选择椭圆曲线(如 secp256k1)和哈希算法(如 SHA-256)。
ECDH 密钥交换:双方交换公钥,生成共享密钥 S。
密钥派生:使用 SHA-256 对 S 和其他参数进行哈希,生成会话密钥。
数据加密与验证:
使用 AES-256(密钥来自步骤3)加密数据。
使用 SHA-256 生成 HMAC 校验数据完整性。
XiaoMi 穿戴加密流程
本地绑定
派生密钥
鉴权
oob 如何生成
id
通信
正常透传通信后,每次收发数据都进行加解密
ccm解密miwear_crypto_ccm_decrypt:642
aes128加密
嵌入式加密算法移植、设计与应用
github 算法库
接口
思考与拓展
如何自己搭建/应用现代加密协议栈?
验证算法接口是否正确,python可执行对比
ECDH与SHA256的联系?
TLS、TLS 1.3 是啥加密协议流程?
加密算法代码占用空间?
嵌入式C语言开发中
实例应用中,至少需要准备200KB的空间,用于部署加密算法库
所有的数据通信都是密文吗?基于ECDH得到的共享密钥,如何对数据进行加密?
密钥哈希化:将原始密钥通过哈希算法(如SHA256)进行处理,生成一个固定长度的哈希值,然后将这个哈希值用作后续加密操作的密钥
使用哈希值 + 数据 进行AES128加密
对方使用密钥哈希值 + 加密数据 进行AES128解密
非对称加密是什么?对称加密是什么?区别与联系、应用?
三元组是啥?与加密算法的联系?四元组呢?
在加密领域,三元组(3DES),通常指 三重DES(Triple DES,3DES),这是一种对称加密算法,用于增强经典DES算法的安全性。
现已经逐步淘汰,逐渐被AES取代。
加密领域,通常没有四元组的概念,在计算机科学和网络通信中,“四元组”指用于唯一标识网络连接或数据流的一组四个参数。
在网络层(如IP)和传输层(如TCP/UDP)中,四元组唯一标识一条端到端的通信连接
绑定四元组:会话密钥通常与四元组关联,确保同一连接的不同数据流使用相同密钥加解密
:为什么一些联网的设备需要提前烧录四元组?
可能破解的流程是怎样的?知道了私钥,能破解数据吗?
须多重解密
每一次的数据传输,都是AES叠加HMAC
数字签名是什么?
JL有没有数字签名?
基于非对称密码学的数学机制,用于让接收方确信消息确实来自声称的发送方,并且在途中没有被篡改
| 目标 | 手段 | 密钥 |
|---|---|---|
| 加密 | 防止别人看到内容 | 公钥加密,私钥解密 |
| 签名 | 防止别人伪造/篡改内容 | 私钥签名,公钥验签 |
公钥给你一把‘只能锁门’的挂锁;只有我手里的私钥才能造出‘能开门’的钥匙
先使用了私钥进行了运算,只有对的公钥才能验证算式成功
HMAC也是验证数据完整性的一种机制,所以HMAC是数字签名吗?
HMAC 只能做“消息认证码”(MAC),而数字签名必须基于非对称密钥(私钥签名+公钥验签)。二者最本质的差别:
| 能力 | HMAC | 数字签名 |
|---|---|---|
| 是否用到非对称密钥 | ❌ 对称密钥(双方共享同一把) | ✅ 私钥签名,公钥验签 |
| 能否让第三方仲裁 | ❌ 任何能验的人也能伪造,无法证明“是谁签的” | ✅ 公钥公开,私钥唯一;第三方可独立验证 |
| 主要作用 | 防篡改、防伪造(参与双方诚实场景) | additionally 提供不可否认性(可上法庭) |
| 性能 | 哈希+一次对称运算,极快 | 非对称运算,慢一个量级 |
| 常见标准 | HMAC-SHA256、HMAC-SHA512 | RSA-PSS、ECDSA、Ed25519 |