StreamTransformationFilter:在 AES 解密中发现无效的 PKCS #7 块填充
StreamTransformationFilter: invalid PKCS #7 block padding found in AES decryption
我想在我的 C++ 代码中使用 AES-256 encryption/decryption 我使用 cryptoPP 库,我已经实现了加密和解密。但我收到 Error : StreamTransformationFilter: invalid PKCS #7 block padding found
错误。
我测试的senario是:
我先加密 myplaintext 然后解密 --> 这里没有错误。
然后我解密上面创建的密码 --> 这里我得到了错误。
我知道这里有同样的问题,但我无法解决我的问题:(
这里我设置了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
终于解决了问题
第一:
string cipher
和 string strkey
有 [=12=]
填充。
秒:
两个方法共享的 iv[16]
值已更改!所以我在每个方法中都设置了它。
我想在我的 C++ 代码中使用 AES-256 encryption/decryption 我使用 cryptoPP 库,我已经实现了加密和解密。但我收到 Error : StreamTransformationFilter: invalid PKCS #7 block padding found
错误。
我测试的senario是:
我先加密 myplaintext 然后解密 --> 这里没有错误。
然后我解密上面创建的密码 --> 这里我得到了错误。
我知道这里有同样的问题,但我无法解决我的问题:(
这里我设置了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
终于解决了问题
第一:
string cipher
和 string strkey
有 [=12=]
填充。
秒:
两个方法共享的 iv[16]
值已更改!所以我在每个方法中都设置了它。