Совместимость открытого закрытого ключа RSA для JavaScript и C#

У меня есть многоканальное приложение, имеющее веб-версию и мобильную версию с использованием С#.

Это приложение использует модель безопасности «Никому не доверяй». Это означает, что ключи, сгенерированные при регистрации пользователя, шифруются с помощью парольной фразы на стороне клиента перед отправкой на сервер.

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

Причина, по которой закрытый ключ RSA зашифрован, заключается в том, что мы не хотим иметь возможность расшифровывать данные.

Теперь приложение можно использовать в браузере или через мобильные приложения с использованием Xamarin и C#.

Данные, зашифрованные с помощью ключей, сгенерированных в JS, должны быть расшифрованы с помощью C# в мобильном приложении и наоборот.

Как лучше всего реализовать такое шифрование, совместимое с JS и C#.

PS: Ключи генерируются с помощью плагина для браузера! Таким образом, это безопаснее, поскольку другие приложения не смогут получить доступ к фоновой области плагина.


person Preetham Reddy    schedule 03.02.2015    source источник
comment
Нет, мы ничего не можем порекомендовать, потому что запросы рекомендаций не относятся к теме StackOverflow (SO) и будут закрыты.   -  person Artjom B.    schedule 03.02.2015
comment
Я отредактировал свой вопрос, чтобы удалить рекомендацию. Все, что я ищу, это есть ли способ выполнить шифрование и дешифрование RSA, который дает те же результаты, что и JS и C#. Я ищу руководство здесь.   -  person Preetham Reddy    schedule 03.02.2015
comment
Вы пишете, что ключи генерируются в плагине для браузера. Там не так много места для маневра. Вам просто нужно найти способ переместить все значения в C#. Вы не пишите что это за плагин для браузера и тем более в каком формате они сохраняются. Наилучший возможный ответ, который можно дать с информацией: вы можете увидеть, поддерживают ли ключи JS какой-либо общий формат, а если нет, вы, вероятно, можете извлечь все значения (p, q, n, e,...) из частного и открытые ключи, чтобы передать их в C# для создания ключей из этих значений.   -  person Artjom B.    schedule 03.02.2015


Ответы (1)


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


Сначала вам нужно определить свой протокол. Вместо использования RSA или AES вы должны просто использовать E (для шифрования) и D (для дешифрования) и указать, какие ключи вы собираетесь использовать. Используйте H для хеширования и т. д. Убедитесь, что ваша схема безопасна; если вы застряли на этом, спросите на сайте ИТ-безопасности SE.

После того, как вы определили свои протоколы, вам нужно найти соответствующие примитивы, которые доступны как на C#, так и на Java Script. Беглый просмотр показал, что ECIES (который намного эффективнее, чем RSA-шифрование) напрямую не присутствует в Java Script. Так что в настоящее время, вероятно, лучше придерживаться RSA-OAEP. Вы должны были определить гибридную криптосистему, поэтому вы можете использовать шифрование с проверкой подлинности AES (например, GCM или ККМ) тоже.

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


Как видите, это довольно быстро усложняется. Вот почему разработчики должны вместо этого стараться придерживаться заранее определенных конструкций, таких как TLS. Если TLS не подходит, вы можете поискать форматы контейнеров, такие как CMS или PGP, и использовать их в качестве отправной точки. Конечно, найти безопасную реализацию и для этих структур по-прежнему сложно (добро пожаловать в криптографию).

person Maarten Bodewes    schedule 03.02.2015