c++ - AES CBC 128 位加密-OpenSSL
问题描述
我只需要通过代码在 AES CBC 128 位模式下加密一个字符串。我是用 openssl 库完成的,但我无法获得正确的输出。
到目前为止,我已经完成了。
#include <cstring>
#include <iostream>
#include <openssl/evp.h>
#include <openssl/aes.h>
using namespace std;
int main(){
string in = "abcdefgh";
unsigned char input[in.length()];
strcpy((char*) input, in.c_str());
string key ="123456781234456678";
unsigned char key_aes[key.length()];
strcpy((char*) key_aes, key.c_str());
cout<<input<<endl;
cout<<key_aes<<endl;
unsigned char iv[key.length()];
strcpy((char*) iv, key.c_str());
cout<<iv<<endl;
const size_t encslength = ((in.length()/AES_BLOCK_SIZE)) * AES_BLOCK_SIZE;
unsigned char out[encslength];
memset(out, 0, sizeof(out));
AES_KEY enc_key;
AES_set_encrypt_key(key_aes,128, &enc_key);
AES_cbc_encrypt(input,out,in.length(),&enc_key,iv,1);
for(int i=0;out[i]!='\0';i++){
printf("%X ",out[i]);
}
return 0;
}
我的十六进制输出是:B0 15 75 1B 50 80 D4 FF 81 68 14 6B B7 1B 95 99 37 38
但正确的输出是:(73 5C 04 F9 57 18 43 7C EE 68 27 59 2B 41 A8 DA
通过在线站点和 c# 代码验证)。
帮帮我..这个问题已经在这里得到了回答,但它也不适用于我。提前感谢。
解决方案
string in = "abcdefgh";
unsigned char input[in.length()];
strcpy((char*) input, in.c_str());
该strcpy
函数用于 C 风格的字符串。这意味着您需要制作input
足够大的文件来保存"abcefgh"
为 C 风格的字符串。但是,由于 C 风格的字符串末尾有一个 nul 终止符,因此您将其设置得太小了一个字节。
string key ="123456781234456678";
unsigned char key_aes[key.length()];
strcpy((char*) key_aes, key.c_str());
又是同样的事情。为什么你从 C 风格的字符串构造 C++ 字符串只是为了将它们转换回 C 风格的字符串?!
然后,将 C 风格的字符串传递给AES_set_encrypt
. 但该AES_set_encrypt
函数不采用 C 风格的字符串作为输入。那么你为什么要创建这些 C 风格的字符串呢?
推荐阅读
- python-3.x - 在烧瓶应用程序的多个选项卡中呈现多个字典
- javascript - Nodejs停止循环并等待答案
- java - 训练有素的 Tesseract 仍然不够准确
- python - Django过滤数据与国家分配给用户
- firebase - 如何在使用 Typescript 保存时自动更新本地模拟器上的 Firebase 云函数中的代码
- python - 如何安装用于 rinohtype/sphinx 的系统 (Windows 10) 字体?
- reactjs - 优化从同一目录导入少量文件的代码
- authentication - 如何配置 Tomcat 领域超时
- visual-studio-code - 我如何必须设置更漂亮才能为我的所有项目工作,但要为我不单独工作的特定项目进行自定义设置?
- python - 如何仅在 numpy 数组的“一维”上应用 K-means++ 并按原样保留另一维