2016-04-22 26 views
0

Ich schrieb einen Code zum Verschlüsseln und Entschlüsseln von Beispieltext mit dem AES-Algorithmus. Wenn ich auf die erste Schaltfläche klicke, möchte ich die Zeichenfolge verschlüsseln, die in der Textbox1 angezeigt wird, und für den zweiten Klick auf die Schaltfläche muss der entschlüsselte Wert in Textfeld2 angezeigt werden. AES-Algorithmus Fehler in C#

Dies ist der Code dafür:

public partial class _Default : Page 
{ 
    public byte[] key = null; public byte[] iv = null; public byte[] bytesToEncrypt = null; public static byte[] encryptedBytes = null; public byte[] decryptedBytes = null; 

    protected void Page_Load(object sender, EventArgs e) 
    { 
     RijndaelManaged aesAlg = new RijndaelManaged(); 
     aesAlg.GenerateKey(); 
     aesAlg.GenerateIV(); 
     key = aesAlg.Key; 
     iv = aesAlg.IV; 
    } 

    protected void Button1_Click(object sender, EventArgs e) 
    { 
     // original bytes 
     bytesToEncrypt = new byte[TextBox2.Text.ToString().Length * sizeof(char)]; 

     encryptedBytes = CryptoAes.Encrypt(bytesToEncrypt, key, iv); 
     TextBox1.Text = Convert.ToBase64String(encryptedBytes); 

     byte[] bytesToEncrypt1 = new byte[TextBox2.Text.Length]; 
     decryptedBytes = CryptoAes.Decrypt(encryptedBytes, key, iv);//working here.  
    } 

    protected void Button2_Click(object sender, EventArgs e) 
    { 
     var s = Convert.FromBase64String(TextBox1.Text);      
     decryptedBytes = CryptoAes.Decrypt(encryptedBytes, key, iv); 
     TextBox2.Text = System.Text.Encoding.Unicode.GetString(decryptedBytes);//not working 
    } 
} 

internal sealed class CryptoAes 
{ 
    public static byte[] Encrypt(byte[] data, byte[] key, byte[] iv) 
    { 
     byte[] encryptedData = null; 

     if (data == null) 
      throw new ArgumentNullException("data"); 

     if (data == key) 
      throw new ArgumentNullException("key"); 

     if (data == iv) 
      throw new ArgumentNullException("iv"); 

     using (RijndaelManaged aesAlg = new RijndaelManaged()) 
     { 
      aesAlg.Key = key; 
      aesAlg.IV = iv; 
      aesAlg.Padding = PaddingMode.Zeros; 
      ICryptoTransform encryptor = aesAlg.CreateEncryptor(aesAlg.Key, aesAlg.IV); 
      encryptedData = encryptor.TransformFinalBlock(data, 0, data.Length); 
     } 

     return encryptedData; 
    } 

    public static byte[] Decrypt(byte[] data, byte[] key, byte[] iv) 
    { 
     byte[] decryptedData = null; 

     if (data == null) 
      throw new ArgumentNullException("data"); 

     if (data == key) 
      throw new ArgumentNullException("key"); 

     if (data == iv) 
      throw new ArgumentNullException("iv"); 

     using (RijndaelManaged aesAlg = new RijndaelManaged()) 
     { 
      aesAlg.Key = key; 
      aesAlg.IV = iv; 
      aesAlg.Padding = PaddingMode.Zeros; 
      ICryptoTransform decryptor = aesAlg.CreateDecryptor(aesAlg.Key, aesAlg.IV); 
      decryptedData = decryptor.TransformFinalBlock(data, 0, data.Length); 

     } 

     return decryptedData; 
    } 
} 

für die erste Schaltfläche klicken Sie auf die Entschlüsselung funktioniert prima. Aber wenn ich auf die zweite Schaltfläche klicke, zeigt der entschlüsselte Text einige Junk-Zeichen.

Um dies herauszufinden, habe ich die verschlüsselten Bytes als statische und wiederverwendung, wenn ich auf die zweite Schaltfläche, aber immer noch die gleiche Ausgabe mit Junk-Werten. Ich frage mich, wie die gleiche Eingabe die richtige Ausgabe liefert, wenn ich auf die erste Schaltfläche klicke.

Kann mir jemand helfen, das zu klären?

+0

Also, Sie haben Eingang, haben Ausgang erwartet, haben Sie auch Code .. dann, was wird die Hilfe sein, die Sie von uns erwarten? Gibt es einen Fehler? –

+0

