【问题标题】:Find number coprime to modulus查找与模数互质的数
【发布时间】:2016-05-12 00:12:31
【问题描述】:

我一直在对 RSA 加密系统进行一些研究,使用小素数编写代码非常简单,因为没有太多可能性,性能也不是真正的问题。

RSA 的工作原理如下:

  • 首先,您生成一个n 值,从随机选取的 2 个素数中得到乘积:

    n = p * q
    
    • 然后你需要你的公钥,称为e。它可以是任何与 φ(n) 互质的数:

      mcd(φ(n), e) = 1

    • 根据欧拉函数φ(n) = (p-1)(q-1)

    • 你仍然需要你的私钥,称为d,它是e on modulo **φ(n)的倒数。

    • 所以d * e = 1 (mod φ(n))

    • ne 是您的公共值,而 d 是您的私钥。没有人应该知道pq,因为有了这些值就可以得到φ(n),并用它来计算d
  • 为了加密消息,我们使用M = m^e (mod n),其中m 是原始消息,M 是加密消息。因此,每个人都可以使用您的公共价值观向您发送一条您可以阅读的加密信息。
  • 要解密消息,请使用d,因为它是e 的倒数,所以M^d = (m^e)^d = m (mod n)。消息可以解密,但只能使用d

知道了这一点,要加密一条消息,我们只需要获取两个随机素数,计算n, e, d, 并制定我们的加密和解密方法。


这在理论上看起来很简单,现在让我们把它变成java代码:

我首先选择两个随机素数,数字越大,加密越强。所以我会选择p = 1644623q = 1644751。根据this page,它们是素数。

BigInteger p = new BigInteger("1644623");
BigInteger q = new BigInteger("1644751");

然后,在我的 init 方法中,我初始化 n, ed:

BigInteger p = new BigInteger("1644623");
BigInteger q = new BigInteger("1644751");

BigInteger n;
BigInteger e;
BigInteger d;

void init() {
    n = p.multiply(q);

    BigInteger pn = p.subtract(BigInteger.ONE).multiply(q.subtract(BigInteger.ONE));

    e = n.subtract(pn);
    while (!mcd(pn, e).equals(BigInteger.ONE)) {
        e = e.add(BigInteger.ONE);
        System.out.println(e);
    }

    d = e.modPow(new BigInteger("-1"), pn);
}

我使用 BigInteger 而不是 long,因为使用的值非常大。

理论上,一切正常。实际上,@ 987654352@,所以检查@ 987654353@,如果没有在e 上加1,然后再试一次,这不是一个选择。该程序从 30 分钟开始运行,平均每秒 150.000 个数字。 e = 548151505 仍然找不到 mcd(pn, e) = 1


有什么方法可以在合理的时间内找到e


【问题讨论】:

  • 扩展欧几里得算法不就是这样吗? en.wikipedia.org/wiki/Extended_Euclidean_algorithm
  • 没有mcd 这样的东西。也许你打错了,因为它是 gcd 或欧几里得算法。
  • 这是从公钥(e)获取私钥(d),这是下一步,可以通过d(mod n)= e^-1来完成。我要做的是生成 e,公钥。
  • @ArtjomB 完全一样,只是在我的国家它被称为 mcd(maximo comun divisor),它是 gcd(最大公约数)的西班牙语翻译。
  • 正如 user448810 回答的那样,您不需要找到 e,只需将其设置为某个常用值即可。如果你真的有兴趣找到一个“独特的”e,那么这个问题可能更适合MathematicsCryptography。请检查是否已经有类似的问题被问到。选择 Fermat Primes 作为 e 是有原因的,即设置的位数必须很低才能进行快速加密和快速签名验证。

标签: java math rsa arithmetic-expressions modular-arithmetic


【解决方案1】:

根据定义,任何质数都将与模数互质,因此您无需搜索,只需选择一个质数即可。由于加密密钥是公开的,因此大多数 RSA 实现使用的东西可以很容易地计算模幂:3 和 65537 = 2 ** 16 + 1 都是素数,并且两者都常用于加密密钥。

【讨论】:

  • 常见的选择是Fermat numbers。此外,如果使用教科书 RSA,3 是一个非常糟糕的选择。
  • @ArtjomB.:但在这种情况下,使用 3 不是问题。问题在于教科书 RSA。
  • “根据定义,任何质数都将与模数互质”。这不是真的:一个小的质数很容易成为phi(n) 的除数。在 OP 给出的示例中,phi(n) 可以被 3 整除,因此例如,不能使用e = 3。如果你要一直使用3,那么你需要做一些额外的努力来确保你选择的素数都不等于1 模3。同样,如果您提前决定要使用e = 65537
  • @MarkDickinson:换句话说,对指数来说重要的是与phi(n) 共质,n 共质。
  • @JamesKPolk:啊,好点;我过快的阅读没有注意到“模数的共同素数”位。所以我收回它:我引用的陈述 正确的(假设你不选择 p 或 q 本身),但不是很有帮助。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-07-18
  • 2012-02-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-11-06
相关资源
最近更新 更多