C# Problem mit Asymentrische verschlüsselung

Bububoomt

ohne Vertrauen
ID: 10361
L
28 April 2006
19.666
769
Hallo,

ich hatte bisher mich damit nicht beschäftigt und wollte das mal testen. Hatte nur mal in der Vorlesung Datenschutz/Datensicherheit was damit zu tun, aber nie eine Umsetzung gemacht.

Ich habe die angehängte Datei anhand folgender Seite für mich angepast:
https://blogs.msdn.com/b/alejacma/a...airs-encrypt-and-decrypt-data-with-net-c.aspx

Und rufe es wie folgt auf:
Code:
string[] ver=new string[20];
                string[] ent = new string[20];
                for (int i = 0; i < 20; i++)
                {

                    String t = k.verschluesseln(schluessel[1], "HALLO");
                    ver[i] = t;
                    String en = k.entschluesseln(schluessel[0], t);
                    ent[i] = en;

                }

Ich erhalte Fast immer unterschiedliche Verschlüsselte Ergebnisse und fast nie ein Entschlüsseltes Ergebnis (bei 20 mal waren eben nur 2 Entschlüsselungen richtig)

Was mach ich falsch?
Ist bei der Verschlüsselung das Ergebnis nicht immer gleich? Ist das so richtig?
Hoffe mir kann wer weiterhelfen.
Danke
 

Anhänge

  • krypto.cs.txt
    3,6 KB · Aufrufe: 12
Das die Verschlüsselung immer unterschiedlich ist, ist kein Problem und auch oft so gewollt. Das wird gemacht, damit ein Angreifer, der nur das Chiffrat besitzt, daraus keinerlei weitere Informationen schließen kann, hätte er jedesmal das gleiche Chiffrat, wüsste er das es sich um die gleiche Nachricht handelt (nicht schlimm, aber muss eben auch nicht sein). Das wird durch die Initialisierungsvektoren der Blockchiffre gelöst, die nachher auf RSA aufbaut.

Das du es nicht wieder entschlüsseln kannst, kann viele Ursachen haben. In der Regel ist es aber so, dass an irgendeiner Stelle die Konvertierungen von Bytes in String und vice versa alles kaputt machen, wahrscheinlich auch hier.

Fang doch erstmal ganz simpel an:
  1. keine Klasse sondern linear von oben nach unten die KEys erzeugen, verschlüsseln und wieder entschlüssen
  2. nicht die Keys in XML umwandeln und dann wieder so einlesen, sondern direkt die Objekte nutzen
  3. nicht die Nachrichten von Strings in Bytes konvertieren, verschlüsseln, wieder von Bytes in Strings, damit der nächste wieder Bytes draus macht, sie entschlüsseln kann und dann wieder zu nem String macht...
  4. nutze mal nur ASCII Chars, damit kann man Unicode-Probleme ausschließen


Da es bei 20mal nur 2mal funktioniert, und deine verschlüsselten Strings immer gleich sind, liegt es denke ich an deinem Handling mit den Zertifikaten.


und wenn es dann funktioniert, kannst du es schrittweise "objektorientisieren" wie du lustig bist.
 
ok ich werde mal das prüfen. habe auxh an 3. gedacht. da mit Files das funktionierte. erst als ich das weg lies gings nicht mehr.
 
Also das Problem liegt bei der Umwandlung des verschluesselten byte[] in ein String und anschließend wieder zurück. Da habe ich dann auf mal etwas anderes (fast identisch, aber im ganzen Array (128) sind 5 Stellen unterschiedlich).

Jetzt lass ich das weg und nutze direkt byte[].
 
Du kannst eben nicht jedes Byte in einen Unicode-Char umwandeln, manches wäre dann eben eine nicht standartkonforme Unicode-Bytefolge -> Char wird vermutlich verworfen

Solltest du unbedingt die Char-Serializierung brauchen, kannst du base64 nutzen, das wurde für sowas geschaffen.
 
Nee brauch ich nun doch nicht unbedingt.

Ich dachte halt wenn ich ein Bytearray mit einem Encoding in ein String mache, dann müsste ich den String mit dem gleichen Encoding in das gleiche Bytearray wieder bekommen.

Ich nutze jetzt die Bytearrays
 
So jetzt habe ich ein weiteres Problem, wie ich festgestellt habe kann ich nur eine Bestimmte Länge Verschlüsseln.

Ich dachte ich kann damit eine beliebige Länge verschlüsseln, argh.

Richtig, das es nur geht in dem ich Texte mit Symetrischer Verschlüsselung verschlüssel und den Schlüssel dann mit der Asymetrischen verschlüssel!?

Oder geht es doch auch mit langen Texten und dem Asymetrischen Verfahren?
 
Das normale RSA kann nur bestimmte Längen verschlüsseln, korrekt. Die Nachricht, dargestellt als Zahl m, muss kleiner sein als n = p * q, also die beiden Primzahlen.
Es gibt RSA-Abwandlungen für unendlich lange Nachrichten indem RSA zu einer Block- oder Stromchiffre wird, erinnere mich nimmer genau dran. Ist aber auch kaum praxisrelevant weil man ein zufälliges Passwort erzeugt, die Nachricht mit einer Blockchiffre und dem zufälligen Passwort verschlüsselt (z.B. AES) und dann das Passwort mit RSA verschlüsselt, nennt sich hybride Verschlüsselung.