为什么AES加密的结果在w/C#和w/OpenSSL C+之间有巨大差异+;?

为什么AES加密的结果在w/C#和w/OpenSSL C+之间有巨大差异+;?,c#,c++,encryption,openssl,C#,C++,Encryption,Openssl,我试着AESencryption&decryption w/C++w/OpenSSL和C#,到目前为止我已经编写了代码,我发现了一个问题,那就是加密的结果在C#和C++w/OpenSSL之间有巨大的差异,即使我使用了相同的密钥和IV以及相同的模式,到目前为止,我不知道为什么会这样,我还没有测试解密,我展示了我的代码 这是我的C代码,这些代码完全是从MSDN复制的: mydata的结果是: B++/vQ4fB++/ve+/ve+/vXB3CdSe77+9YE9E77+977+9STpsa++/v

我试着
AES
encryption&decryption w/
C++w/OpenSSL
C#
,到目前为止我已经编写了代码,我发现了一个问题,那就是加密的结果在
C#
C++w/OpenSSL
之间有巨大的差异,即使我使用了相同的密钥和IV以及相同的模式,到目前为止,我不知道为什么会这样,我还没有测试解密,我展示了我的代码

这是我的C代码,这些代码完全是从
MSDN
复制的:

mydata的结果是:

B++/vQ4fB++/ve+/ve+/vXB3CdSe77+9YE9E77+977+9STpsa++/vRM+77+977+977+9RRotcRRkXe+/vSbvv70H77+9HGYM77+977+9Gx1t77+906hn77+977+977+977+977+9PO+/ve+/vWBf
这是我的
C++w/OpenSSL

static const std::string base64_chars =
"ABCDEFGHIJKLMNOPQRSTUVWXYZ"
"abcdefghijklmnopqrstuvwxyz"
"0123456789+/";


static inline bool is_base64(unsigned char c) {
   return (isalnum(c) || (c == '+') || (c == '/'));
}

std::string base64_encode(unsigned char const* bytes_to_encode, unsigned int in_len) {
   std::string ret;
   int i = 0;
   int j = 0;
   unsigned char char_array_3[3];
   unsigned char char_array_4[4];

   while (in_len--) {
     char_array_3[i++] = *(bytes_to_encode++);
       if (i == 3) {
        char_array_4[0] = (char_array_3[0] & 0xfc) >> 2;
        char_array_4[1] = ((char_array_3[0] & 0x03) << 4) + ((char_array_3[1] & 0xf0) >> 4);
        char_array_4[2] = ((char_array_3[1] & 0x0f) << 2) + ((char_array_3[2] & 0xc0) >> 6);
        char_array_4[3] = char_array_3[2] & 0x3f;

        for (i = 0; (i <4); i++)
            ret += base64_chars[char_array_4[i]];
        i = 0;
     }
  }

  if (i)
  {
    for (j = i; j < 3; j++)
        char_array_3[j] = '\0';

    char_array_4[0] = (char_array_3[0] & 0xfc) >> 2;
    char_array_4[1] = ((char_array_3[0] & 0x03) << 4) + ((char_array_3[1] & 0xf0) >> 4);
    char_array_4[2] = ((char_array_3[1] & 0x0f) << 2) + ((char_array_3[2] & 0xc0) >> 6);

    for (j = 0; (j < i + 1); j++)
        ret += base64_chars[char_array_4[j]];

    while ((i++ < 3))
        ret += '=';

 }

   return ret;

}



