使用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
相关产品推荐
相关产品推荐

