#c# #asp.net #.net #asp.net-mvc #bouncycastle
#c# #asp.net #.net #asp.net-mvc #bouncycastle
Вопрос:
вот что я хочу сделать
1. создайте пару открытого и закрытого ключей для шифрования
2. зашифруйте данные с помощью закрытого ключа
3. расшифруйте данные с помощью открытого ключа
я хочу зашифровать данные с помощью закрытого ключа, чтобы зашифрованные данные, которые я отправляю кому угодно,
могли быть расшифрованы моим открытым ключом,
гарантируя, что данные поступают от меня
вот что у меня есть прямо сейчас,
я использую RSACryptoServiceProvider
класс
var rsa = new RSACryptoServiceProvider();
var privateKey = rsa.ToXmlString(true);
var publicKey = rsa.ToXmlString(false);
var text = "my messege";
Console.WriteLine("RSA // Text to encrypt: " text);
var enc = Encrypt(text, publicKey);
Console.WriteLine("RSA // Encrypted Text: " enc);
var dec = Decrypt(enc, privateKey);
Console.WriteLine("RSA // Decrypted Text: " dec);
мои методы
расшифровки
public static string Decrypt(string data,string pvtK)
{
var rsa = new RSACryptoServiceProvider();
var dataArray = data.Split(new char[] { ',' });
byte[] dataByte = new byte[dataArray.Length];
for (int i = 0; i < dataArray.Length; i )
{
dataByte[i] = Convert.ToByte(dataArray[i]);
}
rsa.FromXmlString(pvtK);
var decryptedByte = rsa.Decrypt(dataByte, false);
return _encoder.GetString(decryptedByte);
}
для шифрования
public static string Encrypt(string data,string pubK)
{
var rsa = new RSACryptoServiceProvider();
rsa.FromXmlString(pubK);
var dataToEncrypt = _encoder.GetBytes(data);
var encryptedByteArray = rsa.Encrypt(dataToEncrypt, false).ToArray();
var length = encryptedByteArray.Count();
var item = 0;
var sb = new StringBuilder();
foreach (var x in encryptedByteArray)
{
item ;
sb.Append(x);
if (item < length)
sb.Append(",");
}
return sb.ToString();
}
в настоящее время он работает нормально при шифровании с помощью открытого ключа и дешифровании с помощью закрытого ключа
теперь у меня есть две проблемы при расшифровке с помощью закрытого ключа
-
Когда я передаю свой закрытый ключ для шифрования своего сообщения, оно расшифровывается, но когда я передаю свой открытый ключ для расшифровки этих данных, я получаю исключение неправильного ключа и не работаю
-
RSACryptoServiceProvider
закрытый ключ — это комбинация открытого и закрытого, как мне узнать, какой из моих реальных закрытых ключей находится в формате xmlFormat, что затрудняет определение того, что означает каждая вещь в ключе
вот мой закрытый ключ
<RSAKeyValue><Modulus>sHQOnB9obOy9UUvKolGBYUHyGNKXKC7ZqerB/pLQcOKKlhqXAB5KLPf62banbC5DLU5 Mhd25sq5KE5l/vEZeQLia np2TYwis8bNVQpLYh/Q2MmuldKzl4Al ziVH90NLe0fX6LiC5W9Q36HkzV16BKrHwLPljNNBNYWENl/p8=</Modulus><Exponent>AQAB</Exponent><P>vGAPI9BTSnOvVKQ9spTt7WaCb3j Dexy48VHbGV2 h1hKEA7pF4Mrog7VL7MCNp8G8XZIWh3sMa9VHn2bNv0mQ==</P><Q>78xcUFFtngtKxpr6pZssiXIlTThFo7X2zRiUsWLSUKDJlYlGELu8cGAxzbRYirk2psm92Fga1jAPNDhuzpVX9w==</Q><DP>dHcThTn89RAXO8ab2riXbequBEuTD3q8AbTsFsmYyMS3WBJ2jYYUYygZPqkELwkeKHGncC9NqP8G Z66S82mKQ==</DP><DQ>C7Zel myQfLpPxQYw/f1T 1MVx41gI6FtHTL5nIeNaP01KH00yJoTNDV/eceIAB14 WcqTF8dhO42mMbPmna9w==</DQ><InverseQ>ORoUweiOyF eEQ3F3 NU2IdcSYM5TRG/J73er1nBuyfz5QjKpOhSWqtl5W3mNmQmX8/WDv9bFzgE0jPdXQtFTQ==</InverseQ><D>B/agGpHcs7gpdFJNCYjpI5UHOPFdt6DWdPGVCLxI4oqIaG04Lfd8yU1cIyUE2eaEMWn1J9iUQEBoHWmp9vJozLbhzUdQUC tcrms4dys6U AhLTJ obpmlJczdVABSWlwFe1lnoJNqJN9QQyc4tVvcLKzy YPbhHvb66bfhVcqk=</D></RSAKeyValue>
Комментарии:
1. В учебнике RSA говорится, что подписание и шифрование — это одни и те же операции. Практичный, удобный RSA использует разные операции / параметры для шифрования и подписи, поэтому, если вы хотите подписать (что, я думаю, вы делаете — «гарантируя, что данные поступают от меня»), ищите это, а не шифрование.
2. Кроме того, ваш выбор метода для «упорядочивания» результата сомнителен — десятичное представление чисел через запятую действительно неэффективно по сравнению, например, с кодировкой Base 64. (Ваша кодировка увеличивает размер данных на 100-300%. Кодирование на базе 64 дает вам ~ 40%)
3. @Damien_The_Unbeliever не могли бы вы рассказать, возможно ли шифровать данные с помощью закрытого ключа при использовании класса RSACryptoServiceProvider?
4. Вы используете
SignData
илиSignHash
, а неEncrypt
. А затем используйтеVerify
варианты на другом конце.5. каждая нормальная библиотека, которая поддерживает закрытый ключ у отправителя -> открытый ключ у получателя, предоставит это как методы подписи / проверки (могут не иметь этих имен). Если они также поддерживают открытый ключ -> закрытый ключ, у них будут методы шифрования / дешифрования. Чтобы сделать вещи безопасными , вы не можете использовать RSA из учебника, в котором говорится, что подпись и шифрование — это одно и то же. У вас должно быть четыре разные операции. Это не «.NET вещь», это вещь криптографической безопасности. Если вы этого не понимаете, то при всем уважении, вам не следует писать криптографический код.