2010-10-15 129 views
3

我編碼與具體要求的加密/解密AES實用程序: -AES/CBC/PKCS7 -256位密鑰爲base64字符串提供作爲 -IV base64字符串AESManaged加密/解密 - 填充是無效的不能刪除

所以我試圖使用相同的密鑰和IV加密/解密此字符串「123456789」。加密運行正常,但試圖解密加密的字符串時,我得到「填充無效且無法移除」異常。我錯過了什麼?

//這是調用的測試方法

 public void Test_AESEncryption_Decrypt() 
    { 
     try 
     { 
      var encoding = Encoding.ASCII; 
      var key = encoding.GetString(Convert.FromBase64String("JVSwvtTHhGHKmH7HIj5clsfQRXGg9ZZ0cOojoAPcGg0=")); 
      var iv = encoding.GetString(Convert.FromBase64String("IgEfBiIIHBANIRccFhwJDg==")); 
      var strtoencrypt = "123456789"; 
      var encrypted = AESEncryption.Encrypt(encoding,strtoencrypt, key, iv, CipherMode.CBC, PaddingMode.PKCS7,128); 


      var decrypted = AESEncryption.Decrypt(encoding,encoding.GetString(encrypted), key, iv, CipherMode.CBC, PaddingMode.PKCS7,128); 

      Assert.AreEqual(strtoencrypt, decrypted); 
     } 
     catch (Exception ex) 
     { 
      Assert.Fail(ex.Message); 
     } 

    } 

//這是我的工具類:

公共靜態類AESEncryption {

public static byte[] Encrypt(Encoding encoding, string strtoencrypt, string key, string iv, CipherMode mode, PaddingMode padding, int blocksize){ 

     var mstream = new MemoryStream(); 
     using (var aes = new AesManaged()) 
     { 
      var keybytes = encoding.GetBytes(key); 

      aes.BlockSize = blocksize; 
      aes.KeySize = keybytes.Length * 8; 
      aes.Key = keybytes; 
      aes.IV = encoding.GetBytes(iv); 
      aes.Mode = mode; 
      aes.Padding = padding; 


      using (var cstream = new CryptoStream(mstream, aes.CreateEncryptor(aes.Key, aes.IV), CryptoStreamMode.Write)) 
      { 
       var bytesToEncrypt = encoding.GetBytes(strtoencrypt); 
       cstream.Write(bytesToEncrypt, 0, bytesToEncrypt.Length); 
       cstream.FlushFinalBlock(); 
      } 

     } 

     var encrypted = mstream.ToArray(); 
     return encrypted; 
    } 



    public static string Decrypt(Encoding encoding,string strencrypted, string key, string iv, CipherMode mode, PaddingMode padding, int blocksize) 
    { 

     var decrypted = ""; 

     using (var aes = new AesManaged()) 
     { 
      var keybytes = encoding.GetBytes(key); 

      aes.BlockSize = blocksize; 
      aes.KeySize = keybytes.Length * 8; 
      aes.Key = keybytes; 
      aes.IV = encoding.GetBytes(iv); 
      aes.Mode = mode; 
      aes.Padding = padding; 

      using (var mstream = new MemoryStream(encoding.GetBytes(strencrypted))) 
      { 
       using (var cstream = new CryptoStream(mstream, aes.CreateDecryptor(aes.Key, aes.IV), CryptoStreamMode.Read)) 
       { 
        using (var sreader = new StreamReader(cstream)) 
        { 
         decrypted = sreader.ReadToEnd(); 
        } 
       } 
      } 

     } 

     return decrypted; 
    } 

} 

回答

0

您認爲

Encoding.ASCII.GetBytes(Encoding.ASCII.GetString(x))==x 

但對於任意字節陣列來說並不是這樣。

如果您確實需要將字節數組編碼爲字符串,則應該使用Base-64。

2

當您的密鑰由於編碼而到達加密方法時,您的密鑰長度爲56個字節,但如果您使用AesManaged,AesManaged只接受16字節(128位)密鑰並且相同IV。

如果你想使用256位密鑰加密,那麼你需要切換到RijndaelManaged。 Aes規範不支持可變密鑰長度。它只使用固定密鑰長度(128,192或256位)。

如果您需要可變密鑰長度,那麼您可能需要查看支持8-128位之間任意值的密鑰長度的RC2。

希望這會有所幫助。

2

如果要使用256位密鑰加密 ,那麼你需要切換到 RijndaelManaged的。 Aes規範 不支持可變密鑰長度。 它只使用固定密鑰長度(128, 192或256位)。

據我所知,AES只支持128位的固定塊大小,但你仍然可以使用256位密鑰。所以如果你對128位的塊大小有興趣,你仍然可以堅持aesmanaged類。

糾正我,如果我錯了。

相關問題