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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.01 16:54:03