【问题标题】:AES CBC 128 bit encryption -OpenSSLAES CBC 128 位加密-OpenSSL
【发布时间】:2019-08-17 13:25:48
【问题描述】:

我需要仅通过代码在 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,但这对我也不起作用。 提前致谢。

【问题讨论】:

    标签: c++ c encryption openssl aes


    【解决方案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 风格的字符串呢?

    【讨论】:

    • 那我如何在 unsigned char 中分配字符串??
    • 您有十六进制的密钥作为 ASCII 字符串。 AES_set_encrypt 函数需要 128 位缓冲区中的原始二进制密钥。仔细查看AES_set_encrypt 的文档。
    猜你喜欢
    • 2020-04-15
    • 2013-08-11
    • 1970-01-01
    • 1970-01-01
    • 2021-06-25
    • 1970-01-01
    • 1970-01-01
    • 2017-03-27
    • 2018-12-31
    相关资源
    最近更新 更多