【问题标题】:φ(n) = (p-1)(q-1) p and q are two big numbers find e such that gcd(e,φ(n)) = 1 [closed]φ(n) = (p-1)(q-1) p 和 q 是两个大数找到 e 使得 gcd(e,φ(n)) = 1 [关闭]
【发布时间】:2011-01-10 14:02:31
【问题描述】:

φ(n) = (p-1)(q-1) p 和 q 是两个大数 找到 e 使得 gcd(e,φ(n)) = 1

认为 p 和 q 是一个非常大的素数 (Bigint)。我想为此找到一个有效的解决方案。

[编辑] 我可以使用蛮力方法解决这个问题。但由于数字太大,我需要更有效的解决方案。 还有 1

【问题讨论】:

  • RSA算法没有给你你想要的解释吗?
  • 家庭作业标签似乎很合适
  • 1.这不是功课 2. 我正在使用 RSA 并希望为 gcd 提供有效的解决方案
  • 你能说得更具体点吗?您在寻找什么以及给定的信息是什么?因为如果您要查找的是给定 p 和 q 的 e 值,则 e=φ(n)+1 有效...
  • @Gamecat @Grammin 无意冒犯,但如果有人没有答案,请不要参考作业。在我看来,我们在大学所做的与我们在工作中所做的无关。我的意思是我们应该停止上大学吗?

标签: c++ algorithm math cryptography


【解决方案1】:

通常您选择e 作为素数。一个常见的选择是 65537。然后选择 pq 以便 gcd(p-1, e)=1gcd(q-1, e)=1,这只需要您检查 p-1q-1 不是 e 的倍数(当您(很少) 发现其中之一是,您生成一个新的素数)。

65537 的优点是允许您通过观察 x^65537 = x^(2^16+1) = x^2^2^2^2^2^2^2^2^2^2^2^2^2^2^2^2 * x (mod m) 来优化公钥运算,因此您只需要 16 个模平方和一个模乘。

【讨论】:

  • 现在又会出现有效地找到 p-1 和 q-1 的问题。对吗?
  • 嗯,因为 e 是素数,所以很容易。您只需检查 p-1 和 q-1 不是 e 的倍数。如果其中一个是,则选择另一个素数。它会发生 1/e 次,因此它会使您的密钥生成速度慢大约 (1+1/e) 倍。
【解决方案2】:

你必须决定你希望 e 有多大。这是一个系统决定。通常,e 过去固定为 3;现在更常见的是 e=65537。在这些情况下,e 是素数,因此(正如其他人已经指出的那样)您只需检查 (p-1)(q-1) 不是 e 的倍数。
但某些系统要求指定 32 位随机 e。这是因为一些密码学家认为在固定指数 RSA 系统中比在随机指数系统中更容易发现缺陷。 (据我所知,还没有发现针对固定指数系统的具体利用;但是密码学家被付钱过分谨慎。)
因此,假设您不得不生成一个与 (p-1)(q-1) 互质的随机 32 位 e。最简单的解决方案是:生成一个随机的 32 位奇数 e。然后计算它的逆模(p-1)(q-1)。如果这个逆计算失败,因为 e 不是 (p-1)(q-1) 的互质数,那么再试一次。
这是一个合理、实用的解决方案。无论如何,您都需要计算倒数,计算倒数不会比计算 gcd 花费更长的时间。
如果你真的需要尽可能快,你可以寻找 (p-1)(q-1) 的小素因数,并尝试将 e 除以这些因数:如果你找到小的素因数,那么你可以加快您对 e 的搜索;如果您不这样做,那么搜索可能会很快终止。
另一个合理的解决方案是生成一个随机的 32 位素数 e,并检查 (p-1)(q-1) 是否可以被 e 整除。这是否允许取决于您的系统要求。您是否自己设置这些系统要求?

【讨论】:

    【解决方案3】:

    选择满足这一点的第一个素数 >= 3。 如果您正在寻找速度,您可以使用小指数。

    2 个指数可能有两个问题。

    • 您不应该使用小指数来加密多个方案的相同消息。 (例如,如果存在 exp = 3 的私有/公共对树,您可以使用高斯算法来恢复明文。

    • 你不应该发送短消息,因为攻击者可能只使用立方根来恢复它。

    考虑到这些弱点,您可能会使用此方案。据我所知,数字 3 是 e 的常用数字。

    顺便说一句,与检查素数相比,暴力破解少数数字可以忽略不计。

    【讨论】:

      【解决方案4】:

      我认为您可能误报了问题; e=1 非常适合你写的那个。

      【讨论】:

        【解决方案5】:

        然后你需要做的是计算 de = 1 mod phi(n)。这实际上非常快——您只需要在 e 和 phi n 上使用扩展的欧几里得算法。这样做将允许您计算 de + k\phi(n) = 1,也就是说您已经计算了 \phi(n) 下的 e 的倒数。

        编辑,Rasmus Faber 是正确的,您确实需要验证 gcd(e, \phi(n)) = 1。扩展的欧几里得算法仍然会为您执行此操作 - 您计算 gcd 和倍数e, φ(n)。这告诉你 d 是什么,即 d 是 e 的倒数,模 phi n 告诉你 t^ed = t^1 模 phi n。

        至于在实践中这样做,我强烈建议using a bignum library;滚动您自己的任意精度欧几里得扩展算法并不容易。这是one such function,它将有效地执行任意精度算术。

        【讨论】:

        • 他正在执行密钥生成。 RSA 密钥生成的常用公式只是指定 gcd(e,phi(pq))=1,而不是如何确保这一点。选择一个随机的 e 有 gcd(e,phi(pq))!=1 的风险,所以你必须 /something/ 来防止这种情况发生。
        • 阅读数学。如果你选择 e 作为某个已知素数,那么 p 和 q 是另外两个素数,并且 n=pq,那么 n 不能是 e 的因数。这就是 RSA 的优势和重点。算术基本定理说任何数 n 必须有一个唯一的素数因式分解,所以如果 n 有 p 和 q 作为它的素数,它不能有 e。因此 gcd 必须是一。所以选择 e,然后生成 p 和 q,但如果 p 和 q 是 e,则拒绝它们。容易。
        • 如果 e、p 和 q 是素数,则 gcd(e, phi(pq)) 不能保证为 1。快速反例:e=3, p=5, q=7 . phi(pq)=24, gcd(e,phi(pq))=3.
        • 啊,是的,我错了,说得好,我太仓促了。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-06-10
        • 2018-08-18
        • 1970-01-01
        • 1970-01-01
        • 2012-08-07
        • 2021-12-30
        相关资源
        最近更新 更多