You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用TinyAES加解密数据时首16字节解密异常求助

问题原因

TinyAES库的AES_CBC_encrypt_buffer函数在执行时会修改传入的AES_ctx结构体中的IV值:每加密一个16字节块,IV就会被更新为当前生成的密文块。加密完成后,ctx里的IV已经不是最初生成的pIv,而是最后一个密文块的值。

而CBC模式解密的第一个块必须使用加密时的初始IV才能正确解密。你直接用加密后的ctx进行解密,第一个块会用错误的IV(最后一个密文块),导致首16字节解密错误;后续块因为CBC模式的链式特性,依赖的是前一个密文块,所以解密结果正常。

解决方案

在执行解密操作前,必须重新初始化AES_ctx,传入最初的密钥和IV,确保解密使用正确的初始IV。

修改后的解密部分代码如下:

// DECRYPTION

// 重新初始化ctx,使用原始密钥和IV(加密已修改ctx中的IV)
AES_init_ctx_iv(&ctx, pKey, pIv);

// 判断需要解密的是填充后的缓冲区还是原数据
if (PaddedBuffer != NULL) {
    AES_CBC_decrypt_buffer(&ctx, PaddedBuffer, PAddedSize);
    PrintHexData("Plaintext", PaddedBuffer, PAddedSize);
}
else {
    AES_CBC_decrypt_buffer(&ctx, Data, sizeof(Data));
    PrintHexData("Plaintext", Data, sizeof(Data));
}

另外注意:代码中PrintHexData("Plaintext", Data, sizeof(Data));里的Data应为Plaintext,这是一处笔误,但不影响解密错误的核心问题。

内容的提问来源于stack exchange,提问作者user2334659

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.20 10:54:56