2015-03-11 1 views
2

В частности, является ли функция gmpy2.next_prime достаточной для того, чтобы найти требуемые большие простые числа? Или я должен использовать одну из других функций gmpy2.*_prp?gmpy2 подходит для реализации RSA в python?

Например, следующий код достаточно подходит для поиска подходящих простых чисел для шифрования?

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: обновленный код с предложением.

ответ

3

Отказ от ответственности: Я поддерживаю gmpy2.

Я бы рекомендовал использовать gmpy2.is_bpsw_prp вместо gmpy2.next_prime. Тест BPSW будет быстрее, и нет никаких встречных примеров. Проверки is_prime и next_prime, используемые для использования и могут по-прежнему использовать фиксированный набор оснований, и можно использовать композиты, которые проходят серию известных тестов. IIRC, кто-то нашел композицию, которая прошла первые 17 проверок. По умолчанию выполняется 25 проверок, но это слабость.

В следующем выпуске gmpy2 планирую включить доказательство примитивности APR-CL.

Существуют специальные рекомендации по выбору простых чисел RSA, которые следует соблюдать для предотвращения случайного выбора простых чисел, которые создают n, которые могут быть легко учтены.

+0

Спасибо! Я немного поработал над поисковой системой и обновил свой фрагмент кода с помощью предложенной функции. Если у вас есть предложения, пожалуйста, дайте мне знать :). – Broseph