2017-05-03 68 views
-1

這是我的AES實現代碼。當字符串被傳遞時,它成功地加密字符串。但是當我嘗試使用上述方法將字節[]轉換爲sting時,它會給出錯誤。並且它不會執行解密。接下來在控制檯窗口中返回null的所有值。 以下是屏幕上的錯誤: 錯誤:填充無效,無法刪除。當我嘗試在數據庫中插入值時發生此錯誤。當試圖檢索空值時會得到回報,我該怎麼辦?AES執行問題

namespace AES_Implmentatio 
{ 
class Program 
{ 
    static void Main(string[] args) // write public in start 
    { 
     try 
     { 
      string original = "Here is some data to encrypt!"; 


      using (AesManaged myAes = new AesManaged()) 
      { 
       //byte[] cipherbytes = System.Text.ASCIIEncoding.Default.GetBytes(encypted); 
       //string result = Encoding.ASCII.GetString(encrypted); 

       Console.WriteLine("Original: {0}", original); 
       byte[] encrypted = EncryptStringToBytes_Aes(original, myAes.Key, myAes.IV); 
       string result1 = Encoding.ASCII.GetString(encrypted); // Not showing the results 
       Console.WriteLine("Encypted Data", result1); 

       byte[] cipherbytes = System.Text.ASCIIEncoding.Default.GetBytes(result1); 
       string roundtrip = DecryptStringFromBytes_Aes(cipherbytes, myAes.Key, myAes.IV); 



      } 

     } 
     catch (Exception e) 
     { 
      Console.WriteLine("Error: {0}", e.Message); 
     } 
     Console.ReadLine(); 
    } 
    static byte[] EncryptStringToBytes_Aes(string plainText, byte[] Key, byte[] IV) 
    { 
     // Check arguments. 
     if (plainText == null || plainText.Length <= 0) 
      throw new ArgumentNullException("plainText"); 
     if (Key == null || Key.Length <= 0) 
      throw new ArgumentNullException("Key"); 
     if (IV == null || IV.Length <= 0) 
      throw new ArgumentNullException("IV"); 
     byte[] encrypted; 
     // Create an AesManaged object 
     // with the specified key and IV. 
     using (AesManaged aesAlg = new AesManaged()) 
     { 
      aesAlg.Key = Key; 
      aesAlg.IV = IV; 

      // Create a decrytor to perform the stream transform. 
      ICryptoTransform encryptor = aesAlg.CreateEncryptor(aesAlg.Key, aesAlg.IV); 

      // Create the streams used for encryption. 
      using (MemoryStream msEncrypt = new MemoryStream()) 
      { 
       using (CryptoStream csEncrypt = new CryptoStream(msEncrypt, encryptor, CryptoStreamMode.Write)) 
       { 
        using (StreamWriter swEncrypt = new StreamWriter(csEncrypt)) 
        { 

         //Write all data to the stream. 
         swEncrypt.Write(plainText); 
        } 
        encrypted = msEncrypt.ToArray(); 
       } 
      } 
     } 


     // Return the encrypted bytes from the memory stream. 
     return encrypted; 

    } 

    static string DecryptStringFromBytes_Aes(byte[] cipherText, byte[] Key, byte[] IV) 
    { 
     // Check arguments. 
     if (cipherText == null || cipherText.Length <= 0) 
      throw new ArgumentNullException("cipherText"); 
     if (Key == null || Key.Length <= 0) 
      throw new ArgumentNullException("Key"); 
     if (IV == null || IV.Length <= 0) 
      throw new ArgumentNullException("IV"); 

     // Declare the string used to hold 
     // the decrypted text. 
     string plaintext = null; 

     // Create an AesManaged object 
     // with the specified key and IV. 
     using (AesManaged aesAlg = new AesManaged()) 
     { 
      aesAlg.Key = Key; 
      aesAlg.IV = IV; 

      // Create a decrytor to perform the stream transform. 
      ICryptoTransform decryptor = aesAlg.CreateDecryptor(aesAlg.Key, aesAlg.IV); 

      // Create the streams used for decryption. 
      using (MemoryStream msDecrypt = new MemoryStream(cipherText)) 
      { 
       using (CryptoStream csDecrypt = new CryptoStream(msDecrypt, decryptor, CryptoStreamMode.Read)) 
       { 
        using (StreamReader srDecrypt = new StreamReader(csDecrypt)) 
        { 

         // Read the decrypted bytes from the decrypting stream 
         // and place them in a string. 
         plaintext = srDecrypt.ReadToEnd(); 
        } 
       } 
      } 

     } 

     return plaintext; 

    } 
} 
} 
+0

的[?填充是無效的不能刪除(可能的複製http://stackoverflow.com/questions/8583112/padding-is-invalid-and-無法刪除) – dlatikay

回答

0

您不能將二進制加密數據轉換爲字符串。如果你想要一箇中間字符串,那麼你可以將數據轉換爲Base64和回來,否則會損壞:

  Console.WriteLine("Original: {0}", original); 
      byte[] encrypted = EncryptStringToBytes_Aes(original, myAes.Key, myAes.IV); 
      string result1 = Convert.ToBase64String(encrypted); //Convert binary data to base64 data 
      Console.WriteLine("Encypted Data", result1); 

      byte[] cipherbytes = Convert.FromBase64String(result1); // Convert base64 data to binary data 
      string roundtrip = DecryptStringFromBytes_Aes(cipherbytes, myAes.Key, myAes.IV); 
+0

有可能將base64string轉換爲純文本?如果是,那麼如何;如果現在如何,我可以將byte []字符串直接發送到SQL Server數據庫。 –

+0

Base64是一個字符串,我發佈的代碼已經做了你想要的。 – Gusman