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



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


ECDSA — это алгоритм цифровой подписи для эллиптических кривых.
То, что вам нужно, — это шифрование с аутентификацией открытым ключом, которое использует обмен ключами ECDH для создания одноразового симметричного ключа шифрования. Этот симметричный ключ затем используется для выполнения симметричного шифрования с использованием чего-то вроде AES256 или XSalsa20-Poly1305.
Невозможно напрямую зашифровать данные с помощью шифрования EC так же, как это технически возможно сделать в RSA (хотя по соображениям производительности шифрование RSA обычно сначала шифрует одноразовый симметричный ключ шифрования для получателя, а затем использует симметричное шифрование). ).
Я думаю, что «коробка» NaCl доступна как для C#, так и для Javascript и совместима. Также см. TweetNaCl (JS) и TweetNaCl (C#).
@PresidentJamesK.Polk, могу ли я услышать больше по этой теме, пожалуйста?
ECIES — это другое название шифрования с проверкой подлинности с открытым ключом. Пары частного/открытого ключей одинаковы независимо от того, используются ли они для целей ECDSA или ECDH (как часть ECIES / «коробки»). Вам действительно не следует использовать собственную криптовалюту, если вы не уверены в том, что делаете, — именно поэтому я рекомендую использовать NaCl/TweetNaCl.
Спасибо за ответ, я рад принять его - небольшое примечание - что происходит с данными, зашифрованными ECDSA, в JS? Я понимаю, что владелец закрытого ключа может расшифровать его в JS, но нет ли у меня шансов расшифровать зашифрованные данные JS в С#, обладая закрытым ключом?
@JsCoder Я не уверен, что понимаю ваш комментарий. NaCl/TweetNaCl должны быть совместимы между каждой из реализаций JS/C#.
Андрей, то, что ты говоришь, имеет смысл. У меня сложилось впечатление, что использование одной и той же технологии с обеих сторон (например, ECDSA P-384) даст мне совместимое решение.
Вы получите совместимость
Мой вопрос очень простой: если я получу данные, зашифрованные P-384 в браузере, могу ли я все равно расшифровать их на C#, имея закрытый ключ?
@JsCoder TweetNaCl использует Curve25519 вместо P-384. Вы можете зашифровать его с помощью TweetNaCl в браузере и расшифровать на C#. Если бы вам пришлось изменить TweetNaCl для использования P-384, вы могли бы сделать то, что только что просили, но я бы не рекомендовал вам изменять его, если вы точно не понимаете, что делаете. Curve25519 очень безопасен.
Я начал с больших надежд на V8, но они не поддерживают криптомодуль, поэтому мне пришлось прибегнуть к C#, я надеюсь, что NaCI полностью работает на стороне клиента :)
@JsCoder В своем ответе я дал вам ссылку на реализации TweetNaCl на чистом JS и чистом C#, так что не стоит надеяться :)
Вы можете использовать ключи ECDSA в схеме ECIES.