Почему 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, и она действительно была очень медленной.