Шифрование RSA в .Net с использованием открытого ключа от SQL Server?

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

Я могу получить открытый ключ из DMV, используя следующий запрос:

SELECT public_key FROM sys.asymmetric_keys WHERE name = 'KeyName'

Это возвращает следующее значение:

0x06020000002400005253413100020000010001008B656455D4C56392C45EEC3563203635F5F42DDA57069E7A880BF0AF055174A2A165DED75BA4E73E2A09BCBFAA3314042B4E2761FF7C1FA388

Как я могу использовать это двоичное значение в качестве открытого ключа для RSA_512 шифрования в .Net? Я просмотрел похожие вопросы здесь, но не нашел подходящего решения: мне нужен либо ключ в форме XML, либо, по крайней мере, знать .Modulus и .Exponent открытого ключа. Могу ли я получить это из этой двоичной последовательности?


ИЗМЕНИТЬ:

Вот мой код

   SqlCommand cmd = new SqlCommand(string.Format("SELECT dbo.GetKey(@KeyName)", conn);
   cmd.Parameters.AddWithValue("@KeyName", ConfigurationManager.AppSettings.Get("PublicKeyName"));
   PublicKey = (byte[]) cmd.ExecuteScalar();

   var rsa=new System.Security.Cryptography.RSACryptoServiceProvider(Convert.ToInt32(ConfigurationManager.AppSettings.Get("KeyLength")));
   rsa.ImportCspBlob(PublicKey);
   EncryptedData = rsa.Encrypt(Data,false);

Я получаю исключение «Ключ недействителен» в последней строке.


person Alexander Galkin    schedule 28.12.2011    source источник


Ответы (1)


Security.Cryptography.RSACryptoServiceProvider rsa=new Security.Cryptography.RSACryptoServiceProvider(512);
rsa.ImportCspBlob(keyblob)

где keyblob представляет собой байтовое [] представление указанного выше ключа.

Это идет прямо из моей оболочки:

eugen@lucidhome:~$ csharp
Mono C# Shell, type "help;" for help

Enter statements below.
csharp> using System.Security.Cryptography;                                                                                                                                                          
csharp> String keystring="06020000002400005253413100020000010001008B656455D4C56392C45EEC3563203635F5F42DDA57069E7A880BF0AF055174A2A165DED75BA4E73E2A09BCBFAA50042B4E27354C1FEB3361F81C381AFF59A6A7"; 
csharp> byte[] keybytes=new byte[keystring.Length/2];
csharp> for (int i=0;i<keystring.Length/2;i++) keybytes[i]=Convert.ToByte(keystring.Substring(2*i,2),16);
csharp> RSACryptoServiceProvider rsa=new RSACryptoServiceProvider(512);
csharp> rsa.ImportCspBlob(keybytes);
csharp> byte[] cleartext=new byte[]{0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15};
csharp> byte[] ciphertext=rsa.Encrypt(cleartext,false);
csharp> ciphertext;
{ 62, 80, 66, 63, 4, 132, 69, 249, 97, 164, 131, 34, 89, 117, 173, 177, 222, 77, 23, 177, 127, 236, 116, 121, 25, 63, 59, 159, 182, 235, 190, 44, 24, 101, 127, 61, 185, 72, 93, 69, 66, 248, 64, 249, 5, 183, 214, 189, 252, 75, 22, 123, 159, 50, 13, 90, 137, 187, 180, 181, 252, 174, 98, 247 }
csharp> keybytes;
{ 6, 2, 0, 0, 0, 36, 0, 0, 82, 83, 65, 49, 0, 2, 0, 0, 1, 0, 1, 0, 139, 101, 100, 85, 212, 197, 99, 146, 196, 94, 236, 53, 99, 32, 54, 53, 245, 244, 45, 218, 87, 6, 158, 122, 136, 11, 240, 175, 5, 81, 116, 162, 161, 101, 222, 215, 91, 164, 231, 62, 42, 9, 188, 191, 170, 80, 4, 43, 78, 39, 53, 76, 31, 235, 51, 97, 248, 28, 56, 26, 255, 89, 166, 167 }
csharp>  
person Eugen Rieck    schedule 28.12.2011
comment
Это не работает. ImportCspBlob() не выдает предупреждения, но пока я пытаюсь использовать метод Encrypt() из объекта rsa, я получаю исключение Invalid Key. Интересно, что общий размер ключа составляет всего 84 байта - это правильно? - person Alexander Galkin; 29.12.2011
comment
Работает для меня с ценностью в вашем вопросе ... это реальная ценность? - person Eugen Rieck; 29.12.2011
comment
Я отредактировал свой вопрос и добавил код, который использую сейчас, но он не работает. Может вы что-нибудь подскажете? - person Alexander Galkin; 29.12.2011
comment
Отредактировал свой ответ, указав точный результат, который я получил - person Eugen Rieck; 30.12.2011
comment
Я пробовал ваш код, и он не работал для .Net 4.0, я все еще получаю исключение Invalid Key в строке с rsa.Encrypt(). И ключ не настоящий ключ, но близко ... - person Alexander Galkin; 30.12.2011
comment
Извините, у меня закончились идеи - я не могу воспроизвести это, поэтому не могу это исправить. Подсказка: я использую именно этот алгоритм в приложении с кросс-платформенной платформой, которое работает под .Net на Windos и Mono на OSX и Linux, и там он работает на всех 3. Не могли бы вы протестировать его с ключом, который у меня был в моем пример? Может быть, с вашим ключом какая-то проблема! - person Eugen Rieck; 30.12.2011
comment
Мне удалось импортировать данные ключа, изменив ключ, как указано здесь, и это сработало. - person Alexander Galkin; 09.01.2012
comment
@EugenRieck, даже ваш пример не работает для меня с VS и .NET 4.5.2. Ошибка с исключением Bad Key. - person Jaime Hablutzel; 24.10.2016