【问题标题】:RSA key generationRSA 密钥生成
【发布时间】:2015-05-22 14:28:53
【问题描述】:
//test whether it is prime number ot not   
int prime_test(long int prime_number)

{
      long int a, p;
      srand((unsigned)time(NULL));

      //0 and 1 not meaning for prime test.
      a = rand() % (prime_number - 2) + 2; 
      printf("a -> %li\n", a);

      //Lehmann Algorithm, p = a^((prime_number-1)/2) mod prime_number
      p = (long int)pow(a, (prime_number - 1) / 2) % prime_number;
      printf("p -> %li\n", p);

      if(p != 1 & (prime_number - p) != 1)
      {
                  printf("Enter number is not prime number.\n");
                  return 0;
      }
      else
      {    
                  printf("Enter number is prime number.\n");
                  return 1;
      }
}

我的问题是为什么我得到负 p -984,实际上 1997 是一个素数,
它应该是 1 或 -1。 输出如下:

输入质数 p:1997
一个 -> 1557
p -> -984
输入的数字不是质数!
temp1 -> 0
请重新输入质数 p:

【问题讨论】:

  • 这是用于大素数测试的函数,它适用于像13和17这样的非常小的数字,但是一旦我输入大数,它就会出现负数,所以我在这里发布,有人可以给我答案?
  • long int 不足以满足您的需求。出于测试目的,将其更改为long long int。但即使这样也不足以用于任何实际用途,您还需要使用 bigints。
  • @mtijanic:OP 的示例对于 bigint 来说有点太大了,大约是 38 个宇宙的倍数。
  • @Jongware 我只是查看了实际数字.. 是的,那是行不通的。如果您想使用 Lehmann 算法,则需要非常自定义的 int 表示,我怀疑它是否可行。尝试另一种算法,例如筛子。
  • 是的,我确实想用更好的让它工作,但情况是我必须使用 Lehmann,所以..

标签: c rsa number-theory


【解决方案1】:

1557 ^ 998 不太适合 long int

更具建设性:如果您像这样计算p,则需要更长的时间,但要避免溢出:

p = 1;
for ( i=0; i<(prime_number-1)/2; i++ )
    p = (p*a) % prime_number;

有(非常好的)方法可以优化它,但我将把它留作练习。

【讨论】:

  • 你的想法很有用,我创建了一个函数来模拟base和power,即a^p mod m,在那个函数中,我们可以这样做:
  • for(i = 1; i
  • 温度 = 1;在 for 循环中,我们执行 temp = (temp * base) % mod;通过这种方式,我使我的程序有效。大声笑
  • 用这种方式代替 p = (long int)pow(a, (prime_number - 1) / 2) % prime_number;