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

时间:2011-01-10 14:02:31

标签: c++ algorithm math cryptography

φ(n)=(p-1)(q-1) p和q是两个大数字 找到这样的gcd(e,φ(n))= 1

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

[编辑]我可以用强力方法解决这个问题。但由于数字太大,我需要更有效的解决方案。 也是1< e< (P-1)(Q-1)

5 个答案:

答案 0 :(得分:4)

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

65537的优点是允许您通过观察q-1来优化公钥操作,因此您只需要16个模块化的方形和模块化乘法。

答案 1 :(得分:2)

你必须决定你想要多大。这是一个系统决策。通常,e曾经固定为3;现在更常见的是e = 65537。在这些情况下,e是素数,所以(正如其他人已经指出的那样)你只需检查(p-1)(q-1)不是e的倍数。
但是一些系统要求指定了32位随机e。这是因为一些密码学家认为在固定指数RSA系统中比在随机指数系统中更容易发现缺陷。 (据我所知,固定指数系统没有发现具体的开发;但密码学家的报酬过于谨慎。)
所以,假设您不得不生成一个随机的32位e,它是(p-1)(q-1)的共同素数。最简单的解决方案是:生成一个随机的,奇数32位的数字e。然后计算其逆mod(p-1)(q-1)。如果此反向计算失败,因为e与(p-1)(q-1)不共同,则再试一次。
这是一个合理,实用的解决方案。无论如何,您将需要计算逆,并且计算逆并不比计算gcd花费更长的时间 如果你真的需要尽可能快地完成它,你可以通过以下因素寻找(p-1)(q-1)和试验除以e的小素因子:如果你发现小的素因子,那么你可以加快搜索e;如果你不这样做,那么搜索可能会很快终止 另一个合理的解决方案是生成一个随机的32位素数e,并通过e检查(p-1)(q-1)的可除性。是否允许这取决于您的系统要求。您是自己设置这些系统要求吗?

答案 2 :(得分:1)

选择满足此要求的第一个素数> = 3。 如果您正在寻找速度,您可能会使用小指数。

可能存在两个问题,即2个指数。

  • 您不应该使用小指数加密相同的按摩白色多重方案。 (例如,如果存在树私有/公共对whit = 3,则可以使用Gauss算法来恢复明文。

  • 您不应发送短消息,因为攻击者可能只使用多维数据集根来恢复此消息。

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

顺便说一下,与检查素数相比,强制少数的暴力可以忽略不计。

答案 3 :(得分:0)

我想你可能误会了这个问题; e=1很适合你写的那个。

答案 4 :(得分:0)

你需要做的是计算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,phi(n)的倍数。这告诉你d是什么,即d是e的逆,modulu phi n告诉你t ^ ed = t ^ 1 modulo phi n。

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