首页
社区
课程
招聘
[求助]怎么快速搜索一个大素数? (翻遍了论坛也没找到有关帖子)
发表于: 2010-4-11 01:01 9060

[求助]怎么快速搜索一个大素数? (翻遍了论坛也没找到有关帖子)

2010-4-11 01:01
9060
用我那台破机器, 搜索一个 4096bits 的大素数的半个小时还不够。

论坛上都是 素数 的快速判定帖子, 可判定一个 大数 不是 素数 然后呢 .... 随机去尝试一个大数的话不是太慢了吗?

(D S A 的标准密钥产生方法, 后几步我看不懂!)

[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!

收藏
免费 0
支持
分享
最新回复 (17)
雪    币: 1022
活跃值: (31)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
2
方法有很多,简单点的可以先产生一个奇数,再简单判定是否为合数,若不是合数则用Miller-Rabin算法进行检验,最后用Pocklington定理进行验证。
2010-4-11 02:18
0
雪    币: 67
活跃值: (30)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
楼主看看这个:
基于RSA公钥算法的一种素数检测方法.pdf
上传的附件:
2010-4-11 12:57
0
雪    币: 2096
活跃值: (100)
能力值: (RANK:420 )
在线值:
发帖
回帖
粉丝
4
產生的方法就不提了,至於如何驗證,請看[素性检测]PRIMES is in P: A-K-S 算法
2010-4-12 16:14
0
雪    币: 179
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
也就是说: 拿奇数一个一个去测试!
搜索素数的速度取决于: 测试素数算法的速度?
我觉得这也太笨了?

比如DSA素数产生的后几步, 在产生Q搜索P的几步, 为什么要哪么计算?
2010-4-13 17:05
0
雪    币: 56
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
只能先随机产生一个大计数,然后再素性检测啊。。。。因为随着数的增大,素数的概率越来越小,现在只有素数分布的概率,还没找到素数的规律,而且随机产生大素数的概率还是蛮大的
2010-4-13 17:49
0
雪    币:
能力值: (RANK: )
在线值:
发帖
回帖
粉丝
7
参考 miracl 库里的 genprime.c/cpp, 可以生成指定长度的素数.
2010-4-13 21:05
0
雪    币: 67
活跃值: (30)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
请问这个库是用什么算法生成素数的?
2010-4-14 02:46
0
雪    币: 295
活跃值: (11)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
9
你问  陶哲轩   他会告诉你个完美的答案的。

如果算法不好的话,我估计计算机的搜索速度都不会超过他人脑的搜索速度
2010-4-14 09:41
0
雪    币:
能力值: (RANK: )
在线值:
发帖
回帖
粉丝
10
miracl 里有两个生成Key的程序:
第一个是genprime, 这个只是生成一个大质数, 算法是
p = 2*pp[1]*pp[2]....+1, 其中pp[i]是质数.
但明显这个素数有p-1缺陷, 不适合作RSA
第二个是genkey, 专为RSA生成素数, 算法是
p=2*r*pd+1 = 11 mod 12
2010-4-14 20:49
0
雪    币: 202
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
11
why???
2010-4-15 12:17
0
雪    币: 3053
活跃值: (891)
能力值: ( LV13,RANK:1300 )
在线值:
发帖
回帖
粉丝
12
滑动窗算法产生大素数很快,很多开源的加密库都有应用。当初就没找到该算法,库中虽然有代码实现,可俺看不懂。如果楼主找到算法记得发俺一份。
2010-4-15 12:55
0
雪    币: 179
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
13
我是个不懂数论外行, 只是个工具的使用者。

你们说的能不能清楚点:

"滑动窗算法产生大素数很快"  ----那个代码库里有?
“方法有很多,简单点的可以先产生一个奇数,再简单判定是否为合数”   ----怎么判定为合数?
2010-4-25 06:10
0
雪    币: 1022
活跃值: (31)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
14
1、miracl里面
2、简单判定,比如说:用前100个素数的积与N求公因数
2010-4-25 09:55
0
雪    币: 656
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
15
貌似很神奇 有时间了继续研究
2010-5-5 10:55
0
雪    币: 10
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
16
2010-5-15 15:00
0
雪    币: 1
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
17
学习一下,呵呵
2010-5-25 17:30
0
雪    币: 244
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
18
先发帖,再学习^_^
这个是GnuPG源代码片段,来自 cipher/primegen.c

static MPI
gen_prime( unsigned int nbits, int secret, int randomlevel )
{
    unsigned  nlimbs;
    MPI prime, ptest, pminus1, val_2, val_3, result;
    int i;
    unsigned x, step;
    int count1, count2;
    int *mods;

    if( 0 && DBG_CIPHER )
	log_debug("generate a prime of %u bits ", nbits );

    if (nbits < 16)
      {
        log_error (_("can't generate a prime with less than %d bits\n"), 16);
        exit (2);
      }

    if( !no_of_small_prime_numbers ) {
	for(i=0; small_prime_numbers[i]; i++ )
	    no_of_small_prime_numbers++;
    }
    mods = xmalloc( no_of_small_prime_numbers * sizeof *mods );
    /* Make nbits fit into MPI implementation.  */
    nlimbs = mpi_nlimb_hint_from_nbits (nbits);
    val_2  = mpi_alloc_set_ui( 2 );
    val_3 = mpi_alloc_set_ui( 3);
    prime  = secret? mpi_alloc_secure( nlimbs ): mpi_alloc( nlimbs );
    result = mpi_alloc_like( prime );
    pminus1= mpi_alloc_like( prime );
    ptest  = mpi_alloc_like( prime );
    count1 = count2 = 0;
    for(;;) {  /* try forvever */
	int dotcount=0;

	/* generate a random number */
	{   char *p = get_random_bits( nbits, randomlevel, secret );
	    mpi_set_buffer( prime, p, (nbits+7)/8, 0 );
	    xfree(p);
	}

	/* Set high order bit to 1, set low order bit to 0.
           If we are generating a secret prime we are most probably
           doing that for RSA, to make sure that the modulus does have
           the requested keysize we set the 2 high order bits */
	mpi_set_highbit( prime, nbits-1 );
        if (secret)
          mpi_set_bit (prime, nbits-2);
	mpi_set_bit( prime, 0 );

	/* calculate all remainders */
	for(i=0; (x = small_prime_numbers[i]); i++ )
	    mods[i] = mpi_fdiv_r_ui(NULL, prime, x);

	/* now try some primes starting with prime */
	for(step=0; step < 20000; step += 2 ) {
	    /* check against all the small primes we have in mods */
	    count1++;
	    for(i=0; (x = small_prime_numbers[i]); i++ ) {
		while( mods[i] + step >= x )
		    mods[i] -= x;
		if( !(mods[i] + step) )
		    break;
	    }
	    if( x )
		continue;   /* found a multiple of an already known prime */

	    mpi_add_ui( ptest, prime, step );

	    /* do a faster Fermat test */
	    count2++;
	    mpi_sub_ui( pminus1, ptest, 1);
	    mpi_powm( result, val_2, pminus1, ptest );
	    if( !mpi_cmp_ui( result, 1 ) ) { /* not composite */
		/* perform stronger tests */
		if( is_prime(ptest, 5, &count2 ) ) {
		    if( !mpi_test_bit( ptest, nbits-1 ) ) {
			progress('\n');
			log_debug("overflow in prime generation\n");
			break; /* step loop, continue with a new prime */
		    }

		    mpi_free(val_2);
		    mpi_free(val_3);
		    mpi_free(result);
		    mpi_free(pminus1);
		    mpi_free(prime);
		    xfree(mods);
		    return ptest;
		}
	    }
	    if( ++dotcount == 10 ) {
		progress('.');
		dotcount = 0;
	    }
	}
	progress(':'); /* restart with a new random value */
    }
}
2010-6-8 12:08
0
游客
登录 | 注册 方可回帖
返回
//