C # RSA Encrypt Private Расшифровывать Public? - PullRequest
0 голосов
/ 01 февраля 2011

Вот проблема, которую я пытаюсь решить. Допустим, я выпускал какое-то веб-программное обеспечение, построенное на ASP.NET MVC, и хотел, чтобы конечный пользователь мог добавлять пользователей X в систему. Программное обеспечение будет размещено на их серверах.

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

Какой самый лучший / самый простой способ на моем конце зашифровать, чтобы сгенерировать эту строку на моем конце, а затем декодировать ее обратно в текстовый файл в моем приложении? Очевидно, я хочу убедиться, что конечный пользователь не может раскрутить свою зашифрованную строку и просто заменить мою. Я не хочу беспокоиться о том, чтобы попытаться запутать мой источник, чтобы они не могли видеть, как я декодирую строку.

Можно ли зашифровать личным ключом rsa, а затем расшифровать его открытым? Мне не повезло с этим в коде ниже:

        var rsa = new RSACryptoServiceProvider();

        var pubicKey = rsa.ToXmlString(false);
        var privateKey = rsa.ToXmlString(true);

        var test = "this string needs to be encrypted then decrypted";

        var rsa2 = new RSACryptoServiceProvider();
        rsa2.FromXmlString(privateKey);

        var encryptedBytes = rsa2.Encrypt(Encoding.UTF8.GetBytes(test), false);
        var encryptedString = Convert.ToBase64String(encryptedBytes);

        var rsa3 = new RSACryptoServiceProvider();
        rsa3.FromXmlString(pubicKey);

        encryptedBytes = Convert.FromBase64String(encryptedString);

        var decryptedString = Encoding.UTF8.GetString(rsa3.Decrypt(encryptedBytes,                        false));      

Ответы [ 5 ]

3 голосов
/ 01 февраля 2011

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

// Create message and signature on your end
string message = "Here is the license message";

var converter = new ASCIIEncoding();
byte[] plainText = converter.GetBytes(secret);

var rsaWrite = new RSACryptoServiceProvider();
var privateParams = rsaWrite.ExportParameters(true);

// Generate the public key / these can be sent to the user.
var publicParams = rsaWrite.ExportParameters(false);

byte[] signature =
    rsaWrite.SignData(plainText, new SHA1CryptoServiceProvider());

// Verify from the user's side. Note that only the public parameters
// are needed.
var rsaRead = new RSACryptoServiceProvider();
rsaRead.ImportParameters(publicParams);
if (rsaRead.VerifyData(plainText,
                       new SHA1CryptoServiceProvider(),
                       signature))
{
    Console.WriteLine("Verified!");
}
else
{
    Console.WriteLine("NOT verified!");
}

Этот пример в основном скопирован с сайта Microsoft:

И вот веб-страница, которая объясняет концепцию:

2 голосов
/ 01 февраля 2011

Я думаю, что вы ищете цифровую подпись.Не имеет значения, зашифрован ли контент или нет, так как у пользователя есть (открытый) ключ для его расшифровки.Все, что имеет значение, так это то, что источником контента является вы.Поскольку у вас есть файл конфигурации, я считаю, что это XML, поэтому вы ищете XMLDSIG .

Этого легко добиться, используя класс SignedXml в .Net.Тогда все, что вам нужно сделать, это проверить подпись при загрузке файла конфигурации.Этот метод позволяет вам легко использовать любые сертификаты X509, которые у вас могут быть.Вы даже можете встроить открытый ключ в подписанный файл, чтобы пользователю не нужно было устанавливать ваш сертификат (открытый ключ).

0 голосов
/ 01 февраля 2011

Как указано в вашем комментарии в вопросе, ваш подход использует ключ от клиента и ключ от себя. Это не будет работать, так как простые числа, используемые в RSA, предназначены для использования только с соответствующим закрытым / открытым ключом.

Что вам нужно сделать, это использовать ваши два ключа и ничего от клиента или два ключа клиента и ничего от вас. Например,

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

Надеюсь, это поможет!

0 голосов
/ 01 февраля 2011

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

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

На сервере клиентов вы используете свой открытый ключ, чтобы проверить соответствие подписи данным в файле (количество пользователей)

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

0 голосов
/ 01 февраля 2011

Ваша идея верна, но я удивляюсь непредвиденным последствиям.

Вы заявляете, что они будут запускать программное обеспечение на своих серверах, так что это означает, что они сами предоставляют услуги.Но вы также упоминаете, что эта служба должна подключаться к Интернету, чтобы добавить пользователя, проверив его на своем сервере.Что происходит, когда интернет отключается или они хотят иметь безопасную систему, а брандмауэр блокирует доступ в Интернет к серверам?Полностью ли они потеряют способность функционировать?

Просто задаю вопрос, который вы себе задаете: p

...