0

我正在尝试实现 RSA 的乐趣,但我被困在你必须找到 n 的共同素数的部分(即 pxq,其中 p 和 q 是两个大素数)。

有没有办法做到这一点?除了我不需要的数字的互质数之外,我似乎找不到任何东西。

4

3 回答 3

3

任何两个均匀采样的整数互质的概率约为 60%

您可以简单地在所需范围内选择一个随机整数,并使用原始数字测试其 GCD,如果它们不是互质的,则循环(重新采样)。

于 2013-07-31T11:46:36.107 回答
1

我们只关心残数模n,所以有n个。只有当它是pq(或两者)的倍数时,残差才不是n的互质数。

p是 q 的倍数,其中qp 的倍数其中一个(零)是两者,所以有p + q –1 个残基不与n互质,所以随机残差的机会 (从均匀分布中选择)不是互质数正好是 1/ p +1/ q –1/( pq )。由于pq在实际使用中(而不是课堂练习)很大,因此找到非互质数的机会很小。这也意味着你已经破解了这个n的加密,因为除零以外的任何非互质数都可以让您轻松找到pq。(应用欧几里得算法找到最大公约数。它是pq。)

顺便说一句,您应该期望这在您的一生中不会偶然发生,因此除了通过人为构造要测试的数字或使用非常pq的小数(在这种情况下,测试是有缺陷的,因为它无法在此代码路径上执行大数的算术)。实际上甚至没有必要对此进行测试或包含处理这种情况的代码,因为与实际(巨大的) pq出现这种情况相比,计算机更有可能崩溃。

于 2013-07-31T13:17:45.937 回答
0
#include <stdio.h>  
 int gcd(int a,int b)  
{  
  int temp;  
  while(b!=0)  
  {  
       temp=a;  
       a=b;  
       b=temp%b;  
  }  
  return a;  
   }  
   int main()  
    {  
  int n,i,d,count;  
  count=1;  
  scanf("%d",&n);  
  for(i=2;i<n;i++)  
  {  
       d=gcd(n,i);  
       if(d==1)  
            count+=1;  
  }  
  printf("%d\n",count);  
  return 0;  
        } 
于 2015-07-20T05:32:41.413 回答