int encryptdate(string plaindatas, string & encryptedatas)
{



const unsigned char iv[16] = { 'Q', 'w', 'e', 'r', '1', '2', '3', '4', 'Q', 'w', 'e', 'r', '1', '2', '3', '4' };

const unsigned char key[24] = { 'A', 'a', '1', '2', '3', '!', '@', '#', 'A', 'a', '1', '2', '3', '!', '@', '#', 'A', 'a', '1', '2', '3', '!', '@', '#' };

const unsigned char * in = reinterpret_cast<const unsigned char *> (plaindatas.c_str());



int written = 0, temp;
unsigned char * outbuf = new unsigned char[plaindatas.length() + 1];
int in_len = plaindatas.length();

EVP_CIPHER_CTX  *ctx;
if (!(ctx = EVP_CIPHER_CTX_new()))
{
    string errstr = ERR_error_string(ERR_get_error(), NULL);
    errstr = "ERROR: EVP_CIPHER_CTX_new failed. OpenSSL error:" + errstr;
    write_text_to_log_file(errstr);
    return -1;
}

if (1 != EVP_EncryptInit_ex(ctx, EVP_aes_128_cbc(), NULL, key, iv))
{
    string errstr = ERR_error_string(ERR_get_error(), NULL);
    errstr = "ERROR: EVP_EncryptInit_ex failed. OpenSSL error:" + errstr;
    write_text_to_log_file(errstr);
    EVP_CIPHER_CTX_cleanup(ctx);
    return -1;
}


EVP_CIPHER_CTX_set_padding(ctx, EVP_PADDING_PKCS7);

if (1 != EVP_EncryptUpdate(ctx, outbuf, &temp, in, in_len))
{
    string errstr = ERR_error_string(ERR_get_error(), NULL);
    errstr = "ERROR: EVP_EncryptUpdate failed. OpenSSL error:" + errstr;
    write_text_to_log_file(errstr);
    EVP_CIPHER_CTX_cleanup(ctx);
    return -1;
}

written = temp;

if (1 != EVP_EncryptFinal_ex(ctx, outbuf + temp, &temp))
{
    string errstr = ERR_error_string(ERR_get_error(), NULL);
    errstr = "ERROR: EVP_EncryptFinal_ex failed. OpenSSL error:" + errstr;
    write_text_to_log_file(errstr);
    EVP_CIPHER_CTX_cleanup(ctx);
    return -1;
}

written += temp;

//EVP_CIPHER_CTX_free(ctx);
EVP_CIPHER_CTX_cleanup(ctx);

encryptedatas = base64_encode(outbuf, written);
return 0;
}



 int main()
 {
    json::value obj;


    valueobj[L"Mdpass"] = json::value::string(passwordw);
    valueobj[L"Curno"] = json::value::string(curnow);
    wstring loginjsonparmjson = valueobj.serialize();
    std::wstring_convert<std::codecvt <wchar_t, char, std::mbstate_t>> converter(new std::codecvt<wchar_t, char, std::mbstate_t>("zh_CN.gb18030"));
    std::string plaintext = converter.to_bytes(loginjsonparmjson);
    std::string chipertext;

     int result = encryptdate(plaintext, chipertext);
 }
结果是:

Wu07vZHFHw8tkQagxwj9YtriMk/vl1R3OS+o1GMODPHv9w4aw8GwxknKL7QsH9gXbFf62cBkffHkjv6w2YxeWQ==

“Base64Encode(System.Text.Encoding.UTF8.GetString(加密))”-为什么使用GetString?为什么不像Rup所说的那样只进行Base64Encode(加密)?同时删除StreamWriter。Base64将字节数组编码为字符串,而不是将字符串编码为另一个字符串。“Base64Encode(System.Text.encoding.UTF8.GetString(encrypted))-为什么使用GetString?为什么不像Rup所说的那样只进行Base64Encode(加密)?同时删除StreamWriter。Base64将字节数组编码为字符串,而不是将字符串编码为另一个字符串。
static const std::string base64_chars =
"ABCDEFGHIJKLMNOPQRSTUVWXYZ"
"abcdefghijklmnopqrstuvwxyz"
"0123456789+/";


static inline bool is_base64(unsigned char c) {
   return (isalnum(c) || (c == '+') || (c == '/'));
}

std::string base64_encode(unsigned char const* bytes_to_encode, unsigned int in_len) {
   std::string ret;
   int i = 0;
   int j = 0;
   unsigned char char_array_3[3];
   unsigned char char_array_4[4];

   while (in_len--) {
     char_array_3[i++] = *(bytes_to_encode++);
       if (i == 3) {
        char_array_4[0] = (char_array_3[0] & 0xfc) >> 2;
        char_array_4[1] = ((char_array_3[0] & 0x03) << 4) + ((char_array_3[1] & 0xf0) >> 4);
        char_array_4[2] = ((char_array_3[1] & 0x0f) << 2) + ((char_array_3[2] & 0xc0) >> 6);
        char_array_4[3] = char_array_3[2] & 0x3f;

        for (i = 0; (i <4); i++)
            ret += base64_chars[char_array_4[i]];
        i = 0;
     }
  }

  if (i)
  {
    for (j = i; j < 3; j++)
        char_array_3[j] = '\0';

    char_array_4[0] = (char_array_3[0] & 0xfc) >> 2;
    char_array_4[1] = ((char_array_3[0] & 0x03) << 4) + ((char_array_3[1] & 0xf0) >> 4);
    char_array_4[2] = ((char_array_3[1] & 0x0f) << 2) + ((char_array_3[2] & 0xc0) >> 6);

    for (j = 0; (j < i + 1); j++)
        ret += base64_chars[char_array_4[j]];

    while ((i++ < 3))
        ret += '=';

 }

   return ret;

}



