执行 AES 解密后字符串末尾的 Crypto++ 和垃圾
Crypto++ and garbage at end of string after performing AES decryption
我正在将 Crypto++ 集成到我的 C++ 应用程序中,到目前为止它几乎可以正常工作。
加密完美。输出符合我的预期。但是,当我去解密时,它在末尾添加了方块字符。
这是我的加密函数:
string Encryption::EncryptAES(const string &text, const string &key) {
string cipher;
AES::Encryption aes((byte *) key.c_str(), 32);
ECB_Mode_ExternalCipher::Encryption ecb(aes);
StreamTransformationFilter encrypt(ecb, new StringSink(cipher), StreamTransformationFilter::ZEROS_PADDING);
encrypt.Put(reinterpret_cast<const unsigned char *>( text.c_str()), text.length() + 1);
encrypt.MessageEnd();
return Base64::Encode(cipher);
}
这是我的解密函数:
string Encryption::DecryptAES(const string &text, const string &key) {
string decoded;
Base64::Decode(text, decoded);
string decrypted;
AES::Decryption aes((byte *) key.c_str(), 32);
ECB_Mode_ExternalCipher::Decryption ecb(aes);
StreamTransformationFilter decrypt(ecb, new StringSink(decrypted), StreamTransformationFilter::ZEROS_PADDING);
decrypt.Put(reinterpret_cast<const unsigned char *>( decoded.c_str()), decoded.length());
decrypt.MessageEnd();
return decrypted;
}
我将以下内容用于 Base64 Encode/Decode:
Base64 Encode/Decode
这是我调用 encrypt/decrypt 的代码:
string encryptedPass = EncryptAES(value, key);
cout << "Encrypted Text: " << encryptedPass << endl;
string decryptedPass = DecryptAES(encryptedPass, key);
cout << "Decryped Text: " << decryptedPass << endl;
这是输出:
当我将输出复制并粘贴到 Notepad++ 中时,它是一堆空格。我感觉它处理 ZEROS_PADDING
,但我需要它与我们正在使用的其他应用程序相匹配。
我不确定如何实际尝试解决此问题。想法?
根据评论,我能够弄清楚字符串末尾的内容。我知道它必须处理零填充,但由于是 C++ 的新手,我没有完全理解发生了什么。
我运行这样获取字符的ascii值:
for(char& c : s){
cout << "Char:" << (int)c << endl;
}
这导致字符串末尾出现以下内容:
Char:0
Char:0
Char:0
Char:0
Char:0
Char:0
根据 ASCII table 是 NUL
所以,解决这个问题的简单方法是:
std::string(value.c_str());
我正在将 Crypto++ 集成到我的 C++ 应用程序中,到目前为止它几乎可以正常工作。
加密完美。输出符合我的预期。但是,当我去解密时,它在末尾添加了方块字符。
这是我的加密函数:
string Encryption::EncryptAES(const string &text, const string &key) {
string cipher;
AES::Encryption aes((byte *) key.c_str(), 32);
ECB_Mode_ExternalCipher::Encryption ecb(aes);
StreamTransformationFilter encrypt(ecb, new StringSink(cipher), StreamTransformationFilter::ZEROS_PADDING);
encrypt.Put(reinterpret_cast<const unsigned char *>( text.c_str()), text.length() + 1);
encrypt.MessageEnd();
return Base64::Encode(cipher);
}
这是我的解密函数:
string Encryption::DecryptAES(const string &text, const string &key) {
string decoded;
Base64::Decode(text, decoded);
string decrypted;
AES::Decryption aes((byte *) key.c_str(), 32);
ECB_Mode_ExternalCipher::Decryption ecb(aes);
StreamTransformationFilter decrypt(ecb, new StringSink(decrypted), StreamTransformationFilter::ZEROS_PADDING);
decrypt.Put(reinterpret_cast<const unsigned char *>( decoded.c_str()), decoded.length());
decrypt.MessageEnd();
return decrypted;
}
我将以下内容用于 Base64 Encode/Decode: Base64 Encode/Decode
这是我调用 encrypt/decrypt 的代码:
string encryptedPass = EncryptAES(value, key);
cout << "Encrypted Text: " << encryptedPass << endl;
string decryptedPass = DecryptAES(encryptedPass, key);
cout << "Decryped Text: " << decryptedPass << endl;
这是输出:
当我将输出复制并粘贴到 Notepad++ 中时,它是一堆空格。我感觉它处理 ZEROS_PADDING
,但我需要它与我们正在使用的其他应用程序相匹配。
我不确定如何实际尝试解决此问题。想法?
根据评论,我能够弄清楚字符串末尾的内容。我知道它必须处理零填充,但由于是 C++ 的新手,我没有完全理解发生了什么。
我运行这样获取字符的ascii值:
for(char& c : s){
cout << "Char:" << (int)c << endl;
}
这导致字符串末尾出现以下内容:
Char:0
Char:0
Char:0
Char:0
Char:0
Char:0
根据 ASCII table 是 NUL
所以,解决这个问题的简单方法是:
std::string(value.c_str());