Почему PyCryptodome RSA генерирует открытый ключ так медленно?

Я использую библиотеку PyCryptodome для своих задач криптографии. Я хочу создать ключ RSA, как показано в примере.

Я набрал этот код:

from Cryptodome.PublicKey import RSA
key = RSA.generate(2048)

и это займет вечность, чтобы выполнить. (При наборе этого вопроса прошло уже 10 минут, и он все еще не завершен).

Я запускаю его в Jupyter Notebook на Windows 10. Может быть, у вас есть идеи, почему это так медленно или как заставить его работать? Я прочитал документацию и попытался найти похожие вопросы, но безуспешно.

3 ответа

Решение

Я переустановил Anaconda до последней версии, и на этот раз я установил pycryptodomex через pip(как показано на github), ранее я установил его через облако Anaconda (я думаю, это не имеет значения, но пусть это останется здесь, просто чтобы быть уверенным)

Кажется, есть ошибка в Pycryptodome. Тест primality miller_rabin_test вызывает is_even для целого числа-кандидата, которое неправильно всегда возвращает true, что приводит к бесконечному циклу. Я заменил строку 579 в site-packages/Cryptodome/Math/_Numbers_gmp.py на

def is_even(self):
    return (int(self) & 1)==0        
    #return _gmp.mpz_tstbit(self._mpz_p, 0) == 0 #Old non-functional line of code.

Проверено и работает здесь.

Это занимает у меня меньше секунды (в среднем) на среднем ноутбуке с Windows 7 64 бит.

Вы уверены, что используете самую последнюю версию pycryptodomex пакет (3.6.1)?

В более ранних версиях вам приходилось устанавливать отдельную оптимизированную числовую библиотеку (MPIR), чтобы получить приличную производительность: альтернатива была основана исключительно на Python, и она действительно была очень медленной.

Другие вопросы по тегам