【问题标题】:Using RSA for hash使用 RSA 进行哈希
【发布时间】:2011-11-25 14:15:52
【问题描述】:

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

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

要验证消息与存储的散列具有相同的散列,请使用已保存的公钥并重复该过程。

这是否可行、安全且实用?

感谢任何cmets。

【问题讨论】:

    标签: encryption hash rsa


    【解决方案1】:

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

    此外,您的“未指定的第 5 步”可能很弱。例如,如果您定义了一种散列块的方法,然后只是将块异或在一起,那么 A||BB||A (对于块大小值 AB) 将哈希为相同的值;那是碰撞的盛宴。

    在学术上,已经尝试使用数论结构(即不是原始 RSA,而是重用相同类型的数学元素)构建散列函数;有关详细信息,请参阅this presentation from Lars Knudsen。同样,ECOH hash function 被提交给 SHA-3 竞赛,其核心使用椭圆曲线(但它被“破坏”了)。潜在的希望是哈希函数的安全性可以以某种方式与基础数论难题相关联,从而提供可证明的安全性。然而,在实践中,这样的哈希函数要么很慢,要么很弱,或者两者兼而有之。

    【讨论】:

    • 我了解基于标准的 RSA 实现是非确定性的,但核心算法是确定性的。我应该更清楚第 5 步,它不是简单的数学函数,而是会进行额外的混合以防止碰撞。我刚刚提到了 add 和 xor,因为它们之间有一种特殊的关系,这使得它们对哈希很有用。
    【解决方案2】:

    已经有基本上可以做到这一点的哈希,除了可能不是特别是 RSA 算法。它们被称为加密哈希,它们的重点是它们在加密上是安全的 - 这意味着与公钥加密功能相同的强度和面向安全的思想也已进入它们。

    唯一的区别是,它们是从头开始设计为哈希的,因此它们也满足哈希函数的个性化要求,这可以被认为是加密函数不需要的额外优势。

    此外,两者之间存在完全不一致的因素,例如,您希望哈希函数尽可能快而不影响安全性,而速度慢通常被视为加密函数的一个特征,因为它限制了暴力破解攻击相当大。

    SHA-512 是一种出色的加密哈希,可能值得您关注。 Whirlpool、Tiger 和 RipeMD 也是不错的选择。这些都不会出错。

    还有一件事:如果你真的想要它变慢,那么你肯定不想要散列函数并且这样做是完全错误的。如果,正如我假设的那样,您想要的是一个非常非常安全的哈希函数,那么就像我说的那样,有很多选项比您的示例更适合,同时在密码学上同样安全,甚至更安全。

    顺便说一句,我并不完全相信您的混合算法没有弱点。虽然每个 RSA 块的输出旨在已经与高雪崩等保持一致,但我仍然担心这可能会给选择的明文或类似消息的比较分析带来问题。

    【讨论】:

    • 感谢您的回答。这更像是一个学术问题而不是实际问题,我不打算将它开发得足够好以供现实世界使用。你提到如果我想要它慢一点,那么我不想要哈希;我想要什么?
    • 取决于您希望它变慢的原因。你想让某些东西变慢的唯一原因是你不想重新创建它的内容。但是散列的目的不是为了防止内容的重新创建,而是提供内容的唯一摘要并以加密方式保护它免受散列冲突的影响。如果您试图防止对原始文件的暴力重建,您可能会尝试做一些类似于保护数据库中的密码的事情,其中​​有特定的算法,例如 bcrypt 和 scrypt 等。
    • 希望它变慢的原因是为了防止对密码哈希的暴力攻击。目的是创建与 bcrypt 相当的东西(这是我目前对密码散列的选择)。我发现 RSA 有吸引力的原因是它可以保证所有与块大小相同或更小的输入都不会发生冲突。
    • 我有一个概念上的疑问你想建立一个哈希函数或签名方案?
    【解决方案3】:

    通常,最好使用公开可用且已通过审核流程的算法。尽管此类算法可能存在已知的弱点,但这可能比本土算法中的未知弱点要好。请注意,我并不是说所提出的算法有缺陷。只是,即使这里给出了大量的答案说看起来不错,也不能保证它不会。当然,MD5、SHA等算法也可以这样说,但至少在那些方面,已经有大量的人对其进行了严格的分析。

    除了之前关于设计自己的加密函数的“样板”警告之外,似乎提议的解决方案在处理时间方面可能有些昂贵。对大型文档进行 RSA 加密可能会令人望而却步。

    【讨论】:

      【解决方案4】:

      不用考虑太多,它似乎在密码学上是安全的。

      但是,您必须小心选择明文攻击,如果您的输入很大,您可能会遇到速度问题(因为非对称加密比加密哈希慢得多)。

      所以,简而言之:是的,这似乎是可行且安全的……但除非有一个真的令人信服的理由,否则如果你想要一个密钥哈希,我会使用标准 HMAC。

      【讨论】:

      【解决方案5】:

      如上所述,步骤 4.) 是确定性的,即仅使用模数和公钥指数。 如果步骤 3.) 中的哈希是私有的,那么这个概念对我来说似乎是安全的。

      关于第 5 步。):在已知的内核算法 CBC 模式中,与先前结果的混合是在加密之前完成的,第 4 步。),可能更好地避免串通,例如使用惰性哈希; XOR 没问题。

      将应用这一点,因为已知哈希函数的可用实现可能有后门 :)

      确定性 Java RSA 是 here

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2016-08-01
        • 2016-09-25
        • 2021-01-06
        • 1970-01-01
        • 2022-10-23
        • 1970-01-01
        • 1970-01-01
        • 2017-07-04
        相关资源
        最近更新 更多