Использование ECDSA для шифрования данных в C#

Я пытаюсь придумать совместимый криптографический алгоритм (под interopable я имею в виду возможность подписывать/шифровать данные в c# с использованием ключей, сгенерированных JS, и наоборот).

Я взял ECDSA за основу, так как он выглядел современно и хорошо документирован, я также видел примеры значений keyUsage, подразумевающих поддержку шифрования (которое, как мне кажется, работает довольно хорошо в JS).

Мне удалось подписать/проверить подписи в c# с помощью JS сгенерированных ключей, но c# класс ECSDA , похоже, не поддерживает шифрование. Это незавершенное производство от имени MS или нам следует придерживаться RSA для шифрования (как предполагает этот ответ)?

Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
1
0
79
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

ECDSA — это алгоритм цифровой подписи для эллиптических кривых.

То, что вам нужно, — это шифрование с аутентификацией открытым ключом, которое использует обмен ключами ECDH для создания одноразового симметричного ключа шифрования. Этот симметричный ключ затем используется для выполнения симметричного шифрования с использованием чего-то вроде AES256 или XSalsa20-Poly1305.

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

Я думаю, что «коробка» NaCl доступна как для C#, так и для Javascript и совместима. Также см. TweetNaCl (JS) и TweetNaCl (C#).

Вы можете использовать ключи ECDSA в схеме ECIES.

President James K. Polk 10.06.2024 02:12

@PresidentJamesK.Polk, могу ли я услышать больше по этой теме, пожалуйста?

JsCoder 10.06.2024 02:13

ECIES — это другое название шифрования с проверкой подлинности с открытым ключом. Пары частного/открытого ключей одинаковы независимо от того, используются ли они для целей ECDSA или ECDH (как часть ECIES / «коробки»). Вам действительно не следует использовать собственную криптовалюту, если вы не уверены в том, что делаете, — именно поэтому я рекомендую использовать NaCl/TweetNaCl.

Andrew Parks 10.06.2024 02:15

Спасибо за ответ, я рад принять его - небольшое примечание - что происходит с данными, зашифрованными ECDSA, в JS? Я понимаю, что владелец закрытого ключа может расшифровать его в JS, но нет ли у меня шансов расшифровать зашифрованные данные JS в С#, обладая закрытым ключом?

JsCoder 10.06.2024 02:18

@JsCoder Я не уверен, что понимаю ваш комментарий. NaCl/TweetNaCl должны быть совместимы между каждой из реализаций JS/C#.

Andrew Parks 10.06.2024 02:19

Андрей, то, что ты говоришь, имеет смысл. У меня сложилось впечатление, что использование одной и той же технологии с обеих сторон (например, ECDSA P-384) даст мне совместимое решение.

JsCoder 10.06.2024 02:20

Вы получите совместимость

Andrew Parks 10.06.2024 02:20

Мой вопрос очень простой: если я получу данные, зашифрованные P-384 в браузере, могу ли я все равно расшифровать их на C#, имея закрытый ключ?

JsCoder 10.06.2024 02:21

@JsCoder TweetNaCl использует Curve25519 вместо P-384. Вы можете зашифровать его с помощью TweetNaCl в браузере и расшифровать на C#. Если бы вам пришлось изменить TweetNaCl для использования P-384, вы могли бы сделать то, что только что просили, но я бы не рекомендовал вам изменять его, если вы точно не понимаете, что делаете. Curve25519 очень безопасен.

Andrew Parks 10.06.2024 02:24

Я начал с больших надежд на V8, но они не поддерживают криптомодуль, поэтому мне пришлось прибегнуть к C#, я надеюсь, что NaCI полностью работает на стороне клиента :)

JsCoder 10.06.2024 02:25

@JsCoder В своем ответе я дал вам ссылку на реализации TweetNaCl на чистом JS и чистом C#, так что не стоит надеяться :)

Andrew Parks 10.06.2024 02:26

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