2016-06-17 50 views
-1

Ok, also habe ich ein kleines Programm, das ich in C# winforms eingebaut habe, das im Grunde Sicherheitskryptologie verwendet und ich versuche herauszufinden, was ich falsch im Code getan habe. Es wird die Textdatei gut verschlüsseln. Wenn ich die verschlüsselte Datei jedoch in das Textfeld einfüge und Decrypt drücke, wird die Datei nicht entschlüsselt, sondern erneut verschlüsselt.Verschlüsselung und Entschlüsselung einer Textdatei

Ich frage mich, ob ich etwas falsch mit dem Code gemacht habe.

namespace Encrypted 
{ 
    class Encryptor 
    { 
     public static string IV = "1a1a1a1a1a1a1a1a"; 
     public static string Key = "1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a"; 

     public static string Encrypt (string decrypted) 
     { 
      byte[] textbytes = ASCIIEncoding.ASCII.GetBytes(decrypted); 
      AesCryptoServiceProvider endec = new AesCryptoServiceProvider(); 
      endec.BlockSize = 128; 
      endec.KeySize = 256; 
      endec.IV = ASCIIEncoding.ASCII.GetBytes(IV); 
      endec.Key = ASCIIEncoding.ASCII.GetBytes(Key); 
      endec.Padding = PaddingMode.PKCS7; 
      endec.Mode = CipherMode.CBC; 
      ICryptoTransform icrypt = endec.CreateEncryptor(endec.Key, endec.IV); 
      byte[] enc = icrypt.TransformFinalBlock(textbytes, 0, textbytes.Length); 
      icrypt.Dispose(); 
      return Convert.ToBase64String(enc); 
     } 

     public static string Decrypted(string encrypted) 
     { 
      byte[] textbytes = ASCIIEncoding.ASCII.GetBytes(encrypted); 
      AesCryptoServiceProvider endec = new AesCryptoServiceProvider(); 
      endec.BlockSize = 128; 
      endec.KeySize = 256; 
      endec.IV = ASCIIEncoding.ASCII.GetBytes(IV); 
      endec.Key = ASCIIEncoding.ASCII.GetBytes(Key); 
      endec.Padding = PaddingMode.PKCS7; 
      endec.Mode = CipherMode.CBC; 
      ICryptoTransform icrypt = endec.CreateEncryptor(endec.Key, endec.IV); 
      byte[] enc = icrypt.TransformFinalBlock(textbytes, 0,  textbytes.Length); 
      icrypt.Dispose(); 
      return ASCIIEncoding.ASCII.GetString(enc); 
     } 
    } 
} 

Dies ist die Klasse oben und unten ist die Form1:

namespace Encrypted 
{ 
    public partial class Form1 : Form 
    { 
     public Form1() 
     { 
      InitializeComponent(); 
     } 

     private void btnEncrypt_Click(object sender, EventArgs e) 
     { 
      string dir = textBox1.Text; 
      Directory.CreateDirectory("data\\" + dir); 

      var sw = new StreamWriter("data\\" + dir + "data.ls"); 

      string enctxt = Encryptor.Encrypt(textBox1.Text); 

      sw.WriteLine(enctxt); 

      sw.Close(); 
     } 

     private void btnDecrypt_Click(object sender, EventArgs e) 
     { 
      string dir = textBox2.Text; 
      Directory.CreateDirectory("data\\" + dir); 

      var sw = new StreamWriter("data\\" + dir + "data.ls"); 

      string enctxt = Encryptor.Decrypted(textBox2.Text); 

      sw.WriteLine(enctxt); 

      sw.Close(); 
     } 
    } 

In der Decrypt-Taste muss ich Stream oder Stream verwenden. Sobald die verschlüsselte Datei in der Datei data.ls ist, kopiere ich sie und füge sie zum Entschlüsseln in das Textfeld ein. Es wird jedoch nicht entschlüsselt, es verschlüsselt die Datei nur erneut. Gibt es etwas, was ich falsch mache?

+0

Also sollte die 'Decrypted' Methode' CreateDecryptor' aufrufen (nicht 'CreateEncryptor'), richtig? –

+0

Nun, wenn ich den CreateDecryptor aufrufen, wird ein Fehler ausgegeben, der besagt, dass der Block kein vollständiger Block ist. – campnerd

+0

Das nächste offensichtlichste Problem ist, dass Sie nicht die gleiche Codierung für die verschlüsselte Zeichenfolge verwenden. Sie geben eine Basis-64-Zeichenfolge von encrypt zurück, aber Sie verwenden ASCII, wenn Sie in "Decrypted" codieren. Sie sollten mit 'Convert.FromBase64String' codieren, um' textbytes' zu erhalten. –

Antwort

2

Dies liegt daran, dass Sie die Decrypted() auch zum Verschlüsseln der Eingabedatei verwenden, indem Sie Encryptor erstellen. Es sollte eine Decryptor erstellen, um den Entschlüsselungsvorgang auszuführen. Diese Einzelwortänderung wird den Prozess umkehren. Die Klasse CreateDecryptor Method (Byte[], Byte[]) der Klasse AesCryptoServiceProvider erstellt ein symmetrisches AES-Decryptor-Objekt unter Verwendung des angegebenen Schlüssels und des Initialisierungsvektors (IV).

dh. Ändern Sie die folgende Zeile in der Decrypted() Methode,

ICryptoTransform icrypt = endec.CreateDecryptor(endec.Key, endec.IV); 

hier ein Referenzbeispiel aus MSDN ist und Sie können ein Arbeitsbeispiel here

+0

Wenn ich es so mache, wird dieser Fehler ausgelöst Eine nicht behandelte Ausnahme des Typs 'System.Security.Cryptography.CryptographicException' ist in System.Core.dll aufgetreten Weitere Informationen: Die Eingabedaten sind kein vollständiger Block. – campnerd

+0

Wenn ich es so benutze, wie ich es hatte, wirft es keine Fehler – campnerd

+0

das habe ich, ich habe es wie deine Antwort geändert, aber es funktioniert nicht. ICryptoTransform icrypt = endec.CreateDecryptor (endec.Key, endec.IV); – campnerd

0

Es ist nicht nur der Fehler nicht mit CreateDecryptor sehen. Sie müssen auch die Chiffretext-Zeichenfolge von base64 dekodieren, was Ihre Verschlüsselung zurückgibt.

Sie dies tun:

