使用RSA进行哈希处理

8

我在考虑使用RSA加密算法创建哈希函数(例如md5或sha1)。我想知道是否有任何明显的原因导致此算法不起作用:

  1. 生成RSA公钥/私钥。
  2. 丢弃私钥,根本不存储它。
  3. 以RSA加密块大小为长度开始哈希。
  4. 使用公钥对消息进行加密,逐块进行。
  5. 对于消息的每个加密块,使用指定算法(可能是+、xor等的组合)将其累加到哈希中。

要验证消息与存储的哈希相同,请使用保存的公钥并重复上述过程。

这种方法可行吗?安全吗?实用吗?

感谢任何意见。

5个回答

7

RSA加密是不确定性的:如果您遵循RSA标准,您将看到一些随机字节被注入。因此,如果您使用RSA加密相同的消息两次,很有可能您不会得到两次相同的输出。

另外,您的“未指定步骤5”可能会很薄弱。例如,如果您定义了一种方法来哈希一个块,然后只是对块进行XOR运算,则对于块大小的值A和B,A||BB||A将哈希到相同的值;这将导致冲突激增。

从学术上讲,利用数论结构(即不是原始的RSA,而是重复使用相同类型的数学元素)构建哈希函数已经尝试过;有关详细信息,请参见Lars Knudsen的这个演示文稿。同样,ECOH哈希函数在SHA-3竞赛中提交,其核心使用椭圆曲线(但已被“破解”)。基本的期望是,哈希函数安全性可能与底层数论难题有所关联,从而提供可证明的安全性。然而,在实践中,这样的哈希函数要么速度慢,要么薄弱,要么两者都有。


我知道基于标准的RSA实现是非确定性的,但核心算法是确定性的。关于第5步,我应该更清楚地表述,它不会是简单的数学函数,而是会进行额外的混合以防止碰撞。我只提到加和异或,因为它们之间有一种特殊的关系,使它们对哈希很有用。 - regality

5
已经有哈希函数可以实现这一点了,尽管可能不是特别使用RSA算法。它们被称为密码哈希函数,其显著点在于它们是具有密码学安全性的 - 这意味着与公钥加密功能相同的强度和安全性思考也适用于它们。
唯一的区别是,它们从头开始设计为哈希函数,因此它们还满足哈希函数的个别要求,这可以被视为密码功能不必具备的额外优点。
此外,两者之间存在完全相反的因素,例如,您希望哈希函数尽可能快地运行而不会影响安全性,而缓慢通常被视为密码功能的特征,因为它极大地限制了暴力攻击的可能性。
SHA-512是一个很棒的密码哈希函数,值得您关注。Whirlpool、Tiger和RipeMD也是非常好的选择。这些都是没有错的。
还有一件事:如果您实际上想让它变慢,那么您绝对不想要哈希函数,并且正在完全错误的方向上进行。如果,正如我所假设的那样,您想要一个非常非常安全的哈希函数,那么就像我说的,有比您的示例更适合的选项,同时具有同样或甚至更高的密码学安全性。
顺便说一句,我并不完全相信您的混合算法没有漏洞。虽然每个RSA块的输出旨在已经具有高级avalanching等的均匀性等特征,但我仍然担心这可能会对所选明文或类似消息的比较分析构成问题。

谢谢你的回答。这更像是一个学术问题而不是实际问题,我没有打算将其开发到足够好以用于现实世界。你提到如果我想要它慢,那么我就不需要哈希;那我应该使用什么呢? - regality
取决于您想要它慢的原因。您希望某些东西变慢的唯一原因是因为您不希望能够重新创建其内容。但哈希的目的并不是防止内容的重新创建,而是提供内容的唯一摘要并对其进行加密以防止哈希碰撞。如果您试图防止原始数据的暴力重建,则可能正在尝试执行类似于在数据库中保护密码的操作,针对此类操作有特定的算法,例如bcrypt和scrypt等。 - Mahmoud Al-Qudsi
想要让它变慢的原因是为了防止针对密码哈希的暴力攻击。意图是创建与bcrypt相当的东西(这是我目前选择的密码哈希)。我发现RSA有吸引力的原因是它可以保证所有与块大小或更小的输入都不会发生碰撞。 - regality
我有一个概念上的疑问,你想要构建哈希函数还是签名方案? - Juan
不,他希望哈希函数尽可能地安全。性能和安全的混淆似乎是一种普遍的疾病,特别是在加密社区中。 显然,性能的缺失会降低暴力攻击的预期成功率。 - Sam Ginrich

1
通常最好使用公开可用并经过审查的算法。即使这些算法可能存在已知的弱点,也比自己编写的算法中未知的弱点要好。请注意,我并不是说所提出的算法有缺陷;只是即使在这里给出了大量认为它看起来很好的答案,也不能保证它没有缺陷。当然,对于MD5、SHA等算法也可以说同样的话。但至少,有很多人对它们进行了严格的分析。
除了之前针对设计自己的加密函数的“样板”警告外,所提出的解决方案在处理时间方面可能会有一定的成本。对于大型文档上的RSA加密可能是禁止的。

0

如上所述,步骤4)应该是确定性的,即仅使用模数和公钥指数进行操作。 如果步骤3)中的哈希是私有的,则我认为这个概念是安全的。

关于第5步:在已知的内核算法CBC模式中,与先前结果的混合是在加密之前完成的,步骤4)可能更好地避免了勾结,例如使用懒惰哈希;异或是可以的。

将应用此方法,因为已知哈希函数的可用实现可能存在后门 :)

确定性Java RSA在这里

编辑 还应该提到,RSA是可扩展的,没有任何限制。这样的哈希函数可以立即用作掩码生成函数。


0

不要过于思考,看起来这样做应该是具有密码学安全性的。

然而,你必须小心所选明文攻击,并且如果输入较大,则可能会遇到速度问题(因为非对称加密比密码哈希慢得多)。

因此,简而言之:是的,这似乎是可能且安全的... 但除非有一个非常强有力的理由,否则我会使用标准的HMAC,如果你想要一个带密钥的哈希。


“不加思考地”处理密码学似乎是完全错误的方式,特别是在自己编写时。https://security.stackexchange.com/questions/18197/why-shouldnt-we-roll-our-own - hmijail

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接