如何检查解密是不是成功?
Posted
技术标签:
【中文标题】如何检查解密是不是成功?【英文标题】:How to check whether decrypting was successful?如何检查解密是否成功? 【发布时间】:2010-12-31 09:30:26 【问题描述】:使用 openssl 库中的河豚算法时,可以加密和解密任何数据。
此外,任何数据都可以使用任何密钥\iv 加密(解密)。 openssl 中没有办法判断解密是否成功。这只是一些数学变换。
那么,我应该怎么做才能确保加密成功:某些数据是使用与加密相同的密钥/iv 解密的?
我应该在解密后检查的数据前面添加一些 MAGIC 字节吗?
【问题讨论】:
魔术字节会有所帮助。更好的做法是为加密数据添加安全哈希,如下文所述。 【参考方案1】:您可以在文件末尾添加校验和(例如,原始内容的 MD5)。解密后,最后 16 个字节必须再次等于 md5(content-16 bytes)
【讨论】:
MD5 可以用作校验和函数,因为它的碰撞率相对较低。当然,它不是典型的校验和函数,但它很容易计算,而且速度相当快(我知道 CRC 更快;-) @naivists:关键是“校验和”与“散列算法”是不同的野兽。 是的,这就是要走的路。如果您想更加安全,可以考虑使用 MAC 而不是普通的哈希函数,这需要额外的密钥来计算数据的 MAC。 @Krsytian:有一个相对较新的结构,称为附加数据的身份验证加密,或 AEAD,它对您的数据进行加密和 MAC 的一体化操作。请参阅 RFC 5084 和 RFC 5116。 @jldupont:我不认为校验和和哈希在本质上是不同的。请参阅***.com/questions/460576/… 进行良好的讨论。【参考方案2】:在众多可能的解决方案中,不妨考虑使用CRC。
【讨论】:
根据 Wikipedia 文章,“n 位 CRC,应用于任意长度的数据块,将检测不超过 n 位的任何单个错误突发”。这意味着我应该使用长度与我的加密消息相同的 CRC?因为,据我了解,使用错误密钥解密的消息中的“错误”很可能具有最大长度(消息长度)。这似乎不是内存效率。 否,例如:32 位 CRC 将检测任何单位错误突发不超过 32 位独立加密消息长度。换句话说,它非常节省内存。希望这会有所帮助。 等待,等待,等待 :-) 如果消息是用错误的密钥解密的,那么错误长度将与消息长度相同,对吧?因为很可能每一点都是错误的。正确的?这是否意味着不会检测到超过 32 位的消息中的错误?抱歉,也许是愚蠢的问题。 即使消息 100% 不同,CRC 也可以检测到这种情况。如果您需要更多的数学确认,也许您应该考虑在mathoverflow.com 上提问【参考方案3】:我认为数据末尾的校验和方法是最好的,但是它需要您将整个内容解密到最后。
从这个角度来看,开头的魔术字节将是一个优势,因为您可以在第一个块时确定解密是否成功。但是,有人可能会争辩说,通过检查您的源代码,攻击者可能具有优势(部分已知的明文场景)。
所以我所做的(最终在生产软件中)将密钥本身用于第一个块(而不是使用常量或可预测的魔术字节)。这会为攻击者带来以下额外知识:
key = decrypt(ciphertext, key)
如果您使用例如AES。也许有人对此了解更多。
【讨论】:
【参考方案4】:魔术字节、校验和和加密的加密密钥都使暴力攻击更容易,因为攻击者只需要遍历 2^256 种可能性,他就可以通过解密运行消息并寻找那个魔法或校验和或里面的密钥解密的数据。 如果他没有什么可寻找的,他更难打破它,这意味着他可能会打破它而永远不会意识到。
【讨论】:
以上是关于如何检查解密是不是成功?的主要内容,如果未能解决你的问题,请参考以下文章