📺 B站视频讲解(Bilibili):https://www.bilibili.com/video/BV1k1C9BYEAB/
📘 《Yocto项目实战教程》京东购买链接:Yocto项目实战教程
KDF + AES-256-CBC 加密解密实战:用同一份 seed 在 Linux 与 OP-TEE/TA 间互通
目标:只讲清楚一件事——你现在这套“seed → KDF → AES-256-CBC → 密文 → 解密还原明文”到底是怎么工作的。不扯 EKS、Secure Boot、量产体系,也不拓展到别的加密模式。
你会得到:
- 这套流程涉及的知识点(只保留必要的)
- Linux 侧完整加密脚本(你已有)+ 完整解密方案(实战可跑)
- 如何保证 Linux 与 TA 完全一致(常见踩坑点)
- 一个可复制的“验收清单”,帮你快速定位不一致原因
0. 场景与问题定义
你现在的系统里有三样东西:
- seed:
hello_seed.bin(32 字节) - 明文:
helloworld.txt(任意长度,比如内容是helloworld) - 目标:把明文加密成密文文件
helloworld_kdf.enc,然后在另一侧(比如 TA)用同样的 KDF 算法解密得到原始明文。
重要约束:
- Linux 与 TA 的 KDF 必须 bit-by-bit 一致
- 加密/解密使用同一个分组模式(这里是 AES-256-CBC)
- padding 必须一致(这里是 PKCS7)
只要这三点成立,加密解密必然互通。
1. 这套流程里到底有哪些“点”?(只保留必要知识)
你这个例子里涉及的点可以压缩成 6 个关键词:
- seed(种子):固定输入材料(32 字节)
- KDF(派生):用 SHA256 把 seed “变成” key/iv
- domain separation(域分离):key 和 iv 用不同 label
- AES-256-CBC(分组加密模式):需要 key(32B)与 iv(16B)
- PKCS7 padding(填充):CBC 要求明文长度是 16 的倍数
- 一致性验证:确保两边输入、拼接顺序、编码完全一致
下面逐一解释。
2. seed:你“唯一”的秘密输入
2.1 seed 是什么
hello_seed.bin 是一个二进制文件,内容为 32 字节。它相当于这套 demo 的“根秘密”。
2.2 seed 必须严格一致的原因
因为你后面所有 key/iv 都是从 seed 派生来的:
- seed 变 1 个 bit → SHA256 输出完全变化 → key/iv 完全变化 → 密文完全变化
所以 Linux 侧 seed 与 TA 侧 seed 必须完全一致,并且:
- 长度要一致(32 bytes)
- 内容要一致(每一字节一致)
- 输入时不能多也不能少(不能额外加 \n)
3. KDF:用 SHA256 派生 key 与 iv
你的 KDF 逻辑非常简单(也正因为简单所以容易验证):
3.1 key 派生
定义:
key = SHA256( seed || "hello-aes-key" )
||表示“拼接(concatenate)”seed是 32 字节二进制- label 是 ASCII 字符串
hello-aes-key(注意没有结尾\0,也没有换行) - 输出 SHA256 是 32 字节,正好是 AES-256 的 key
3.2 iv 派生
定义:
iv_full = SHA256( seed || "hello-aes-iv" )
iv = iv_full[0..15]
- SHA256 还是输出 32 字节
- 取前 16 字节作为 AES-CBC 需要的 IV
3.3 为什么要用两个 label(域分离)
你用了:
hello-aes-key给 keyhello-aes-iv给 iv
这叫 domain separation,目的是:
- 避免 key 和 iv 之间存在可预测关系
- 避免重复使用同一派生值
在 demo 里这一步非常关键,因为它几乎“零成本”却能显著减少错误用法。
4. AES-256-CBC:为什么需要 key + iv
AES 是分组密码(block cipher),每次处理 16 字节(128 bit)一个 block。
CBC(Cipher Block Chaining)模式的特点:
- 每个明文 block 会与前一个密文 block XOR 后再加密
- 第一个 block 没有前一个密文,就需要一个 IV(初始向量)
所以 CBC 模式加密需要两样东西:
- Key:32 字节(AES-256)
- IV:16 字节(与 block size 相同)
只要 key/iv 相同,加密解密就是互逆的。

最低0.47元/天 解锁文章
1233

被折叠的 条评论
为什么被折叠?



