Подходит ли gmpy2 для реализации RSA в python?



Более конкретно, достаточно ли хороша функция 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 : обновил код с предложением.

449   1  

1 ответ:

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

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

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

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

Comments

    Ничего не найдено.