Какие реализации Ed25519 существуют?

Новая схема аутентификации SQRL опирается на шифрование Curve Ed25519, разработанное Дэниелом Бернштейном. Однако для того, чтобы начать реализацию этой схемы, сначала должна быть зрелая реализация кривой Ed25519.

Кто-нибудь знает какие-либо зрелые реализации? Для Java, .NET или любой другой популярной платформы?

6 ответов

Решение

Кривая 25519 против Ed25519

Прежде всего, Curve25519 и Ed25519 - это не одно и то же. Они основаны на одной базовой кривой, но используют разные представления. Большинство реализаций предназначены либо для Curve25519, либо для Ed25519, но есть возможность повторно использовать некоторый код между ними.

Можно преобразовать открытые ключи Ed25519 в Curve25519, но, наоборот, пропускает бит знака. т.е. два открытых ключа Ed25519 соответствуют одному открытому ключу Curve25519. Закрытые ключи также очень похожи.


Что касается реализаций, важно различать реальную реализацию и библиотеки, которые упаковывают их в удобную форму.

Актуальные реализации

Реализация djb в SUPERCOP

  • Ref написано на С, очень медленно
  • DJB-х Ref10 написано в с, достойная производительность
  • DJB-х amd64-64-24k а также amd64-51-30k написано на ассемблере, примерно в два раза быстрее Ref10

Он также написал более ранний, несовместимый прототип в NaCl, не используйте его

Внедрение Floodyberry в Донну

Содержит несколько вариантов, как сборки, так и ц. Некоторые оптимизированы для 64-битных, некоторые оптимизированы для 32-битных.

Библиотеки

  • LibSodium

    C библиотека, в настоящее время использует Ref10 реализация

    Имеет привязки для многих языков программирования. Это, пожалуй, самая популярная версия и то, что я рекомендую большинству людей.

    Содержит множество других криптографических функций из NaCl, таких как аутентифицированное шифрование (XSalsa20Poly1305), хэши, обмен ключами Curve25519.

  • Nightcracker's Ed25519

    C библиотека, использует Ref10 реализация.

    Наиболее интересной особенностью этой библиотеки является то, что она поддерживает обмен ключами с использованием открытых ключей Ed25519. Но он не хеширует общий ключ, поэтому он не выдает тот же общий секрет, что и Curve25519.

    Содержит готовые двоичные файлы для Win32 и Win64.

  • Мой порт C#

    Чистый управляемый код и работает без изменений на 32 и 64-битных платформах. Основано на Ref10. Немного медленнее, чем реализации c, но разница удивительно мала.

    Поддерживает обмен ключами, совместимый с NaCl, используя ключи Curve25519 и Ed25519 и содержит множество других криптографических функций из NaCl. Я стремлюсь к тому же набору функций, что и LibSodium.

    Функции подписи Ed25519 работают и прошли достаточное количество тестов, но другие части библиотеки немного грубоваты.

  • Непосредственно используя реализацию из SUPERCOP или кода Floodyberry.

    Вероятно, для сборки потребуется немного больше работы, но вы получите более высокую производительность (~2 раза) и вам не нужно переносить код, который вам не нужен.


Я рекомендую сейчас пойти с LibSodium. Это относительно популярный и ухоженный. Производительность приличная, должна вызывать проблемы с производительностью только в действительно тяжелых приложений.

Добавление к ответу CodesInChaos:

Библиотеки

  • Мой порт Java

    На основе ссылки 10 и предоставляет стандартные API-интерфейсы JCA, чтобы его можно было добавить к провайдеру шифрования.

Безусловно, самый зрелый и производительный - тот, который написал сам Даниэль Бернштейн. Его можно найти в SUPERCOP.

Тем не менее, его API довольно неловко, и для того, чтобы получить то, что вам нужно, требуется некоторое копание / извлечение. Чтобы сохранить работу других людей, я сделал это сам и разместил свой код на Github.

Остерегайтесь ваших точных терминов, хотя, Ed25519 и Curve25519 связаны, но разные вещи. Что вам следует знать, так это то, что Ed25519 - это система подписи открытого / закрытого ключа, а Curve25519 - это обмен ключами. Пары ключей Ed25519 можно преобразовать в пары ключей Curve25519, наоборот, я не уверен в этом. Моя библиотека на Github хранит все в пары ключей Ed25519 и преобразует их в Curve25519 для обмена ключами.

В Rust есть крейт ed25519 , который реализует алгоритм цифровой подписи Эдвардса (EdDSA) поверх Curve25519, как указано в RFC 8032. Еще один крейт Rust — ed25519_dalek , в котором реализована реализация Rust генерации, подписи и проверки ключа ed25519. Есть некоторые последствия для иерархического вывода ключа на ed255190-dalek, в этом посте есть несколько хороших указателей и решение.

Встроенные реализации

Go 1.17 (3 квартал 2021 г.) будет поставляться с новой, более быстрой реализацией, разработанной Filo Sottile .

См. Коммит golang b0c49ae:

Это изменение заменяет crypto/ed25519/internal/edwards25519пакет с кодом изfilippo.io/edwards25519, значительно более быстрая, безопасная, хорошо протестированная (более 1600 строк новых тестов, 99% тестового покрытия) и лучше документированная (600 строк новых комментариев) реализация.

Некоторые основные моменты:

  • ненасыщенная реализация 51-битного поля конечностей, оптимизированная для 64-битных архитектур и math/bits.Mul64 внутренняя сущность
  • более эффективное скалярное умножение с переменным временем с использованием несмежной формы с разной шириной и большей поисковой таблицей для фиксированной базы
  • безопасный математический / big.Int-подобный API для типов Scalar, Point и field.Element с полностью абстрактными инвариантами редукции
  • набор тестов, включающий в себя тестирование / быстрый фаззер, который исследует значения крайних случаев, которые невозможно получить случайным образом, и систематические тесты для аргументов и псевдонимов получателя
  • правила точечного декодирования, которые строго соответствуют исходной логике crypto / ed25519 / internal / edwards25519, чтобы избежать проблем с консенсусом
  • Ядра сборки, совместимые с AssemblyPolicy, для arm64 и amd64, первая менее 20 строк, а вторая сгенерирована программой, основанной на которую можно построчно github.com/mmcloughlin/avo,проверять в сравнении с общей реализацией.
Другие вопросы по тегам