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,
            }
        }

UPDATE : 提案でコードを更新しました。

4

1 に答える 1

3

免責事項:私は維持しgmpy2ます。

gmpy2.is_bpsw_prpの代わりに使用することをお勧めしgmpy2.next_primeます。BPSW テストは高速になり、既知の反例はありません。is_primeおよびnext_primeチェックでは、固定された一連の塩基が使用されていましたが、今後も使用される可能性があり、一連の既知のテストに合格する複合体を作成することができます。IIRC、誰かが最初の 17 のチェックに合格したコンポジットを見つけました。デフォルトでは 25 のチェックが行われますが、これが弱点です。

の次のリリースに、APR-CL の証明可能な素数性テストを含める予定ですgmpy2

n簡単に因数分解できるを作成する素数を誤って選択することを防ぐために、従うべき RSA 素数を選択するための特定のガイドラインがあります。

于 2015-03-11T22:03:16.493 に答える