⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 gordon.c

📁 应用密码学手册-英文版,学习密码学和网络安全的好资料。
💻 C
字号:
/*

  Author:  Pate Williams (c) 1997



  Gordon's algorithm for generating strong primes.

  See "Handbook of Applied Cryptography" by Alfred

  J. Menezes et al 4.53 Algorithm page 150.

*/



#include <stdio.h>

#include <stdlib.h>

#include <time.h>

#include "lip.h"



long Gordon(long bit_length, verylong *zp)

{

  long i, i0, j, k, j0, s_size = bit_length / 2;

  verylong za = 0, zb = 0, zc = 0, zr = 0;

  verylong zs = 0, zt = 0, zp0 = 0;



  zrstarts(time(NULL));

  zrandomprime(s_size, 5l, &zs, zrandomb);

  zrandomprime(s_size, 5l, &zt, zrandomb);

  zlshift(zt, 1l, &za);

  do i0 = rand(); while (i0 == 0);

  i = i0;

  do {

    /* compute r = 2 * i * t + 1 */

    zsmul(za, i, &zb);

    zsadd(zb, 1l, &zr);

    i++;

  } while (!zprobprime(zr, 5l));

  /* compute p0 = ((2 * s) ^ (r - 2) mod r) * s - 1 */

  zlshift(zs, 2l, &za);

  zsadd(zr, - 2l, &zb);

  zexpmod(za, zb, zr, &zc);

  zmul(zc, zs, &za);

  zsadd(za, - 1l, &zp0);

  zlshift(zr, 1l, &zb);

  zmul(zb, zs, &za);

  do j0 = rand(); while (j0 == 0);

  j = j0;

  k = 0;

  do {

    /* compute p = p0 + 2 * j * r * s */

    zsmul(za, j, &zb);

    zadd(zb, zp0, zp);

    j++, k++;

    printf("\b\b\b\b\b%4ld", k);

  } while (k < 1000 && !zprobprime(*zp, 5l));

  zfree(&za);

  zfree(&zb);

  zfree(&zc);

  zfree(&zr);

  zfree(&zs);

  zfree(&zt);

  zfree(&zp0);

  if (k == 1000) return Gordon(bit_length, zp);

  return z2log(*zp);

}



int main(void)

{

  long bit_length, i;

  verylong zp = 0;



  for (i = 100; i <= 180; i += 20) {

    bit_length = Gordon(i, &zp);

    printf(" %3ld %3ld ", i, bit_length);

    zwriteln(zp);

  }

  zfree(&zp);

  return 0;

}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -