AES CBC 128位加密-OpenSSL

时间:2019-03-27 03:35:37

标签: c++ c encryption openssl aes

我只需要通过代码在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已经回答了这个问题,但对我来说也不起作用。 预先感谢。

1 个答案:

答案 0 :(得分:-1)

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风格的字符串?