2016-04-22 9 views
0

AESアルゴリズムを使用してサンプルテキストを暗号化および復号化するためのコードを作成しました。最初のボタンをクリックすると、textbox1に表示される文字列を暗号化し、2回目のボタンをクリックすると、復号化された値がtextbox2に表示されます。CESのAESアルゴリズムエラー

これはそのためのコードです:復号化が正常に動作している]をクリックし、最初のボタンのために

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; 
    } 
} 

。しかし、2番目のボタンをクリックすると、復号化されたテキストにいくつかの迷惑な文字が表示されます。

が、これは私が静的としてencryptedBytesを作っ把握し、私は2番目のボタンをクリックしたときにそれを再利用し、まだジャンク値と同じ出力します。私は最初のボタンをクリックしたときに、同じ入力が正しい出力をどのように与えるのだろうかと思います。

誰でも私にこれを整理するのを助けることができますか?私はあなたがしようとしているものの作業コードを持っています

+0

だから、あなたは入力を持っていて、あなたもコードを持っていることを期待しています..あなたが私たちから期待しているものは何ですか?何かエラーがありますか? –

+0

両方のボタンは解読用ですか? * "ボタンをクリックすると復号化が正常に機能しています" * –

+0

最初のボタンをクリックすると、復号化がうまくいきます。 2番目のボタンをクリックすると問題が発生します。最初のボタンは暗号化用で、2番目のボタンは復号化用です。最初のボタンにコードを解読するロジックを書いてもうまくいきます。 –

答えて

1

は、ルック

  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); 
      } 

・ホープこのヘルプを持っています。

+0

これでどのようにkeysizeとブロックサイズについて言及できますか? –

0

バグがコードのあなたの最初の行にある:あなたがbytesToEncryptを調べる場合

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

、あなたはそれがすべてゼロの配列が含まれています:

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 

あなたは、すべてゼロを暗号化します。

これを復号化すると、すべてゼロが戻されます。

あなたがC#フィドルに、それhereをいじることができます。