我目前正在为自己的密码管理器工作,数据库的加密过程完全正常,比较我得到的测试向量的结果。
要解密密文,我正在尝试使用我在网络上找到的代码但是如果我给程序提供了错误的解密密钥,我会得到一个例外。我想知道捕获这个异常是否安全,或者是否是我做错了。
我的代码是:
CryptoPP::CBC_Mode<CryptoPP::AES>::Decryption aesDecryption;
aesDecryption.SetKeyWithIV(derivedKey, sizeof(derivedKey), initVector);
// The StreamTransformationFilter removes
// padding as required.
CryptoPP::StringSource ss(encryptedString, true,
new CryptoPP::StreamTransformationFilter(aesDecryption,
new CryptoPP::StringSink(decryptedData)
) // StreamTransformationFilter
); // StringSource
其中derivedKey是由PBKDF2生成的unsigned char*
,initVector
也是unsigned char*
,encryptedString
是包含我想要解密的数据的字符串,decryptedData
是一个放置解密数据的字符串。
如果我使用右derivedKey
执行此代码,一切正常。但是如果我尝试使用错误的derivedKey
,我会从Crypto ++中收到以下错误:
StreamTransformationFilter: invalid PKCS #7 block padding found
我想知道当StreamTransformationFitler
的密钥不正确,或者其他内容发生此错误时,这是否正常。
答案 0 :(得分:1)
是的,错误的密钥可能会发生这种情况。
如果正确的密钥也给出了这个例外,那么你的代码是错误的,但显然这并没有发生。
但请注意,此错误 not 保证会出现错误的密钥。一些带有错误密钥的数据会产生异常,其他数据则会失败(然后解密数据就是垃圾)。如果您想要一种可靠的方法来解决错误的密钥,那么您需要额外的&#34;校验和&#34;部分,只是以安全的方式。例如。 CBC-MAC使用不同的密钥。
这个例外意味着什么:
AES适用于16字节大小的数据块。如果数据长度不是16的倍数(例如16,32,48可以,但不是1,20,45等),那么在加密之前需要在原始数据中添加一些字节。 ,使它成为16的倍数。这称为填充。解密后,必须再次删除此填充数据以获取原始数据
&#34;问题&#34;现在,当加密时,库使用特定的字节值作为填充数据;并在解密后,检查值是否匹配。如果没有,您将获得此异常。使用拧密钥,在解密时提供错误数据,填充部分不太可能正确。