我只需要通过代码以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
(已通过在线site并通过c#代码进行了验证)。
帮我..
此问题已得到here的回答,但对我也不起作用。
在此先感谢。
最佳答案
string in = "abcdefgh";
unsigned char input[in.length()];
strcpy((char*) input, in.c_str());
strcpy
函数适用于C风格的字符串。这意味着您需要将input
扩展为C型字符串来容纳"abcefgh"
。但是,您将其设置为一个字节太小,因为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风格的字符串?