【问题标题】:StreamTransformationFilter: invalid PKCS #7 block padding found in AES decryptionStreamTransformationFilter:在 AES 解密中发现无效的 PKCS #7 块填充
【发布时间】:2016-01-13 09:30:03
【问题描述】:

我想在我的 C++ 代码中使用 AES-256 加密/解密来做到这一点,我使用 cryptoPP 库,我已经实现了加密和解密。但我得到Error : StreamTransformationFilter: invalid PKCS #7 block padding found 错误。

我测试的情景是:

首先我加密我的明文然后解密 --> 这里没有错误。

第二次我解密上面创建的密码 --> 这里我得到了错误。

我知道这里有同样的问题,但我无法解决我的问题:(

这里我设置了iv:

byte iv[16];
string strIv = "162169848599E7C792BF58BFA53D88E6";
memcpy(iv, strIv.data(), strIv.length());

加密:

string CryptoAES::Encrypt(string plain, string strkey) {
    cout << "\nplain text :" << plain;
    cout << "\n key to encrypt: " <<strkey;
    byte key[AES::MAX_KEYLENGTH];
    memcpy(key, strkey.data(), strkey.length());
    string encodedKey, decodedKey,ciphertextEncode,ciphertext;
    encodedKey.clear();
    decodedKey.clear();
    ciphertextEncode.clear();
    ciphertext.clear();
    StringSource(key, sizeof (key), true, new HexEncoder(new StringSink(encodedKey))); 
    StringSource ssk(encodedKey, true, new HexDecoder(new StringSink(decodedKey)));
    memcpy(key, decodedKey.data(), decodedKey.length());
    CryptoPP::AES::Encryption aesEncryption(key, AES::MAX_KEYLENGTH);
    CryptoPP::CBC_Mode_ExternalCipher::Encryption cbcEncryption(aesEncryption, iv);

    CryptoPP::StreamTransformationFilter stfEncryptor(cbcEncryption, new CryptoPP::StringSink(ciphertext));
    stfEncryptor.Put(reinterpret_cast<const unsigned char*> (plain.c_str()), plain.length() + 1);
    stfEncryptor.MessageEnd();
    StringSource ss(ciphertext, true, new HexEncoder(new StringSink(ciphertextEncode)));
    cout << "\nencrypted text: " <<ciphertextEncode;
    return ciphertextEncode;
}

解密:

string CryptoAES::Decrypt(string cipher, string strkey) {
    cout <<"\ncipher text : "<< cipher;
    cout << "\n key to decrypt: " <<strkey;
    byte key[AES::MAX_KEYLENGTH];
    memcpy(key, strkey.data(), strkey.length());
    string encodedKey, decodedKey,ciphertextDecode,decryptedtext;
    encodedKey.clear();
    decodedKey.clear();
    ciphertextDecode.clear();
    decryptedtext.clear();
    StringSource(key, sizeof (key), true, new HexEncoder(new StringSink(encodedKey))); 
    StringSource ssk(encodedKey, true, new HexDecoder(new StringSink(decodedKey)));
    memcpy(key, decodedKey.data(), decodedKey.length());
    StringSource ss(cipher, true, new HexDecoder(new StringSink(ciphertextDecode)));
    CryptoPP::AES::Decryption aesDecryption(key, AES::MAX_KEYLENGTH);
    CryptoPP::CBC_Mode_ExternalCipher::Decryption cbcDecryption(aesDecryption, iv);

    CryptoPP::StreamTransformationFilter stfDecryptor(cbcDecryption, new CryptoPP::StringSink(decryptedtext));
    stfDecryptor.Put(reinterpret_cast<const unsigned char*> (ciphertextDecode.c_str()), ciphertextDecode.size());
    stfDecryptor.MessageEnd();

    cout <<"\ndecrypted text: "<<decryptedtext;
    return decryptedtext;
}

结果:

plain text :F7ACA191B43AFAF85277DD196FE0441CB7C0901BEC33CB9F38FFAA54CBF219B9
 key to encrypt: 123456
encrypted text: 6FC1BF3108B0590367E6449B6E615CACFDF4DE16EDD05742C873EE4E8A16BA9EC0B8EFAD800F466EE9A6F75202C8800CF4CBDD2620956020D5B0A6A9A8DCEA9EDB5C470527423ACBEEDD0A9C59916C8B
cipher text : 6FC1BF3108B0590367E6449B6E615CACFDF4DE16EDD05742C873EE4E8A16BA9EC0B8EFAD800F466EE9A6F75202C8800CF4CBDD2620956020D5B0A6A9A8DCEA9EDB5C470527423ACBEEDD0A9C59916C8B
 key to decrypt: 123456
decrypted text: F7ACA191B43AFAF85277DD196FE0441CB7C0901BEC33CB9F38FFAA54CBF219B9
cipher text : 6FC1BF3108B0590367E6449B6E615CACFDF4DE16EDD05742C873EE4E8A16BA9EC0B8EFAD800F466EE9A6F75202C8800CF4CBDD2620956020D5B0A6A9A8DCEA9EDB5C470527423ACBEEDD0A9C59916C8B                                                                                                    
 key to decrypt: 123456
exception in proxy server! :( 
    Error : StreamTransformationFilter: invalid PKCS #7 block padding found

编辑#1: 这是新版本的方法:

四:

for (int i = 0; i < AES::BLOCKSIZE; i++)
        iv[i] = 0;

加密:

string CryptoAES::Encrypt(string plain, string strkey) {

    byte key[AES::MAX_KEYLENGTH];
    byte* k = (byte*) strkey.c_str();

    for (int i = 0; i < AES::MAX_KEYLENGTH; i++)
        if (i<sizeof (k))
            key[i] = k[i];
        else
            key[i] = 0;
    string ciphertextEncode,ciphertext;
    cout << "\nplain text :" << plain;
    cout << "\n key to encrypt: " <<key;
    ciphertextEncode.clear();
    ciphertext.clear();
    CryptoPP::AES::Encryption aesEncryption(key, AES::MAX_KEYLENGTH);
    CryptoPP::CBC_Mode_ExternalCipher::Encryption cbcEncryption(aesEncryption, iv);

    CryptoPP::StreamTransformationFilter stfEncryptor(cbcEncryption, new CryptoPP::StringSink(ciphertext));
    stfEncryptor.Put(reinterpret_cast<const unsigned char*> (plain.c_str()), plain.length() + 1);
    stfEncryptor.MessageEnd();
    cout << "\nencrypted text: " <<ciphertext;
    StringSource ss(ciphertext, true, new HexEncoder(new StringSink(ciphertextEncode)));
    cout << "\nencoded encrypted text: " <<ciphertextEncode;
    return ciphertextEncode;
}

解密:

string CryptoAES::Decrypt(string cipher, string strkey) {

    byte key[AES::MAX_KEYLENGTH];
    byte* k = (byte*) strkey.c_str();

    for (int i = 0; i < AES::MAX_KEYLENGTH; i++)
        if (i<sizeof (k))
            key[i] = k[i];
        else
            key[i] = 0;
    string ciphertextDecode,decryptedtext;
    cout <<"\ncipher text : "<< cipher;
    cout << "\n key to decrypt: " <<key;
    ciphertextDecode.clear();
    decryptedtext.clear();

    StringSource ss(cipher, true, new HexDecoder(new StringSink(ciphertextDecode)));
    cout << "\n cipher decoded: " << ciphertextDecode;
    CryptoPP::AES::Decryption aesDecryption(key, AES::MAX_KEYLENGTH);
    CryptoPP::CBC_Mode_ExternalCipher::Decryption cbcDecryption(aesDecryption, iv);

    CryptoPP::StreamTransformationFilter stfDecryptor(cbcDecryption, new CryptoPP::StringSink(decryptedtext));
    stfDecryptor.Put(reinterpret_cast<const unsigned char*> (ciphertextDecode.c_str()), ciphertextDecode.size());
    stfDecryptor.MessageEnd();

    cout <<"\ndecrypted text: "<<decryptedtext;
    return decryptedtext;
}

结果:

plain text :0C469BEA09DFCAC0A555E74175F1A614F471A5205FEB13A72C2DFFE8C4B52AA4
 key to encrypt: 123456
encrypted text: �����z�����_���d�0�kߨ���^G�o���zL��Z��fc�L��X���,<X*-R_��x��?�  �U$�
encoded encrypted text: D8F68E8E8B7AADB094A5BD5FC117BFBA648130E46BDFA8B6DD0EA35E17478F6FA01AA38E0417B4087A4CAEBB5AB8C466639C4C84F35895C07FB2172C3C582A2D525FFDDC78A9F83FEFA50913E55524C1
cipher text : D8F68E8E8B7AADB094A5BD5FC117BFBA648130E46BDFA8B6DD0EA35E17478F6FA01AA38E0417B4087A4CAEBB5AB8C466639C4C84F35895C07FB2172C3C582A2D525FFDDC78A9F83FEFA50913E55524C1
 key to decrypt: 123456
 cipher decoded: �����z�����_���d�0�kߨ���^G�o���zL��Z��fc�L��X���,<X*-R_��x��?� �U$�
decrypted text: 0C469BEA09DFCAC0A555E74175F1A614F471A5205FEB13A72C2DFFE8C4B52AA4
cipher text : D8F68E8E8B7AADB094A5BD5FC117BFBA648130E46BDFA8B6DD0EA35E17478F6FA01AA38E0417B4087A4CAEBB5AB8C466639C4C84F35895C07FB2172C3C582A2D525FFDDC78A9F83FEFA50913E55524C1                                                                                               
 key to decrypt: 123456
 cipher decoded: �����z�����_���d�0�kߨ���^G�o���zL��Z��fc�L��X���,<X*-R_��x��?� �U$�
exception in proxy server! :( 
    StreamTransformationFilter: invalid PKCS #7 block padding found

【问题讨论】:

  • @jww,你能帮我吗?
  • 1.您使用的是 32 字节的 iv,大概您期望 memcpy 转换十六进制字符串,但事实并非如此。 2. 您正在使用 6 字节密钥作为 256 位密钥,不要,使用正确长度的密钥。 3. 修复结果中最后一行,将key与错误信息分开,这很混乱。
  • 您在加密前和加密后使用十六进制编码,这不是必需的,也不应该这样做。使用 64 字节进行加密并使用 PKCS#7 填充,加密输出应该是 80 字节,而不是 160 字节的两倍。你需要花时间学习 CryptoAES。
  • @zaph,我已经编辑了代码。但是我又遇到了同样的错误,因为我想将加密的字符串保存到 postgres 数据库中,所以我应该以我可以存储的方式转换加密的文本。
  • 加密文本不可打印,应以十六进制显示。

标签: c++ aes crypto++


【解决方案1】:

我终于解决了问题。

第一:

string cipherstring strkey 具有 \0 填充。

秒:

在两个方法之间共享的iv[16] 值已更改!所以我在每个方法中都设置了它。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-09-10
    • 2017-01-31
    • 1970-01-01
    • 1970-01-01
    • 2013-11-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多