硬件AES-CTR 128位加解密

微信管营团队 · 10次点击 · 2天前


AES-CTR(计数器模式)


工作原理


CTR 模式的核心思路是:



1. 把计数器(Counter)不断递增:0, 1, 2, 3...

2. 每个计数值与密钥一起做 AES 加密 → 得到一串密钥流

3. 用这串密钥流与明文做异或 → 得到密文



加解密完全一样:



加密:密文 = 明文 ⊕ 密钥流

解密:明文 = 密文 ⊕ 密钥流



因为是异或,所以同一个函数既能加密也能解密。



每次循环:

1. 拿当前的 `Ai`(含 nonce + 计数值)做 AES 加密 → 产出 16 字节密钥流 `Si`

2. 密钥流与 16 字节明文异或 → 得到 16 字节密文

3. 计数器 `counter++`,准备下一块


需要注意的地方


- **密钥流不能重复使用**——同一把密钥下如果计数器值重复,两段密钥流就一样了,两个密文异或会暴露明文信息

- **可以随机解密任意位置**——要解密第 N 块,直接用 `初始值 + N` 算密钥流就行,不用从头算起


函数声明:

uint32_t hal_aes_ccm_encrypt(uint8_t* key, uint8_t* nonce,

                             uint8_t* din, uint32_t dLen,

                             uint8_t* dout)


| 参数 | 说明 |

|------|------|

| `key` | **密钥**,16 字节(AES-128) |

| `nonce` | **随机数**,13 字节。用于让每次加密的密钥流不同,防止重复 |

| `din` | **输入数据**,要加密的明文,或要解密的密文 |

| `dLen` | **数据长度**(字节),可以是任意长度,不需要 16 字节对齐 |

| `dout` | **输出缓冲区**,存放加密/解密后的结果,长度至少为 `dLen` |


**返回值**:返回 `dLen`(输入数据的长度)。


**注意**:`key` 和 `nonce` 在内部都是按大端序处理的


有6621E和6626的代码,硬件方面会稍微不一样


256字节进行一次加密/解密的时间
89958344-e9e3-46ff-9a6a-f291d0abada8.png

6621E_6626_aes_ccm-202606103175.zip
被收藏 0  ∙  0 赞  
加入收藏
点赞
0 回复  
善言善语 (您需要 登录 后才能回复 没有账号 ?)

请先登录网站