执行AES解密后字符串末尾的Crypto ++和垃圾

时间:2018-08-24 14:12:54

标签: c++ encryption base64 aes crypto++

我正在将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编码/解码: Base64 Encode/Decode

这是我调用的用于加密/解密的代码:

string encryptedPass = EncryptAES(value, key);
cout << "Encrypted Text: " << encryptedPass << endl;

string decryptedPass = DecryptAES(encryptedPass, key);
cout << "Decryped Text: " << decryptedPass << endl;

这是输出: enter image description here

当我将输出复制并粘贴到Notepad ++中时,会有很多空格。我觉得它可以处理ZEROS_PADDING,但是我需要在其中匹配我们正在使用的其他应用程序。

我不确定如何实际尝试解决此问题。有想法吗?

1 个答案:

答案 0 :(得分:1)

基于注释,我能够弄清楚字符串末尾是什么。我知道它必须处理零填充,但是由于是C ++的新功能,所以我不完全了解发生了什么。

我运行它来获取字符的ascii值:

for(char& c : s){
    cout << "Char:" << (int)c << endl;
}

这导致在字符串末尾出现以下内容:

Char:0
Char:0
Char:0
Char:0
Char:0
Char:0

根据ASCII表,它是NUL

因此,简单的解决方案是:

std::string(value.c_str());