|
2 / 2 / 0
Регистрация: 07.08.2023
Сообщений: 32
|
||||||
Алгоритм ECDH в библиотеки BouncyCastle работает не так как в библиотеки .net 817.01.2024, 14:42. Показов 1819. Ответов 17
Метки криптография (Все метки)
Суть вопроса такая. Мне нужна очень простая вещь - реализация алгоритма ECDH с кривой secp256r1. Казалось бы эта кривая и этот алгоритм используется в TLS и куча других мест. Но вот найти нормальную реализацию в 1 файл, это просто неподсильная вещь. Да я нагуглил штук 30 полукорявых заброшенных исходников на githab. Но все эти проекты - каждый по сотни и более файлов в кривой структуре. И вообще создавать файл для одной строки, а большая часть в проектах как раз такие файлы - я вот вообще не понимаю такую моду. Это же вынос мозга. Проще самому написать реализацию чем разбираться в сотни этих фалов.
Всё это я написал потому как у меня есть реализация Curve25519 в виде одного фала с 400 строк кода. Всё прозрачно и понятно. Ладно лирику отставили. Теперь к проблеме. Готовая реализация криптографии на C# это просто исчезающий вид зверька. Самая известная библиотека это BouncyCastle. Я в своё время попытался вычленить от туда реализацию secp256r1, но в связи с стилем написания этой библиотеки, это оказалось практически невозможным. Парсить приходилось практически большую часть файлов из тысяч. Или сколько их там было? Да-да. Современный способ писания когда - максимальное наследование, интерфейсы, виртуальные и абстрактные методы. Внедрение зависимостей где только можно и не можно, и ещё куча всего что бы максимально склеить все файлы. Вместо 1 файла на 1000 строк, делаем 1000 файлов по 1 строке. И т.д. В .net есть встроенная криптография. И там даже есть рабочая версия secp256r1. Но как оказалось BouncyCastle и .net дают разный результат. Я даже ухищерился сделать следующее. Создаю 2 экземпляра ecdh из BouncyCastle. Выдираю из них приватные и публичные ключи. Потом на основании этих ключей делаю 2 экземпляра ecdh из .net Не буду описывать отдельный квест как я искал способ в .net задать приватный и публичный ключ. Нормальным способом это не дано в этой кривой поделки. Так вот секреты которые получаются в BouncyCastle и .net - РАЗНЫЕ. Но самое интересное что в .net секреты совпадают что говорит что в целом библиотека работает, но работает не так как надо. Ну и вопрос. Идеальным было бы найти нормальную нативную реализацию на С# ecdh на кривой secp256r1. Второй вариант - может кто подскажет что я неправильно делаю с .net что она выдаёт не тот результат. Эта же проблема с не правильным результатом обсуждалась здесь Прикладываю тестовый проект для экспериментов - в консоль выводится секрет из BouncyCastle и .net на одних ключах. Там всё максимально понятно. Но и тут код выложу для посмотреть:
0
|
||||||
| 17.01.2024, 14:42 | |
|
Ответы с готовыми решениями:
17
Ошибка при использовании библиотеки в .NET Framework 4.7.2 и все работает в .NET 5.0 Как посмотреть какие библиотеки тянут другие библиотеки процесса Как включить библиотеки в исполняемый файл, чтобы не приходилось ставить библиотеки (Eclipse) |
|
2 / 2 / 0
Регистрация: 07.08.2023
Сообщений: 32
|
||||||
| 17.01.2024, 16:50 [ТС] | ||||||
|
Вчера целый день экспериментировал и у же к вечеру голова была никакая и не смог доделать один шаг.
Оставлю за кадром - НАХРЕНА это делает net. Теперь придётся лезть в сорцы и попытаться отучивать его от этого действия.
0
|
||||||
|
6691 / 4102 / 1607
Регистрация: 09.05.2015
Сообщений: 9,574
|
||||||||
| 17.01.2024, 16:50 | ||||||||
1
|
||||||||
|
2 / 2 / 0
Регистрация: 07.08.2023
Сообщений: 32
|
|||||||||||||
| 17.01.2024, 17:13 [ТС] | |||||||||||||
Опять же поиск как добавить сторонний публичный ключ в ECDiffieHellman тоже меня добил. Функции просто нету для этого. Нашёл только костыльный способ через создания нового экземпляра ECDiffieHellman с параметрами и выдёргивания уже объекта ECDiffieHellmanPublicKey. Потому как DeriveKeyMaterial больше ничего не жрёт. Хотя тупо передать туда открытый ключ в виде байтового массива - это самый очевидный способ работы.
0
|
|||||||||||||
|
6691 / 4102 / 1607
Регистрация: 09.05.2015
Сообщений: 9,574
|
|
| 17.01.2024, 17:22 | |
|
0
|
|
|
2 / 2 / 0
Регистрация: 07.08.2023
Сообщений: 32
|
||||||
| 17.01.2024, 17:46 [ТС] | ||||||
У нас уже есть один первоначальный объект ECDiffieHellman у которого есть метод ExportSubjectPublicKeyInfo который сразу возвращает публичный ключ. Правда и тут нормально не возвращает - с мусором. Но хоть мусор легко отсеять - нормальные данные идут с 27 байта. Да да я знаю что это за мусор. Вот только он не участвует в протоколе обмена ключами. Так вот нормально поведение - которое я встречал в других библиотеках и в том же BouncyCastle, это передать в тот же объект публичный ключ принятый от клиента, который является набором байт и сразу получит общий секрет. Вместо этого я должен костылить код с созданием поинтеров кривой, где я должен вручную парсить байтовый ключ. А потом ещё и создавать новый объект ECDiffieHellman. Для всего этого выделяется память что явно не способствует скорости работы. Я не считаю это нормальным. Просто криптография в .net сильно не доделанная. Ещё пару лет назад в ней вообще ничего по элептичесим кривым не было. И реализации secp256r1 тоже не было. Но сейчас хоть с мёртвой точки сдвинулось
0
|
||||||
|
6691 / 4102 / 1607
Регистрация: 09.05.2015
Сообщений: 9,574
|
|||
| 17.01.2024, 19:08 | |||
|
0
|
|||
|
2 / 2 / 0
Регистрация: 07.08.2023
Сообщений: 32
|
||
| 17.01.2024, 19:26 [ТС] | ||
С экспортом проблемы нету - ExportSubjectPublicKeyInfo возвращает только публичный ключ в открытом виде. Байтовый массив. Лишние 27 байтов на заголовок - так, лёгкая неприятность. ExportParameters же возвращает много лишнего, под которое выделяется память. И тормозит работу алгоритма на пустом месте. Проблема в импорте. Который принимает только ECParameters. И который опять же я должен создавать путём парса ключа клиента. От клиента приходит ключ - байтовый массив. И который нельзя напрямую передать в импорт. Просто не создана ещё функция. И вообще в пределах одного кода весьма удобно бросаться друг в друга объектами. Но это же алгоритм обмена ключами между 2 сторонами. А обмен может быть только в виде байтовых массивах. Следовательно и код должен напрямую, без геморроя и оверхеда работать с байтовыми массивами. Мне не нравится что для нормальной работы эклиптики в .net нужно создавать кучу паразитных объектов, которые будут жрать память. Это как раз тот случай - где нужна скорость и оптимальность. В целом работать с этим можно. Сейчас как раз провожу тесты разных библиотек на скорость работы.
0
|
||
|
6691 / 4102 / 1607
Регистрация: 09.05.2015
Сообщений: 9,574
|
|||||||
| 17.01.2024, 19:43 | |||||||
|
0
|
|||||||
|
2 / 2 / 0
Регистрация: 07.08.2023
Сообщений: 32
|
|||||||||||||||
| 17.01.2024, 20:16 [ТС] | |||||||||||||||
Вместо этого мне нужно создать ещё один ECDiffieHellman. Создать ECParameters и загрузить в этот новый ECDiffieHellman. И всё для того что бы я мог получить объект ECDiffieHellmanPublicKey который я уже могу загрузить в первый ECDiffieHellman.
И да я тут провёл маленький тест. Сравнил BouncyCastle и .net. В тесте производится обмен ключами между 2 сторонами. Результат показал что .net реализация быстрее BouncyCastle на 22% 1000 итераций net : 3.8 секунды boun: 5сек В принципе меня результат радует. Код приведу. Тест набросан на коленке поэтому на объективность не претендует. но общую картину показывает.
0
|
|||||||||||||||
|
6691 / 4102 / 1607
Регистрация: 09.05.2015
Сообщений: 9,574
|
||||||
| 17.01.2024, 21:09 | ||||||
|
Я так и не понял зачем вы в тесте .NET ECDiffieHellman.Create 4 раза вызываете, если можно упростить до 2 и результат не меняется...
0
|
||||||
|
2 / 2 / 0
Регистрация: 07.08.2023
Сообщений: 32
|
||
| 17.01.2024, 21:24 [ТС] | ||
|
Протестировал нативную реализацию Curve25519. 1 файл в 400 строк когда. Без бесконечного выделения объектов и прочего мусора.
1000 итераций 0.4 секунды Теперь вы понимаете почему я гоню на не оптимальную реализацию? Хотя тут мои придирки не совсем верны. Curve25519 была создана как раз для максимально быстрой работы и она быстрее тех же nistP256. Но прирост скорости в сотни процентов впечатляет. Хотя в криптографии скорость функции может сыграть злую шутку. Для защиты важна скорость прямого перебора. Чем медленнее алгоритм тем менее подвержен брутфорсу. Добавлено через 6 минут
Я лишь объединил эти 2 машины в 1 месте. Вот вы передаёте ecd2.PublicKey сразу. Потому как 2 сторона существует в коде вот тут. Просто бери объект. Но в реальности вторая сторона существует только в виде байтового массива пришедшего по сети. Вот что бы этот байтовый массив превратить в ECDiffieHellmanPublicKey и приходится костыли делать в виде мусорного создания ECDiffieHellman.
0
|
||
|
6691 / 4102 / 1607
Регистрация: 09.05.2015
Сообщений: 9,574
|
||
| 17.01.2024, 22:30 | ||
|
1
|
||
|
2 / 2 / 0
Регистрация: 07.08.2023
Сообщений: 32
|
|||||||
| 17.01.2024, 23:00 [ТС] | |||||||
|
Спасибо. За наводку. Я вот тут тестика написал чисто для проверки что быстрее будет для использования ExportSubjectPublicKeyInfo или ECParameters
Для копирования буферов применил Buffer.MemoryCopy - это чуть ли не одна инструкция процессора (хотя я не смотрел что там компилится). Как то собирал статистику для копирования буферов - это самая быстрая. Вобщем взял её для нивелирования воздействия самого копирования. Короче в среднем на 1000 итераций
0
|
|||||||
|
2 / 2 / 0
Регистрация: 07.08.2023
Сообщений: 32
|
||
| 17.01.2024, 23:29 [ТС] | ||
0
|
||
|
|
||
| 17.01.2024, 23:35 | ||
|
P.S. Любопытствую просто, для опыта. ![]() P.S.2. Цитировать не страшно. Не бойтесь оставлять никнейм.
0
|
||
|
2 / 2 / 0
Регистрация: 07.08.2023
Сообщений: 32
|
||
| 17.01.2024, 23:55 [ТС] | ||
|
Так вот для обмена ключами раньше был RSA, но он умер по причине врождённого порока. Стоилло с сервера стянуть приватный ключ - и всю переписку можно расшифровать. Конечно для этого её надо было бы заранее сохранять. С элиптикой такой вариант не проходит. У неё просто нету постоянного приватного ключа. Сейчас все сидят на элиптеке. И да - с letsencrypt - сейчас это удовольствие не только весёлое но и бесплатное. P.S. на вопрос так и не ответил. Для сетевого сервера. А игровой ли (где важны микросекунды) или сайт какой где одна страница открывает по 5 tls соединений сразу и 100 пользователей устраивают DDOS атаку, не столь важно. OFFTOP Вчера при отладке заметил у мозилы интересное нововведение. Она запоминает прошлые запросы. И стоит в окне адреса ввести одну букву и если эта буква будет как у вашего сайта - то будет сразу же установлено соединение к сайту, да же если вы в результате введёт совершенно другой адрес. Короче DDOS смотрю будет только увеличиваться со временем )
1
|
||
| 17.01.2024, 23:55 | |
|
Помогаю со студенческими работами здесь
18
Как с подгруженой библиотеки сделать вызов функции которая находится в файле подгрузки библиотеки? Библиотеки C++ : Как использовать в C# .Net? Подключение файла библиотеки ( как то так) как вытащить JS-файл из библиотеки asp.net Можно ли упаковать в exe'шник используемые в проекте библиотеки так, чтобы можно было запустить программу на машине без .NET Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
Оттенки серого
Argus19 18.03.2026
Оттенки серого
Нашёл в интернете 3 прекрасных модуля:
Модуль класса открытия диалога открытия/ сохранения файла на Win32 API;
Модуль класса быстрого перекодирования цветного изображения в оттенки. . .
|
SDL3 для Desktop (MinGW): Рисуем цветные прямоугольники с помощью рисовальщика SDL3 на Си и C++
8Observer8 17.03.2026
Содержание блога
Финальные проекты на Си и на C++:
finish-rectangles-sdl3-c. zip
finish-rectangles-sdl3-cpp. zip
|
Символические и жёсткие ссылки в Linux.
algri14 15.03.2026
Существует два типа ссылок — символические и жёсткие.
Ссылка в Linux — это запись в каталоге, которая может указывать либо на inode «файла-ИСТОЧНИКА», тогда это будет «жёсткая ссылка» (hard link),. . .
|
[Owen Logic] Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора
ФедосеевПавел 14.03.2026
Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора
ВВЕДЕНИЕ
Выполняя задание на управление насосной группой заполнения резервуара,. . .
|
|
делаю науч статью по влиянию грибов на сукцессию
anaschu 13.03.2026
прикрепляю статью
|
SDL3 для Desktop (MinGW): Создаём пустое окно с нуля для 2D-графики на SDL3, Си и C++
8Observer8 10.03.2026
Содержание блога
Финальные проекты на Си и на C++:
hello-sdl3-c. zip
hello-sdl3-cpp. zip
Результат:
|
Установка CMake и MinGW 13.1 для сборки С и C++ приложений из консоли и из Qt Creator в EXE
8Observer8 10.03.2026
Содержание блога
MinGW - это коллекция инструментов для сборки приложений в EXE. CMake - это система сборки приложений. Здесь описаны базовые шаги для старта программирования с помощью CMake и. . .
|
Как дизайн сайта влияет на конверсию: 7 решений, которые реально повышают заявки
Neotwalker 08.03.2026
Многие до сих пор воспринимают дизайн сайта как “красивую оболочку”. На практике всё иначе: дизайн напрямую влияет на то, оставит человек заявку или уйдёт через несколько секунд.
Даже если у вас. . .
|