执行 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());