RSA-шифрование больших данных на C#C#

Место общения программистов C#
Ответить
Anonymous
 RSA-шифрование больших данных на C#

Сообщение Anonymous »

Это мой первый пост, поэтому надеюсь, что я не пропустил ничего важного. Я делаю проект на C#, где мне нужно использовать шифрование с открытым/закрытым ключом для шифрования сообщения, а затем отправить его через SSL-соединение.

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

Код: Выделить всё

    public string[] GenerateKeysToStrings(string uniqueIdentifier)
{
string[] keys;
using (var rsa = new RSACryptoServiceProvider(4096))
{
try
{
string privateKey = rsa.ToXmlString(true);
string publicKey = rsa.ToXmlString(false);

this.pki.StoreKey(publicKey, uniqueIdentifier);

keys = new string[2];
keys[0] = privateKey;
keys[1] = publicKey;
}
finally
{
//// Clear the RSA key container, deleting generated keys.
rsa.PersistKeyInCsp = false;
}
}
return keys;
}
Как вы можете видеть, я генерирую ключи и имитирую PKI, отправляя открытый ключ в простой класс, который его хранит, а затем закрытый ключ записывается в файл
(Обратите внимание, что у меня также есть другой метод, который делает то же самое, но вместо этого сохраняет его в массив, просто потому, что я хотел протестировать и упростить вещи, поскольку я не получаю исключений таких ключей, а иногда и криптографических исключений, когда я делаю это так, как показано в примере, поэтому Я хотел упростить его, просто сохранив строку rsa.ToXmlString как строку в массиве, но безуспешно.)

Теперь у меня есть следующий метод шифрования и дешифрования:

Код: Выделить всё

    public string Encrypt(string keyString, string message)
{
string encryptedMessage;
using (var rsa = new RSACryptoServiceProvider())
{
try
{
//// Load the key from the specified path
var encryptKey = new XmlDocument();
encryptKey.Load(@"C:\Test\PrivateKeyInfo.xml");
rsa.FromXmlString(encryptKey.OuterXml);

//// Conver the string message to a byte array for encryption
//// var encoder = new UTF8Encoding();
ASCIIEncoding byteConverter = new ASCIIEncoding();
byte[] dataToEncrypt = byteConverter.GetBytes(message);

byte[] encryptedData = rsa.Encrypt(dataToEncrypt, false);

//// Convert the byte array back to a string message
encryptedMessage = byteConverter.GetString(encryptedData);
}
finally
{
//// Clear the RSA key container, deleting generated keys.
rsa.PersistKeyInCsp = false;
}
}
return encryptedMessage;
}
Расшифровка:

Код: Выделить всё

    public string Decrypt(string keyString, string message)
{
string decryptedText;
using (var rsa = new RSACryptoServiceProvider())
{
try
{
//// Loads the keyinfo into the rsa parameters from the keyfile
/*
var privateKey = new XmlDocument();
privateKey.Load(keyString);
*/
rsa.FromXmlString(keyString);

//// Convert the text from string to byte array for decryption
ASCIIEncoding byteConverter = new ASCIIEncoding();
var encryptedBytes = byteConverter.GetBytes(message);

//// Create an aux array to store all the encrypted bytes
byte[] decryptedBytes = rsa.Decrypt(encryptedBytes, false);

decryptedText = byteConverter.GetString(decryptedBytes);
}
finally
{
//// Clear the RSA key container, deleting generated keys.
rsa.PersistKeyInCsp = false;
}
}
return decryptedText;
}
Я знаю, что это стена текста, но надеюсь, что вы мне поможете, потому что я так долго бился головой о стену, что это уже не смешно :)

Проблема в том, как мне зашифровать сообщения с помощью RSA (или любого другого шифрования с открытым/закрытым ключом)

Вот тестовый клиент:
/>

Код: Выделить всё

    public static void Main(string[] args)
{
PublicKeyInfrastructure pki = new PublicKeyInfrastructure();
Cryptograph crypto = new Cryptograph();
string[] keys = crypto.GenerateKeysToStrings("simonlanghoff@gmail.com");

string plainText = "Hello play with me, please";
string publicKey = crypto.GetPublicKey("simonlanghoff@gmail.com");

string encryptedText = crypto.Encrypt(keys[0], plainText);

string decryptedText = crypto.Decrypt(keys[1], encryptedText);

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

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

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

Я ценю любую помощь.

Подробнее здесь: https://stackoverflow.com/questions/841 ... in-c-sharp
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C#»