Beide Tasten sind zum Entschlüsseln? * "klicken Sie auf die Entschlüsselung funktioniert einwandfrei" * –

+0

ersten Klick auf die Schaltfläche, die Entschlüsselung funktioniert gut. Problem ist mit dem zweiten Knopf klicken. Die erste Schaltfläche dient zum Verschlüsseln und die zweite zum Entschlüsseln. Wenn ich die Logik für die Entschlüsselung des Codes auch in der ersten Taste schreibe, funktioniert es gut. –

Antwort

1

ich einen funktionierenden Code von habe, was Sie versuchen einen Blick

  internal const string Inputkey = "560A18CD-6346-4CF0-A2E8-671F9B6B9EA9"; 

      public static string EncryptRijndael(string text, string salt) 
      { 
       if (string.IsNullOrEmpty(text)) 
        throw new ArgumentNullException("text"); 

       var aesAlg = NewRijndaelManaged(salt); 

       var encryptor = aesAlg.CreateEncryptor(aesAlg.Key, aesAlg.IV); 
       var msEncrypt = new MemoryStream(); 
       using (var csEncrypt = new CryptoStream(msEncrypt, encryptor, CryptoStreamMode.Write)) 
       using (var swEncrypt = new StreamWriter(csEncrypt)) 
       { 
        swEncrypt.Write(text); 
       } 

       return Convert.ToBase64String(msEncrypt.ToArray()); 
      } 


      public static bool IsBase64String(string base64String) 
      { 
       base64String = base64String.Trim(); 
       return (base64String.Length % 4 == 0) && 
         Regex.IsMatch(base64String, @"^[a-zA-Z0-9\+/]*={0,3}$", RegexOptions.None); 

      } 


      public static string DecryptRijndael(string cipherText, string salt) 
      { 
       if (string.IsNullOrEmpty(cipherText)) 
        throw new ArgumentNullException("cipherText"); 

       if (!IsBase64String(cipherText)) 
        throw new Exception("The cipherText input parameter is not base64 encoded"); 

       string text; 

       var aesAlg = NewRijndaelManaged(salt); 
       var decryptor = aesAlg.CreateDecryptor(aesAlg.Key, aesAlg.IV); 
       var cipher = Convert.FromBase64String(cipherText); 

       using (var msDecrypt = new MemoryStream(cipher)) 
       { 
        using (var csDecrypt = new CryptoStream(msDecrypt, decryptor, CryptoStreamMode.Read)) 
        { 
         using (var srDecrypt = new StreamReader(csDecrypt)) 
         { 
          text = srDecrypt.ReadToEnd(); 
         } 
        } 
       } 
       return text; 
      } 

      private static RijndaelManaged NewRijndaelManaged(string salt) 
      { 
       if (salt == null) throw new ArgumentNullException("salt"); 
       var saltBytes = Encoding.ASCII.GetBytes(salt); 
       var key = new Rfc2898DeriveBytes(Inputkey, saltBytes); 

       var aesAlg = new RijndaelManaged(); 
       aesAlg.Key = key.GetBytes(aesAlg.KeySize/8); 
       aesAlg.IV = key.GetBytes(aesAlg.BlockSize/8); 

       return aesAlg; 
      } 

      protected void Button1_Click(object sender, EventArgs e) 
      { 
       TextBox1.Text = EncryptRijndael(TextBox1.Text, Inputkey); 
      } 
      protected void Button2_Click(object sender, EventArgs e) 
      { 
       TextBox2.Text = DecryptRijndael(TextBox1.Text, Inputkey); 
      } 

Hoffnung Diese Hilfe.

+0

Wie kann ich Keysize und Blocksize dabei erwähnen? –

0

Der Fehler ist in der ersten Zeile des Codes:

// original bytes 
bytesToEncrypt = new byte[TextBox2.Text.ToString().Length * sizeof(char)]; 

Wenn Sie inspizieren bytesToEncrypt, finden Sie es eine Reihe von Nullen enthält:

Name    Value   Type 
bytesToEncrypt byte[]   System.Byte[] 
├── [0]   0    byte 
├── [1]   0    byte 
├── [2]   0    byte 
├── [3]   0    byte 
├── [4]   0    byte 
├── [5]   0    byte 
├── [7]   0    byte 
├── [8]   0    byte 
├── [9]   0    byte 
├── [10]   0    byte 
├── [11]   0    byte 
└── [12]   0    byte 

Sie dann alle Nullen verschlüsseln.

Und wenn Sie es entschlüsseln, gibt es Ihnen alle Nullen zurück.

Sie können damit umgehen here, auf C# Fiddle.