2017-07-21 40 views
0

我使用AES - Standard SymmetricAlgorithm,用於加密和解密字符串。字符串加密成功,但是當它涉及到解密編譯器給我的例外即錯誤AES - 標準SymmetricAlgorithm,「填充是無效的不能刪除」

「填充是無效的不能刪除」。

我已經創建了一個演示控制檯應用程序進行測試,請看下面的代碼。

Main方法:

static void Main(string[] args) 
{ 
    var content = "5466160057107706"; 
    var key = "E546C8DF278CD5931069B522E695D4F2"; 

    var encrypted = EncryptString(content, key); 
    Console.WriteLine(encrypted); 
    var decrypted = DecryptString(encrypted, key); 
    Console.WriteLine(decrypted); 
    Console.ReadLine(); 
} 

方法增加了對加密:

public static string EncryptString(string text, string keyString) 
{ 
    var key = Encoding.UTF8.GetBytes(keyString); 
    using (var aesAlg = Aes.Create()) 
    { 
     using (var encryptor = aesAlg.CreateEncryptor(key, aesAlg.IV)) 
     { 
      using (var msEncrypt = new MemoryStream()) 
      { 
       using (var csEncrypt = new CryptoStream(msEncrypt, encryptor, CryptoStreamMode.Write)) 
       using (var swEncrypt = new StreamWriter(csEncrypt)) 
       { 
        swEncrypt.Write(text); 
       } 
       var iv = aesAlg.IV; 
       var decryptedContent = msEncrypt.ToArray(); 
       var result = new byte[iv.Length + decryptedContent.Length]; 
       Buffer.BlockCopy(iv, 0, result, 0, iv.Length); 
       Buffer.BlockCopy(decryptedContent, 0, result, iv.Length, decryptedContent.Length); 
       return Convert.ToBase64String(result); 
      } 
     } 
    } 
} 

方法添加用於解密:

public static string DecryptString(string cipherText, string keyString) 
{ 
    var fullCipher = Convert.FromBase64String(cipherText); 
    var iv = new byte[16]; 
    var cipher = new byte[16]; 
    Buffer.BlockCopy(fullCipher, 0, iv, 0, iv.Length); 
    Buffer.BlockCopy(fullCipher, iv.Length, cipher, 0, iv.Length); 
    var key = Encoding.UTF8.GetBytes(keyString); 
    using (var aesAlg = Aes.Create()) 
    { 
     using (var decryptor = aesAlg.CreateDecryptor(key, iv)) 
     { 
      string result; 
      using (var msDecrypt = new MemoryStream(cipher)) 
      { 
       using (var csDecrypt = new CryptoStream(msDecrypt, decryptor, CryptoStreamMode.Read)) 
       { 
        using (var srDecrypt = new StreamReader(csDecrypt)) 
        { 
         result = srDecrypt.ReadToEnd(); 
        } 
       } 
      } 
      return result; 
     } 
    } 
} 

以下是錯誤管理單元,其發生在DecryptString()方法:

enter image description here

有什麼建議,該如何解決這個問題?

+0

變量名可以是有益的或不是:'decryptedContent = msEncrypt',不是? – zaph

回答

2

線索: var cipher = new byte[16];

爲什麼你假設你的密碼是隻有16字節?如果它不止於此呢?

事實上,如果我運行這個程序和調試,我看到你的密碼是32個字節。

因此,下面兩度的變化使得它的工作:

var cipher = new byte[32]; 

Buffer.BlockCopy(fullCipher, iv.Length, cipher, 0, cipher.Length); 

在任何情況下,你需要動態地確定你的密碼的大小。

+0

謝謝,它的工作原理。 –

+0

爲了澄清他人,上面的加密代碼使用默認的aesAlg.IV值,它是一個16字節的隨機數組。因此,您將解密更改爲: 'var iv = new byte [16]; var cipher = new byte [fullCipher.Length - 16]; Buffer.BlockCopy(fullCipher,0,iv,0,iv.Length); Buffer.BlockCopy(fullCipher,iv.Length,cipher,0,cipher.Length);' – CloudPicnic

相關問題