RSA-шифрование путем предоставления модуля и показателя степени - PullRequest
7 голосов
/ 23 марта 2012

Я создаю приложение C # Winforms, которое отправляет данные на сервер через HTTPS.

Механизм входа в систему должен выглядеть следующим образом:

  1. Я отправляю имя пользователя на сервер, оно отвечает rsa-modulus и rsa-exponent

  2. Я шифрую пароль, используя эти параметры, и отправляю имя пользователя + пароль на сервер для аутентификации

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

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

Так что, если кто-то делал это раньше, они могут дать мне несколько советов, пожалуйста? спасибо

ОБНОВЛЕНИЕ : по предложению г-на Карстена Кенига,. Я пытался сделать это с RSAParameters и RSA.ImportParameters, но он возвращает ошибку «ПЛОХИЕ ДАННЫЕ» с криптографическим исключением. Мой код указан ниже.

Я тоже пробовал RSA.FromXmlString(mykey); (где mykey содержит строку xml с модулем и exp), но я также получаю ошибку "ПЛОХИЕ ДАННЫЕ" с криптографическим исключением ... Кто-нибудь знает, кто-нибудь? или если это какая-то ошибка Microsoft, кто-нибудь может предложить другую приличную библиотеку, чтобы сделать это легко?

RSAParameters rsaparam = new RSAParameters(); 
rsaparam.Modulus = modbytes; 
rsaparam.Exponent = expbytes; 
RSACryptoServiceProvider RSA = new RSACryptoServiceProvider() ; 
RSA.ImportParameters(rsaparam); 
byte[] encryptedData = RSA.Encrypt(dataToEncrypt, false)

Ответы [ 3 ]

7 голосов
/ 23 марта 2012

Это можно сделать с помощью метода RSACryptoServiceProvider.Encrypt .Вам также нужно будет использовать метод RSACryptoServiceProvider.ImportParameters и передать ему структуру RSAParameters (именно здесь вы устанавливаете показатель, модуль и т. Д.).

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

РЕДАКТИРОВАТЬ: вотпример прямо с MSDN-сайта :

class RSACSPSample
{

    static void Main()
    {
        try
        {       //initialze the byte arrays to the public key information.
            byte[] PublicKey = {214,46,220,83,160,73,40,39,201,155,19,202,3,11,191,178,56,
                                   74,90,36,248,103,18,144,170,163,145,87,54,61,34,220,222,
                                   207,137,149,173,14,92,120,206,222,158,28,40,24,30,16,175,
                                   108,128,35,230,118,40,121,113,125,216,130,11,24,90,48,194,
                                   240,105,44,76,34,57,249,228,125,80,38,9,136,29,117,207,139,
                                   168,181,85,137,126,10,126,242,120,247,121,8,100,12,201,171,
                                   38,226,193,180,190,117,177,87,143,242,213,11,44,180,113,93,
                                   106,99,179,68,175,211,164,116,64,148,226,254,172,147};

            byte[] Exponent = {1,0,1};

            //Values to store encrypted symmetric keys.
            byte[] EncryptedSymmetricKey;
            byte[] EncryptedSymmetricIV;

            //Create a new instance of RSACryptoServiceProvider.
            RSACryptoServiceProvider RSA = new RSACryptoServiceProvider();

            //Create a new instance of RSAParameters.
            RSAParameters RSAKeyInfo = new RSAParameters();

            //Set RSAKeyInfo to the public key values. 
            RSAKeyInfo.Modulus = PublicKey;
            RSAKeyInfo.Exponent = Exponent;

            //Import key parameters into RSA.
            RSA.ImportParameters(RSAKeyInfo);

            //Create a new instance of the RijndaelManaged class.
            RijndaelManaged RM = new RijndaelManaged();

            //Encrypt the symmetric key and IV.
            EncryptedSymmetricKey = RSA.Encrypt(RM.Key, false);
            EncryptedSymmetricIV = RSA.Encrypt(RM.IV, false);

            Console.WriteLine("RijndaelManaged Key and IV have been encrypted with RSACryptoServiceProvider."); 

        }
        //Catch and display a CryptographicException  
        //to the console.
        catch(CryptographicException e)
        {
            Console.WriteLine(e.Message);
        }
    }
}

Обратите внимание, что шифруется только ключ / iv, а не произвольные байты - длина этих байтов также важна!

Допустимая длина описана в MSDN и зависит от ОС!

1 голос
/ 25 сентября 2017

Если вы используете RSACryptoServiceProvider.ToXmlString для экспорта модуля и экспоненты, отправляемых сервером, вам нужно использовать Convert.FromBase64String.

    public RSAParameters SetPublicKey(string modulus, string exponent)
    {
        RSAParameters result = new RSAParameters();
        result.Modulus = Convert.FromBase64String(modulus);
        result.Exponent = Convert.FromBase64String(exponent);

        return result;
    }
0 голосов
/ 13 марта 2013

Еще один совет, который был очень полезен для меня:

В этой строке

//Set RSAKeyInfo to the public key values. 
SAKeyInfo.Modulus = PublicKey;

PublicKey также может быть прямым, простым массивом байтов, который вы можете получить изПоле «Открытый ключ» сертификата X509 (напрямую).

...