我研究了几种形式的加密/散列,并且经常遇到“安全位”一词。例如,至少有一个消息来源声称 SHA-256 = AES128 = ECC256 = 128 位安全性。
我的问题是,如果这是真的,我可以采用 256 位 SHA-256 摘要并将其压缩到 128 位而不损失安全性吗?(例如,只取摘要的高 128 位和低 128 位的异或)
在我的特殊情况下,摘要很小很重要。提前感谢您的任何回复。
我研究了几种形式的加密/散列,并且经常遇到“安全位”一词。例如,至少有一个消息来源声称 SHA-256 = AES128 = ECC256 = 128 位安全性。
我的问题是,如果这是真的,我可以采用 256 位 SHA-256 摘要并将其压缩到 128 位而不损失安全性吗?(例如,只取摘要的高 128 位和低 128 位的异或)
在我的特殊情况下,摘要很小很重要。提前感谢您的任何回复。
加密哈希函数必须具有几个属性:
这些属性并不等价,您不一定需要所有这些属性。这取决于您使用散列函数的协议。例如,散列函数用于数字签名的初始步骤,冲突不是问题——除非攻击者能够选择要签名的确切消息。细节可能很微妙。
如果哈希函数的输出为n位,则存在通用攻击,它们分别找到原像、第二原像和与成本的冲突,分别为 2 n、 2 n和 2 n /2。“通用”攻击意味着它适用于所有哈希函数,无论它们多么完美。这设置了最大可实现的安全级别。
如果您将 SHA-256 输出“压缩”为 128 位(无论您可能想要使用什么压缩过程,甚至是简单的截断),那么您实际上是在定义一个具有 128 位输出的新哈希函数。因此,该函数对原像和第二原像的抵抗力最多为 2 128,而对碰撞的抵抗力最多为 2 64。因此,您的截断 SHA-256 将仅在冲突不是问题的使用环境中提供“128 位安全性”。但由于很难确定冲突确实不是问题,因此不建议“压缩”散列函数输出。
一般来说,我们宁愿安全也不愿后悔;因此,当我们想要“128 位安全性”时,我们使用 256 位散列函数。这样,我们就不必担心碰撞是否会被用于实际攻击。SHA-256 冲突在现有技术下是不可行的。
任何强 256 位加密散列是否具有 128 或 256 位的安全级别的评估完全取决于它的使用方式。在攻击者只需找到任何哈希冲突即可成功的应用程序中,安全级别不能超过 128 位,因为简单的生日攻击将(概率)在 2^128 次随机尝试后成功。如果将散列缩短为 128 位散列,则在此上下文中将其安全级别降低到 64 位。
然而,应用程序是可以想象的,成功的攻击必须找到一个(或很少)给定哈希的冲突,例如伪造数字签名消息不是通过伪造签名本身,而是通过找到产生相同的不同消息哈希(这是签名方案实际签名的内容)。在仅存在一个真实签名的极端情况下,当仅在本示例中使用时,SHA256 可以说允许 256 位的安全级别。