Encryption 如何检查解密是否成功?

Encryption 如何检查解密是否成功?,encryption,openssl,Encryption,Openssl,使用openssl库中的blowfish算法时,可以对任何数据进行加密和解密 此外,任何数据都可以使用任何密钥\iv进行加密(解密)。在openssl中无法判断解密是否成功。这只是一些数学变换 那么,我应该做些什么来确保加密成功:一些数据使用与加密相同的密钥/iv进行解密 是否应该在解密后检查数据之前添加一些神奇的字节?在许多可能的解决方案中,,也许考虑使用.< /p> ,可以在文件末尾添加校验和(例如,原始内容的MD5)。解密后,最后16个字节必须再次等于md5(content-16字节)我认

使用openssl库中的blowfish算法时,可以对任何数据进行加密和解密

此外,任何数据都可以使用任何密钥\iv进行加密(解密)。在openssl中无法判断解密是否成功。这只是一些数学变换

那么,我应该做些什么来确保加密成功:一些数据使用与加密相同的密钥/iv进行解密


是否应该在解密后检查数据之前添加一些神奇的字节?在许多可能的解决方案中,

,也许考虑使用.< /p> ,可以在文件末尾添加校验和(例如,原始内容的MD5)。解密后,最后16个字节必须再次等于md5(content-16字节)

我认为数据末尾的校验和方法是最好的,但是它需要您解密整个内容直到最后

从这个角度来看,开始时的魔法字节将是一个优势,因为您可以在第一个块决定解密是否成功。然而,有人可能会争辩说,通过检查源代码,攻击者可能具有优势(部分已知的明文场景)

因此,我所做的(最后在一个高效软件中)是在第一个块中使用密钥本身(而不是使用常量或可预测的魔法字节)。这将为攻击者带来以下额外知识:

key = decrypt(ciphertext, key)

我没有找到证据证明,如果您使用AES,这将是对攻击者有用的提示。也许有人对此了解得更多。

魔法字节、校验和和加密密钥都使暴力攻击变得更容易,因为攻击者只需运行2ˆ256种可能性,即可通过解密运行消息,并在解密数据中查找魔法、校验和或密钥。
如果他没有需要寻找的东西,就很难破坏它,这意味着他可能会破坏它,并且永远不会意识到它。

MD5可以用作校验和函数,因为它的冲突率相对较低。当然,它不是一个典型的校验和函数,但它很容易计算,而且速度也很快(我知道CRC更快;-)@naivists:关键是“校验和”与“散列算法”是不同的。是的,这就是正确的方法。如果你想额外的安全,你可以考虑使用MAC而不是一个普通的散列函数,这将需要一个额外的秘密密钥来计算数据的MAC。@ Krsytian:有一个比较新的构造,称为具有额外数据的认证加密,或者AEAD,它加密和Mac你的数据类型的一对一操作。请参阅RFC 5084和RFC 5116。@jldupont:我不认为校验和和和哈希在本质上是不同的。有关详细讨论,请参阅。魔法字节会有所帮助。更好的方法是在加密数据中添加一个安全的散列,正如naivists在下面概述的那样。根据Wikipedia的文章,“应用于任意长度的数据块的n位CRC将检测不超过n位的任何单个错误突发”。这意味着我应该使用长度与加密消息相同的CRC?因为,据我所知,用错误密钥解密的消息中的“错误”很可能具有最大长度(消息长度)。这似乎不节省内存。不,例如:32位CRC将检测不超过32位的任何单位错误突发,与加密消息长度无关。换句话说,它的内存效率非常高。希望这有帮助。等等,等等,等等:-)若消息是用错误的密钥解密的,那个么错误长度将和消息长度相同,对吗?因为很可能每一点都是错的。对吗?这是否意味着不会检测到超过32位的消息中的错误?抱歉,可能是愚蠢的问题。即使消息差异为100%,CRC也可以检测到这种情况。如果你需要更多的数学确认,也许你应该考虑问这个问题。