  1. nehmen Zeichenkette, dekodieren von ASCII zu-Text-Bytes

  2. Klartext Bytes nehmen, verschlüsseln Bytes Chiffre

  3. verschlüsselten Text Bytes nehmen, Konvertit base64 string

Dann tun Sie dies:

  1. nehmen Zeichenkette, dekodieren von ASCII auf Chiffre Bytes < - Ihr Fehler!

statt:

  1. take-String, dekodieren von Base64 zu Geheimtext-Bytes

  2. Chiffretext-Bytes nehmen, entschlüsseln, um Klartext-Bytes

  3. Klartextbytes nehmen, kodieren, um ASCII.

string -> Bytes -> verschlüsselter Bytes -> base64 -> verschlüsselte Bytes -> Bytes -> string

+0

Ok das macht jetzt mehr Sinn als das, was der andere gesagt hat .. Also im Grunde habe ich den Code richtig in der falschen Reihenfolge. Wenn ich nach Hause komme, werde ich sehen, welche Veränderungen ich vorgenommen habe. Dies funktioniert perfekt auf der Verschlüsselungsseite. Allerdings muss ich die richtige Reihenfolge für die Entschlüsselung eingeben. Ich dachte, ich hätte das gemacht. Ich nehme an, ich habe nicht genug Süßkartoffeln gegessen, als ich damit angefangen habe ... lol – campnerd

0

ich danach gesucht und machte ein Programm, das in Ordnung mit mir gearbeitet :) So. Diese ..

ist die Klasse

class Encryptor 
{ 
    public static string IV = "1a1a1a1a1a1a1a1a"; 
    public static string Key = "1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a13"; 

    public static string Encrypt(string decrypted) 
    { 
     byte[] textbytes = ASCIIEncoding.ASCII.GetBytes(decrypted); 
     AesCryptoServiceProvider endec = new AesCryptoServiceProvider(); 
     endec.BlockSize = 128; 
     endec.KeySize = 256; 
     endec.IV = ASCIIEncoding.ASCII.GetBytes(IV); 
     endec.Key = ASCIIEncoding.ASCII.GetBytes(Key); 
     endec.Padding = PaddingMode.PKCS7; 
     endec.Mode = CipherMode.CBC; 
     ICryptoTransform icrypt = endec.CreateEncryptor(endec.Key, endec.IV); 
     byte[] enc = icrypt.TransformFinalBlock(textbytes, 0, textbytes.Length); 
     icrypt.Dispose(); 
     return Convert.ToBase64String(enc); 
    } 

    public static string Decrypted(string encrypted) 
    { 
     byte[] textbytes = Convert.FromBase64String(encrypted); 
     AesCryptoServiceProvider endec = new AesCryptoServiceProvider(); 
     endec.BlockSize = 128; 
     endec.KeySize = 256; 
     endec.IV = ASCIIEncoding.ASCII.GetBytes(IV); 
     endec.Key = ASCIIEncoding.ASCII.GetBytes(Key); 
     endec.Padding = PaddingMode.PKCS7; 
     endec.Mode = CipherMode.CBC; 
     ICryptoTransform icrypt = endec.CreateDecryptor(endec.Key, endec.IV); 
     byte[] enc = icrypt.TransformFinalBlock(textbytes, 0, textbytes.Length); 
     icrypt.Dispose(); 
     return System.Text.ASCIIEncoding.ASCII.GetString(enc); 
    } 
} 

................................. ..

und dies ist die form`

 private void button1_Click(object sender, EventArgs e) 
    { 
     string dir = textBox1.Text; 
     Directory.CreateDirectory("data\\" + dir); 

     var sw = new StreamWriter("data\\" + dir + "data.ls"); 

     string enctxt = Encryptor.Encrypt(textBox1.Text); 

     sw.WriteLine(enctxt); 

     sw.Close(); 
    } 

    private void button2_Click(object sender, EventArgs e) 
    { 
     string dir = textBox2.Text; 

     StreamReader sr = new StreamReader(Application.StartupPath +"\\data\\"+ dir + "data.ls"); 
     string line = sr.ReadLine(); 

     textBox1.Text = Encryptor.Decrypted(Convert.ToString(line)); 
    } 

........................

Mit freundlichen Grüßen!

Verwandte Themen