在解密过程中使用错误的密钥时是否会出现 "block padding" 异常?

Is a "block padding" exception expected when using the wrong key during decryption?

我目前正在为自己开发一个密码管理器,与我使用测试向量得到的结果相比,数据库的加密过程工作得非常好。

为了解密密文,我尝试使用我在网上找到的代码,但如果我给程序提供了错误的解密密钥,我会得到一个异常。我想知道捕获此异常是否安全,或者我做错了什么。

我的代码是:

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 的密钥不正确时这是否正常,或者此错误是否可能由其他原因引起。

是的,错误的键可能会发生这种情况。

如果正确的密钥也给出了这个异常,那么你的代码是错误的,但显然这并没有发生。

但请注意,此异常不会保证在错误的键时发生。一些带有错误密钥的数据会产生异常,而另一些则不会(那么解密后的数据就是垃圾)。如果您想要一种可靠的方法来检测错误的密钥,您将需要一个额外的 "checksum" 部分,只是以一种安全的方式。例如。具有不同密钥的 CBC-MAC。

这个异常意味着什么:
AES 使用 16 字节大小的数据块。如果数据长度不是 16 的倍数(例如 16、32、48 可以,但不能是 1、20、45 等),那么有必要在加密之前向原始数据添加一些字节,以便它成为 16 的倍数。这称为填充。解密后,必须再次删除此填充数据才能获得您的原始数据。
"problem" 现在是在加密时,库使用特定的字节值作为填充数据;解密后,它检查值是否匹配。如果没有,您将得到此异常。而且用的是wring key,解密时给错数据,padding部分不太可能是正确的