Подходит ли 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 : обновил код с предложением.
1 ответ:
Отказ от ответственности: я поддерживаю
gmpy2.Я бы рекомендовал использовать
gmpy2.is_bpsw_prpвместоgmpy2.next_prime. Тест BPSW будет быстрее, и нет никаких известных контрпримеров. Проверкиis_primeиnext_primeиспользовали и могут по-прежнему использовать фиксированный набор оснований, и это возможно для композитов, которые проходят серию известных тестов. IIRC, кто-то нашел композит, который прошел первые 17 проверок. По умолчанию выполняется 25 проверок, но это слабость.Я планирую включить доказуемую примитивность APR-CL тест в следующем выпуске
Существуют конкретные рекомендации по выбору простых чисел RSA, которым следует следовать, чтобы предотвратить случайный выбор простых чисел, которые создаютgmpy2.n, которые могут быть легко учтены.
Comments