为什么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==