RSA-Verschlüsselung großer Datenmengen in C#C#

Ein Treffpunkt für C#-Programmierer
Anonymous
 RSA-Verschlüsselung großer Datenmengen in C#

Post by Anonymous »

Dies ist mein erster Beitrag, also hoffe ich, dass ich nichts Wichtiges verpasst habe. Ich mache ein Projekt in C#, bei dem ich die Verschlüsselung mit öffentlichen/privaten Schlüsseln verwenden muss, um eine Nachricht zu verschlüsseln und sie dann über eine SSL-Verbindung zu senden.

Ich habe mich für die Verwendung des RSACryptoService entschieden, da dies laut Dokumentation das einzige asymmetrische Verschlüsselungsschema war, das zum Verschlüsseln von Daten verwendet wurde. Das Problem ist, dass ich damit viele Probleme habe. (Ich wollte symmetrische Verschlüsselung machen, aber das ist nicht das, was mein Lehrer von mir verlangt, und seiner Meinung nach sollte es einfach sein, nur eine Blockgröße zu bestimmen, und dann sollte es die ganze Arbeit für Sie erledigen.) Naja, bisher kein Glück und ich habe einige verschiedene Ansätze ausprobiert, aber jetzt bin ich wieder bei den Grundlagen und versuche es noch einmal, das ist mein aktueller Code:

Code: Select all

    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;
}
Wie Sie sehen können, erzeuge ich die Schlüssel und ahme eine PKI nach, indem ich den öffentlichen Schlüssel an eine einfache Klasse sende, die ihn speichert, und dann wird der private Schlüssel in eine Datei geschrieben
(Beachten Sie, dass ich auch eine andere Methode habe, die das Gleiche tut, ihn aber stattdessen in einem Array speichert, nur weil ich die Dinge testen und vereinfachen wollte, da ich keine solchen Schlüsselausnahmen und manchmal kryptografische Ausnahmen bekomme, wenn ich es so mache, wie im Beispiel gezeigt, also ich Ich wollte es vereinfachen, indem ich einfach die Zeichenfolge rsa.ToXmlString als Zeichenfolge in einem Array speicherte, hatte aber kein Glück.)

Jetzt habe ich eine Ver- und Entschlüsselungsmethode wie folgt:

Code: Select all

    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;
}
Entschlüsselung:

Code: Select all

    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;
}
Ich weiß, dass dies eine Wand aus Text ist, aber ich hoffe, Sie können mir helfen, weil ich jetzt schon so lange mit dem Kopf gegen die Wand stoße, das ist jetzt nicht mehr lustig :)

Das Problem ist, wie verschlüssele ich Nachrichten mit RSA (oder einer anderen Verschlüsselung mit öffentlichem/privatem Schlüssel)

Hier ist der Test-Client:

Code: Select all

    public static void Main(string[] args)
{
PublicKeyInfrastructure pki = new PublicKeyInfrastructure();
Cryptograph crypto = new Cryptograph();
string[] keys = crypto.GenerateKeysToStrings("[email protected]");

string plainText = "Hello play with me, please";
string publicKey = crypto.GetPublicKey("[email protected]");

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

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

}
Wie ich bereits erwähnt habe, sind die String-Arrays da, weil ich fehlerhafte Parsing-Fehler aus XML-Dokumenten beseitigen wollte...

Wenn ich den Testclient ausführe und den privaten Schlüssel zum Verschlüsseln und den öffentlichen Schlüssel zum Entschlüsseln verwende, erhalte ich die Fehlermeldung „Schlüssel existiert nicht“ und wenn ich es andersherum mache, erhalte ich eine Ausnahme wegen fehlerhafter Daten.

Bitte helft mir, Leute, falls Wenn Sie eine gute Anleitung kennen oder mir sagen können, wie ich die Verschlüsselung mit öffentlichen/privaten Schlüsseln für Zeichenfolgennachrichten einigermaßen unkompliziert implementieren kann, helfen Sie mir bitte.

Ich bin für jede Hilfe dankbar.

Quick Reply

Change Text Case: 
   
  • Similar Topics
    Replies
    Views
    Last post