使用Rijndael第2部分的跨平台(php到C#.NET)加密/解密

时间:2015-04-11 09:42:55

标签: c# php encryption rijndael rijndaelmanaged

< Original Code From Here>

我在谷歌搜索时遇到了这个帖子。然而,在尝试并进行调整之后,我遇到了一个障碍,希望有人可以帮助我。

  1. 上面的代码很好,但由于算法并不是每次都不进行IV更改所以非常有用,我尝试使用以下代码生成iv但是它一直说"指定的密钥不是此算法的有效大小。"在我的C#调试器中。

  2. 我也尝试从C#代码输出IV,在解码base 64字符串后,字符串长度从30变为31 2X ==>基本上只是出于某种原因波动。

  3. 我也想改变KEY,但由于与IV问题类似的原因而无法改变,所以希望有人可以帮我解决这个问题吗?

  4. (我已经从http://php.net/manual/en/function.mcrypt-encrypt.php尝试了以下内容,无法让它与C#协调工作,也许一旦我解决了IV问题,我就能解决这个问题还有吗?

      $key = pack('H*', "bcb04b7e103a0cd8b54763051cef08bc55abe029fdebae5e1d417e2ffb2a00a3"); )
    

    PHP ========================

    <?php
      $iv_size = mcrypt_get_iv_size(MCRYPT_RIJNDAEL_256, MCRYPT_MODE_CBC);
      $iv = mcrypt_create_iv($iv_size, MCRYPT_RAND);
      //$iv = "45287112549354892144548565456541";
      $key = "anjueolkdiwpoida";
    
      $text = "This is my encrypted message";
      $crypttext = mcrypt_encrypt(MCRYPT_RIJNDAEL_256, $key, $text, MCRYPT_MODE_CBC, $iv);
      $crypttext = urlencode($crypttext);
      $crypttext64=base64_encode($crypttext);
      print($crypttext64) . "\n<br/>";
      print(base64encode($iv)) . "\n<br/>";
    ?>
    

    C#========================

    string iv = Encoding.UTF8.GetString(Convert.FromBase64String("SOME IV STRING I COPY FROM BROSWER WITH ABOVE PHP LOADED"));
    string kyy = "anjueolkdiwpoida";
    //ciphertext is also SOME TXT STRING I COPIED FROM BROWSER WITH ABOVE PHP LOADED
    string plainText = ValidationControls.DecryptRJ256(cipherText, kyy, iv);
    
    
    
    public byte[] Decode(string str)
        {
            var decbuff = Convert.FromBase64String(str);
            return decbuff;
        }
    
        static public String DecryptRJ256(byte[] cypher, string KeyString, string IVString)
        {
            var sRet = "";
    
            var encoding = new UTF8Encoding();
            var Key = encoding.GetBytes(KeyString);
            var IV = encoding.GetBytes(IVString);
    
            using (var rj = new RijndaelManaged())
            {
                try
                {
                    rj.Padding = PaddingMode.PKCS7;
                    rj.Mode = CipherMode.CBC;
                    rj.KeySize = 256;
                    rj.BlockSize = 256;
                    rj.Key = Key;
                    rj.IV = IV;
                    var ms = new MemoryStream(cypher);
    
                    using (var cs = new CryptoStream(ms, rj.CreateDecryptor(Key, IV), CryptoStreamMode.Read))
                    {
                        using (var sr = new StreamReader(cs))
                        {
                            sRet = sr.ReadLine();
                        }
                    }
                }
                catch (Exception exc) { Console.WriteLine(exc.Message); App.Current.Shutdown(); }
                finally
                {
                    rj.Clear();
                }
            }
    
            return sRet;
        }
    

1 个答案:

答案 0 :(得分:0)

  1. 我意识到Base 64字符串的.NET解码真的很奇怪。当我调用DecryptRJ256()时,我通过一系列转换base64_string - &gt;发送了我从php代码收到的Key和IV。字节 - &gt; utf8_string在发送到函数之前。解决方法是直接发送字节数组,让DecryptRJ256()直接处理它。

  2. 完成上述操作后,自动生成Key和IV的问题变得明显,不再是问题。

  3. 从问题修改的代码:

    PHP

    $iv_size = mcrypt_get_iv_size(MCRYPT_RIJNDAEL_256, MCRYPT_MODE_CBC);
    $iv = mcrypt_create_iv($iv_size, MCRYPT_RAND);
    $key = pack('H*', "bcb04b7e103a0cd8b54763051cef08bc55abe029fdebae5e1d417e2ffb2a00a3");
    $text = "This is my encrypted message";
    
    $crypttext = mcrypt_encrypt(MCRYPT_RIJNDAEL_256, $key, $text, MCRYPT_MODE_CBC, $iv);
    
    $crypttext = base64_encode($crypttext);
    $key= base64_encode($key);
    $iv = base64_encode($iv);
    

    C#

    string plainText = ValidationControls.DecryptRJ256(Convert.FromBase64String("/*$CRYPTTEXT STRING FROM PHP*/"), Convert.FromBase64String("/*$KEY STRING FROM PHP*/"), Convert.FromBase64String("/*$ STRING FROM PHP*/"));
    
    static public String DecryptRJ256(byte[] cypher, byte[] KeyString, byte[] IVString)
        {
            ...
            var Key = KeyString;
            //var Key = encoding.GetBytes(KeyString);
            var IV = IVString;
            //var IV = encoding.GetBytes(IVString);
            ...
        }