2016-02-13 93 views
-2

我用這個例子,從計算器: C# Encryption to PHP DecryptionC#加密的Rijndael 256

GENERATE FUNCTION:

public static void GenerateKeyIV(out string key, out string IV) 
    { 
     var rj = new RijndaelManaged() 
     { 
      Padding = PaddingMode.PKCS7, 
      Mode = CipherMode.CBC, 
      KeySize = 256, 
      BlockSize = 256, 
      //FeedbackSize = 256 
     }; 
     key = Convert.ToBase64String(rj.Key); 
     IV = Convert.ToBase64String(rj.IV); 
    } 

加密2 FUNCTION:

public static string Encrypt2(string prm_text_to_encrypt, string prm_key, string prm_iv) 
    { 
     var sToEncrypt = prm_text_to_encrypt; 

     var rj = new RijndaelManaged() 
     { 
      Padding = PaddingMode.PKCS7, 
      Mode = CipherMode.CBC, 
      KeySize = 256, 
      BlockSize = 256, 
      //FeedbackSize = 256 
     }; 

     var key = Encoding.ASCII.GetBytes(prm_key); 
     var IV = Encoding.ASCII.GetBytes(prm_iv); 
     //var key = Convert.FromBase64String(prm_key); 
     //var IV = Convert.FromBase64String(prm_iv); 

     var encryptor = rj.CreateEncryptor(key, IV); 

     var msEncrypt = new MemoryStream(); 
     var csEncrypt = new CryptoStream(msEncrypt, encryptor, CryptoStreamMode.Write); 

     var toEncrypt = Encoding.ASCII.GetBytes(sToEncrypt); 

     csEncrypt.Write(toEncrypt, 0, toEncrypt.Length); 
     csEncrypt.FlushFinalBlock(); 

     var encrypted = msEncrypt.ToArray(); 

     return (Convert.ToBase64String(encrypted)); 
    } 

主程序:

 Enc2.GenerateKeyIV(out key, out iv); 
     string encrypted_url = Enc2.Encrypt2("test tekst todo",key,iv); 
     Console.WriteLine(encrypted_url); 

==> IV = cCJNWmwOtIBg6zM7Mz/JQV/lcauNMWf50nQk1ZiEKZ4 =

==>鍵= gNDiEqWk7aGhj1 + A2EURW5CPurxHPcfy3F2FTa4peC0 =

==> System.Security.Cryptography.CryptographicException:指定的初始化向量(IV)不匹配該算法的塊大小。

==>關鍵和iv似乎正確生成,我不明白爲什麼我收到此錯誤。

+0

有你有它。您將密鑰和IV編碼爲Base64,但將其解碼爲ASCII。 –

回答

0

檢查您的加密方法Enc2.Encrypt2()。它可能會使用與您在IV生成方法中指定的塊大小不同的塊大小。

UPDATE:

這樣做:

public static string Encrypt2(string prm_text_to_encrypt, string prm_key, string prm_iv) 
{ 
     var sToEncrypt = prm_text_to_encrypt; 

     var rj = new RijndaelManaged() 
     { 
      Padding = PaddingMode.PKCS7, 
      Mode = CipherMode.CBC, 
      KeySize = 256, 
      BlockSize = 256, 
      //FeedbackSize = 256 
     }; 

     var key = Convert.FromBase64String(prm_key); 
     var IV = Convert.FromBase64String(prm_iv); 

     var encryptor = rj.CreateEncryptor(key, IV); 

     var msEncrypt = new MemoryStream(); 
     var csEncrypt = new CryptoStream(msEncrypt, encryptor, CryptoStreamMode.Write); 

     var toEncrypt = Encoding.ASCII.GetBytes(sToEncrypt); 

     csEncrypt.Write(toEncrypt, 0, toEncrypt.Length); 
     csEncrypt.FlushFinalBlock(); 

     var encrypted = msEncrypt.ToArray(); 

     return (Convert.ToBase64String(encrypted)); 
} 
+0

也修復你的Enc2.Encrypt2()方法調用,你使用的是「iv」小寫,其中你的變量是大寫(IV) – 2016-02-13 12:38:48

+0

完美工作,但主要區別是什麼? Convert.FromBase64string?! – RBILDER

+0

是的,正好:P。在你的生成算法中,你使用base64編碼值,所以你需要將它們轉換回來使用它們。 – 2016-02-13 12:42:15