我正在使用cryptopp库的5.6.2版本,并尝试对字符串进行一些简单的AES加密,然后将其发送到文件,然后再次尝试读取。
当我在同一个函数中加密和解密字符串时,我的调用一切正常。但它将事物保存到一个无效的文件中。
我的单元测试是这样的:
TEST_METHOD(TestEncryptedFile)
{
using namespace std;
HardWareInfo info;
std::ofstream outfile(_T("test.dat"), std::ios_base::binary);
const char* cyphert = info.ToEncryptedString();
if (!outfile.bad())
{
outfile << cyphert;
outfile.close();
}
std::ifstream infile(_T("test.dat"), std::ios_base::binary);
if (!infile.bad())
{
stringstream sstr;
sstr << infile.rdbuf();
infile.close();
std::string ss = sstr.str();
HardWareInfo deserializd;
deserializd.FromEncryptedString(ss.c_str());
}
}
但它失败了抛出异常(第二个)说明无效的PKCS块:
if (length != s)
throw InvalidCiphertext("StreamTransformationFilter: ciphertext length is not a multiple of block size");
m_cipher.ProcessData(space, inString, s);
if (m_padding == PKCS_PADDING)
{
byte pad = space[s-1];
if (pad < 1 || pad > s || std::find_if(space+s-pad, space+s, std::bind2nd(std::not_equal_to<byte>(), pad)) != space+s)
throw InvalidCiphertext("StreamTransformationFilter: invalid PKCS #7 block padding found");
length = s-pad;
}
调用解密例程的代码是这样的:
std::string ciphertext = cyphertext
std::string decryptedtext;
CryptoPP::AES::Decryption aesDecryption(key, CryptoPP::AES::DEFAULT_KEYLENGTH);
CryptoPP::CBC_Mode_ExternalCipher::Decryption cbcDecryption(aesDecryption, iv);
CryptoPP::StreamTransformationFilter stfDecryptor(cbcDecryption, new CryptoPP::StringSink(decryptedtext));
stfDecryptor.Put(reinterpret_cast<const unsigned char*>(ciphertext.c_str()), ciphertext.size());
stfDecryptor.MessageEnd();
知道我做错了吗?
谢谢!
答案 0 :(得分:0)
deserializd.FromEncryptedString(ss.c_str());
正如@Iridium所说,这就是问题所在。但这可能不是你唯一的问题(我们需要查看更多代码)。
您需要更改该功能签名:
deserializd.FromEncryptedString(ss.c_str(), ss.length());