2016-02-13 98 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