2016-08-27 2 views
1

Ich machte ein Verschlüsselungsprogramm mit Rijndael in C# nach dem Anschauen eines Videos in youtube.Es ist sehr einfach.Wie ein Wort zu entschlüsseln, die mehr als 16 Buchstaben in Rijndael Verschlüsselung haben

Interface picture Ich kann 64-Bit- und 128-Bit-Schlüssel eingeben. 192-Bit-Schlüssel sind jedoch nicht erlaubt (Warum?).

Und wenn ich 64-Bit-Schlüssel verwenden, wenn ich ein Wort verschlüsseln und versuchen, es zurück zu entschlüsseln, es entschlüsselt nur Wort mit Zeichenanzahl < = 16. Es ist die Anzahl der Zeichen mehr als 16 Fehlermeldungen ausgelöst "Padding ist Ungültig und kann nicht entfernt werden ".

Das gleiche gilt für einen 128-Bit-Schlüssel. Nur das Wort mit der Zeichenanzahl < = 32 wird zurück entschlüsselt. Ansonsten wird dieselbe Fehlermeldung angezeigt.

Hier ist eine sommerliche eine klare Sicht auf die Frage für Verschlüsselung

// need using System.Security.Cryptography; 
// using System.IO; 
public Form1() 
{ 
    InitializeComponent(); 
    desObj = Rijndael.Create(); 
} 

string cipherData; 
byte[] chipherbytes; 
byte[] plainbyte; 
byte[] plainbyte2; 
byte[] plainkey;     

SymmetricAlgorithm desObj; 

private void button2_Click(object sender, EventArgs e) 
{ 

    try 
    { 

     cipherData = textBox1.Text; 
     plainbyte = Encoding.ASCII.GetBytes(cipherData); 
     plainkey = Encoding.ASCII.GetBytes(textBox4.Text); 
     desObj.Key = plainkey; 
     //choose any method 
     desObj.Mode = CipherMode.CBC; 
     desObj.Padding = PaddingMode.PKCS7; 
     MemoryStream ms = new MemoryStream(); 
     CryptoStream cs = new CryptoStream(ms, desObj.CreateEncryptor(), CryptoStreamMode.Write); 
     cs.Write(plainbyte, 0, plainbyte.Length); 
     cs.Close(); 
     chipherbytes = ms.ToArray(); 
     ms.Close(); 
     textBox2.Text = Encoding.ASCII.GetString(chipherbytes); 
    } 
    catch(Exception ex) 
    { 
     MessageBox.Show(ex.Message); 
    } 
} 

und der decyption Code ist

Problem Summery picture Hier ist der Code zu nehmen

private void button3_Click(object sender, EventArgs e) 
{ 
    try 
    { 

     MemoryStream ms1 = new MemoryStream(chipherbytes); 
     CryptoStream cs1 = new CryptoStream(ms1, desObj.CreateDecryptor(), CryptoStreamMode.Read); 
     cs1.Read(chipherbytes, 0, chipherbytes.Length); 
     plainbyte2 = ms1.ToArray(); 
     cs1.Close(); 
     ms1.Close(); 
     textBox3.Text = Encoding.ASCII.GetString(plainbyte2);  

    } 
    catch(Exception ex) 
    { 
     MessageBox.Show(ex.Message); 
    } 
} 

Antwort

0

Ciphertext beliebiger Bytes besteht die keine gültige ASCII-Codierung bilden müssen. Wenn einige nicht druckbare ASCII-Zeichen vorhanden sind, werden sie bei Verwendung auf diese Weise nicht gedruckt: Encoding.ASCII.GetString(chipherbytes).

Sie müssen den Chiffretext mit etwas wie Base64 oder Hex kodieren, die den verschlüsselten Chiffretext größer machen, aber perfekt als gedruckte Zeichenfolge darstellbar ist.


Weitere Überlegungen:

  • CBC-Modus benötigt einen Initialisierungsvektor (IV) und da Sie keine IV einstellen, wird es für Sie generiert. Das Problem ist, dass Sie während der Entschlüsselung dieselbe IV benötigen. Dieser Code funktioniert, weil Sie die gleiche desObj für die Verschlüsselung und Entschlüsselung verwenden und es enthält die gleiche IV, aber das wird nicht funktionieren, wenn Sie anfangen, Chiffretext zu kopieren.
    Die IV soll nicht geheim sein. Ein üblicher Weg besteht darin, sie zusammen mit dem Chiffretext weiterzugeben, indem man die IV davor schreibt und sie vor der Entschlüsselung abschneidet.

  • Sie haben keine Integritätsprüfung. Es ist besser, Ihre Chiffrate zu authentifizieren, so dass Angriffe wie eine padding oracle attack nicht möglich sind und Sie erkennen können, ob der Chiffretext (böswillig) manipuliert wurde oder der Schlüssel falsch eingegeben wurde. Dies kann mit authentifizierten Modi wie GCM oder EAX oder mit einem encrypt-then-MAC Schema geschehen.

  • Rijndael unterstützt häufig Schlüsselgrößen von 128, 192 und 256 Bit. Ein Byte hat normalerweise 8 Bits, also 16, 24 und 32 Byte.

  • Schlüssel werden vom Benutzer nicht eingegeben, da sie normalerweise nicht von zufälligem Rauschen und von bestimmter Länge unterschieden werden können. Es ist besser, wenn Benutzer ein Kennwort eingeben und den Schlüssel daraus mit etwas wie PBKDF2, bcrypt, scrypt oder Argon2 unter Verwendung eines hohen Iterationszählers/Kostenfaktors ableiten.

+0

Können Sie bitte die Stellen korrigieren, an denen ich Fehler gemacht habe? Es wäre eine große Hilfe! –

+0

Warum? Haben Sie Probleme mit 'Convert.ToBase64String' und' Convert.FromBase64String'? Ich kann Ihnen bei den anderen Fragen nicht helfen, denn das wäre zu viel Arbeit. Warum verwenden Sie nicht einfach [RNCryptor] (https://github.com/RNCryptor/RNCryptor-cs), was all diese Probleme für Sie löst und sicher ist? –

+0

Ich habe erwähnt, ich habe das von youtube kopiert! Ich habe wirklich keine Ahnung von Kryptographie. Das sind die Gründe. Aber ich brauche dieses Stück Code, um für eines meiner Projekte richtig zu funktionieren! :) –

Verwandte Themen