KDF + AES-256-CBC 加密解密实战:用同一份 seed 在 Linux 与 OP-TEE/TA 间互通


📺 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、量产体系,也不拓展到别的加密模式。

你会得到:

  1. 这套流程涉及的知识点(只保留必要的)
  2. Linux 侧完整加密脚本(你已有)+ 完整解密方案(实战可跑)
  3. 如何保证 Linux 与 TA 完全一致(常见踩坑点)
  4. 一个可复制的“验收清单”,帮你快速定位不一致原因

0. 场景与问题定义

你现在的系统里有三样东西:

  • seedhello_seed.bin(32 字节)
  • 明文helloworld.txt(任意长度,比如内容是 helloworld
  • 目标:把明文加密成密文文件 helloworld_kdf.enc,然后在另一侧(比如 TA)用同样的 KDF 算法解密得到原始明文。

重要约束:

  1. Linux 与 TA 的 KDF 必须 bit-by-bit 一致
  2. 加密/解密使用同一个分组模式(这里是 AES-256-CBC)
  3. padding 必须一致(这里是 PKCS7)

只要这三点成立,加密解密必然互通。


1. 这套流程里到底有哪些“点”?(只保留必要知识)

你这个例子里涉及的点可以压缩成 6 个关键词:

  1. seed(种子):固定输入材料(32 字节)
  2. KDF(派生):用 SHA256 把 seed “变成” key/iv
  3. domain separation(域分离):key 和 iv 用不同 label
  4. AES-256-CBC(分组加密模式):需要 key(32B)与 iv(16B)
  5. PKCS7 padding(填充):CBC 要求明文长度是 16 的倍数
  6. 一致性验证:确保两边输入、拼接顺序、编码完全一致

下面逐一解释。


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 给 key
  • hello-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 相同,加密解密就是互逆的。


评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值