2

更具体地说,该gmpy2.next_prime函数是否足以找到所需的大素数?还是我应该使用其他许多gmpy2.*_prp功能之一?

例如,以下代码是否足以找到合适的加密素数?

import os
import gmpy2

def random(bytez):
    seed = reduce(lambda a, b: (a << 8)|ord(b), os.urandom(bytez), 0)
    return gmpy2.mpz_urandomb(gmpy2.random_state(seed), bytez*8)

def find_prime(bytez=128):
    p = random(bytez)|1
    while not gmpy2.is_bpsw_prp(p):
        p = random(bytez)|1
    return p

def good_pair(p, q):
    n = p*q
    k = gmpy2.ceil(gmpy2.log2(n))
    if abs(p - q) > 2**(k/2 - 100):
        return n
    return 0

def make_rsa_keypair():
    p, q = find_prime(), find_prime()
    n = good_pair(p, q)
    while not n:
        p, q = find_prime(), find_prime()
        n = good_pair(p, q)
    tot = n - (p + q - 1)
    e = (1 << 16) + 1
    d = gmpy2.invert(e, tot)
    return {
        'public':{
            'n':n,
            'e':e,
            },
        'private':{
            'n':n,
            'd':d,
            }
        }

更新:用建议更新了代码。

4

1 回答 1

3

免责声明:我坚持gmpy2.

我建议使用gmpy2.is_bpsw_prp而不是gmpy2.next_prime. BPSW 测试会更快,并且没有已知的反例。和检查过去使用is_prime并且next_prime可能仍然使用一组固定的碱基,并且可以合成通过一系列已知测试的组合。IIRC,有人发现了通过前 17 次检查的复合材料。默认情况下,会进行 25 次检查,但这是一个弱点。

我计划在下一个版本的gmpy2.

选择 RSA 素数时应遵循特定的指导原则,以防止意外选择生成n容易因式分解的素数。

于 2015-03-11T22:03:16.493 回答