OpenSSL AES加解密后原文block内容不一致的原因是什么?
问题根因
- 核心错误:你仅初始化了加密场景使用的
AES_KEY密钥调度结构,未单独初始化解密场景的密钥调度。OpenSSL低阶AES_encrypt/AES_decrypt接口不支持共用加密阶段生成的AES_KEY实例执行解密操作,必须调用AES_set_decrypt_key单独生成解密专用的密钥调度结构。 - 次要兼容问题:部分编译器默认
char为有符号类型,直接强转为u_char可能出现符号扩展异常,建议将密钥、数据缓冲区直接定义为unsigned char类型避免兼容问题。
修正后代码
#include <stdio.h> #include <sys/types.h> #include <openssl/aes.h> int main(void) { AES_KEY aesEncKey, aesDecKey; unsigned char key[] = "secretsecretsecr"; unsigned char block[] = "somesecretishere"; unsigned char cypher[16]; int i = 0; // 分别初始化加密、解密密钥调度 AES_set_encrypt_key(key, 0x80, &aesEncKey); AES_set_decrypt_key(key, 0x80, &aesDecKey); printf("\n"); for (i = 0; i < 0x10; i = i + 1) { printf("%i ", block[i]); } printf("\n"); AES_encrypt(block, cypher, &aesEncKey); AES_decrypt(cypher, block, &aesDecKey); printf("\n"); for (i = 0; i < 0x10; i = i + 1) { printf("%i ", block[i]); } printf("\n"); return 0; }
编译时需要链接OpenSSL的crypto库,示例编译命令:gcc test.c -lcrypto,运行后即可看到加解密前后block的内容完全一致。
内容的提问来源于stack exchange,提问作者Christopher Wrogg
相关产品推荐
相关产品推荐

