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

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

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

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

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

[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

收藏
免费
支持
分享
最新回复 (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
雪    币: 3054
活跃值: (941)
能力值: ( 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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
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
游客
登录 | 注册 方可回帖
返回

账号登录
验证码登录

忘记密码?
没有账号?立即免费注册