
подпись/проверка ECDSA и согласование ключей ECDH на чистом Python
Это простая в использовании реализация ECC (эллиптической криптографии) с поддержкой ECDSA (алгоритма цифровой подписи на эллиптических кривых), EdDSA (алгоритма цифровой подписи на кривых Эдвардса) и ECDH (протокола Диффи—Хеллмана на эллиптических кривых), реализованная чисто на Python и распространяемая под лицензией MIT. С помощью этой библиотеки вы можете быстро создавать пары ключей (подписывающий ключ и проверяющий ключ), подписывать сообщения и проверять подписи. Вы также можете согласовать общий секретный ключ на основе обменянных открытых ключей. Ключи и подписи очень короткие, что упрощает их обработку и включение в другие протоколы.
ПРИМЕЧАНИЕ. Эту библиотеку не следует использовать в производственных средах; подробнее см. Security.
Эта библиотека обеспечивает генерацию ключей, подписание, проверку и вывод общего секретного ключа для пяти популярных кривых NIST «Suite B» GF(p) (простого поля) с длиной ключа 192, 224, 256, 384 и 521 бит. «Короткие имена» этих кривых, известные инструменту OpenSSL (openssl ecparam -list_curves): prime192v1, secp224r1, prime256v1, secp384r1 и secp521r1. Также включена 256-битная кривая secp256k1, используемая в Bitcoin. Кроме того, поддерживаются обычные (не скрученные) варианты кривых Brainpool от 160 до 512 бит. «Короткие имена» этих кривых: brainpoolP160r1, brainpoolP192r1, brainpoolP224r1, brainpoolP256r1, brainpoolP320r1, brainpoolP384r1, brainpoolP512r1. Также включены некоторые небольшие кривые из стандарта SEC (в основном для ускорения тестирования библиотеки): secp112r1, secp112r2, secp128r1 и secp160r1. Генерация ключей, подписание и проверка также поддерживаются для кривых Ed25519 и Ed448. Другие кривые не включены, но добавить поддержку дополнительных кривых над простыми полями не составит труда.
Эта библиотека использует только Python и пакет 'six'. Она совместима с Python 2.6, 2.7 и 3.6+. Также поддерживается выполнение на альтернативных реализациях, таких как pypy и pypy3.
Если установлены gmpy2 или gmpy, они будут использоваться для более быстрых вычислений. Любой из них можно установить после установки этой библиотеки: python-ecdsa обнаружит их наличие при запуске и будет использовать автоматически. На Python3 для оптимальной производительности следует предпочитать gmpy2.
Для запуска тестов совместимости с OpenSSL инструмент 'openssl' должен быть в вашем PATH. Этот выпуск успешно протестирован с OpenSSL 0.9.8o, 1.0.0a, 1.0.2f, 1.1.1d и 3.0.1 (среди прочих).
Эта библиотека доступна на PyPI; для её установки рекомендуется использовать pip:```
pip install ecdsa
Если нужна более высокая производительность и использование нативного кода не является проблемой,
можно указать установку вместе с `gmpy2`:```
pip install ecdsa[gmpy2]
или (более медленный, устаревший вариант):``` pip install ecdsa[gmpy]
## Speed
В следующей таблице показано, сколько времени занимает эта библиотека для генерации пар ключей
(`keygen`), подписания данных (`sign`), проверки этих подписей (`verify`),
выведения общего секрета (`ecdh`) и
проверки подписей без специфичной для ключа предварительной обработки (`no PC verify`).
Все эти значения указаны в секундах.
Для удобства также приведены обратные величины:
сколько ключей в секунду можно сгенерировать (`keygen/s`), сколько подписей
можно создать в секунду (`sign/s`), сколько подписей можно проверить
в секунду (`verify/s`), сколько общих секретов можно вывести в секунду
(`ecdh/s`) и сколько подписей без специфичной для ключа
предварительной обработки можно проверить в секунду (`no PC verify/s`). Размер исходной
подписи (как правило, наименьший
способ кодирования подписи) также указан в столбце `siglen`.
Используйте `tox -e speed`, чтобы сгенерировать эту таблицу на своём компьютере.
На Intel Core i7 4790K @ 4.0GHz я получаю следующую производительность:```
siglen keygen keygen/s sign sign/s verify verify/s no PC verify no PC verify/s
NIST192p: 48 0.00032s 3134.06 0.00033s 2985.53 0.00063s 1598.36 0.00129s 774.43
NIST224p: 56 0.00040s 2469.24 0.00042s 2367.88 0.00081s 1233.41 0.00170s 586.66
NIST256p: 64 0.00051s 1952.73 0.00054s 1867.80 0.00098s 1021.86 0.00212s 471.27
NIST384p: 96 0.00107s 935.92 0.00111s 904.23 0.00203s 491.77 0.00446s 224.00
NIST521p: 132 0.00210s 475.52 0.00215s 464.16 0.00398s 251.28 0.00874s 114.39
SECP256k1: 64 0.00052s 1921.54 0.00054s 1847.49 0.00105s 948.68 0.00210s 477.01
BRAINPOOLP160r1: 40 0.00025s 4003.88 0.00026s 3845.12 0.00053s 1893.93 0.00105s 949.92
BRAINPOOLP192r1: 48 0.00033s 3043.97 0.00034s 2975.98 0.00063s 1581.50 0.00135s 742.29
BRAINPOOLP224r1: 56 0.00041s 2436.44 0.00043s 2315.51 0.00078s 1278.49 0.00180s 556.16
BRAINPOOLP256r1: 64 0.00053s 1892.49 0.00054s 1846.24 0.00114s 875.64 0.00229s 437.25
BRAINPOOLP320r1: 80 0.00073s 1361.26 0.00076s 1309.25 0.00143s 699.29 0.00322s 310.49
BRAINPOOLP384r1: 96 0.00107s 931.29 0.00111s 901.80 0.00230s 434.19 0.00476s 210.20
BRAINPOOLP512r1: 128 0.00207s 483.41 0.00212s 471.42 0.00425s 235.43 0.00912s 109.61
SECP112r1: 28 0.00015s 6672.53 0.00016s 6440.34 0.00031s 3265.41 0.00056s 1774.20
SECP112r2: 28 0.00015s 6697.11 0.00015s 6479.98 0.00028s 3524.72 0.00058s 1716.16
SECP128r1: 32 0.00018s 5497.65 0.00019s 5272.89 0.00036s 2747.39 0.00072s 1396.16
SECP160r1: 42 0.00025s 3949.32 0.00026s 3894.45 0.00046s 2153.85 0.00102s 985.07
Ed25519: 64 0.00076s 1324.48 0.00042s 2405.01 0.00109s 918.05 0.00344s 290.50
Ed448: 114 0.00176s 569.53 0.00115s 870.94 0.00282s 355.04 0.01024s 97.69