int encryptdate(string plaindatas, string & encryptedatas)
{



const unsigned char iv[16] = { 'Q', 'w', 'e', 'r', '1', '2', '3', '4', 'Q', 'w', 'e', 'r', '1', '2', '3', '4' };

const unsigned char key[24] = { 'A', 'a', '1', '2', '3', '!', '@', '#', 'A', 'a', '1', '2', '3', '!', '@', '#', 'A', 'a', '1', '2', '3', '!', '@', '#' };

const unsigned char * in = reinterpret_cast<const unsigned char *> (plaindatas.c_str());



int written = 0, temp;
unsigned char * outbuf = new unsigned char[plaindatas.length() + 1];
int in_len = plaindatas.length();

EVP_CIPHER_CTX  *ctx;
if (!(ctx = EVP_CIPHER_CTX_new()))
{
    string errstr = ERR_error_string(ERR_get_error(), NULL);
    errstr = "ERROR: EVP_CIPHER_CTX_new failed. OpenSSL error:" + errstr;
    write_text_to_log_file(errstr);
    return -1;
}

if (1 != EVP_EncryptInit_ex(ctx, EVP_aes_128_cbc(), NULL, key, iv))
{
    string errstr = ERR_error_string(ERR_get_error(), NULL);
    errstr = "ERROR: EVP_EncryptInit_ex failed. OpenSSL error:" + errstr;
    write_text_to_log_file(errstr);
    EVP_CIPHER_CTX_cleanup(ctx);
    return -1;
}


EVP_CIPHER_CTX_set_padding(ctx, EVP_PADDING_PKCS7);

if (1 != EVP_EncryptUpdate(ctx, outbuf, &temp, in, in_len))
{
    string errstr = ERR_error_string(ERR_get_error(), NULL);
    errstr = "ERROR: EVP_EncryptUpdate failed. OpenSSL error:" + errstr;
    write_text_to_log_file(errstr);
    EVP_CIPHER_CTX_cleanup(ctx);
    return -1;
}

written = temp;

if (1 != EVP_EncryptFinal_ex(ctx, outbuf + temp, &temp))
{
    string errstr = ERR_error_string(ERR_get_error(), NULL);
    errstr = "ERROR: EVP_EncryptFinal_ex failed. OpenSSL error:" + errstr;
    write_text_to_log_file(errstr);
    EVP_CIPHER_CTX_cleanup(ctx);
    return -1;
}

written += temp;

//EVP_CIPHER_CTX_free(ctx);
EVP_CIPHER_CTX_cleanup(ctx);

encryptedatas = base64_encode(outbuf, written);
return 0;
}



 int main()
 {
    json::value obj;


    valueobj[L"Mdpass"] = json::value::string(passwordw);
    valueobj[L"Curno"] = json::value::string(curnow);
    wstring loginjsonparmjson = valueobj.serialize();
    std::wstring_convert<std::codecvt <wchar_t, char, std::mbstate_t>> converter(new std::codecvt<wchar_t, char, std::mbstate_t>("zh_CN.gb18030"));
    std::string plaintext = converter.to_bytes(loginjsonparmjson);
    std::string chipertext;

     int result = encryptdate(plaintext, chipertext);
 }
{"Curno":"01","Mdpass":"140154fc6134c9b9faf77b3f348dee03"}
Wu07vZHFHw8tkQagxwj9YtriMk/vl1R3OS+o1GMODPHv9w4aw8GwxknKL7QsH9gXbFf62cBkffHkjv6w2YxeWQ==