繁体   English   中英

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

[英]Cross platform (php to C# .NET) encryption/decryption with Rijndael Part 2

< 原始代码从这里>

我在谷歌搜索时碰到了这个线程。 但是,在尝试并进行了调整之后,我遇到了一个障碍,希望有人能对我有所帮助。

  1. 上面的代码很好,但是由于该算法在每次都不更改IV的情况下并没有真正的用处,因此我尝试使用以下代码来生成iv,但它一直说“指定的密钥对该算法而言不是有效的大小”。 在我的C#调试器中。

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

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

(我已经从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. 我意识到对Base 64字符串进行.NET解码确实很奇怪。 当我调用DecryptRJ256()时,我通过一系列转换base64_string-> byte-> utf8_string来发送我从php代码接收到的Key和IV,然后将它们都发送到函数中。 解决方案是直接发送字节数组,然后让DecryptRJ256()直接处理它。

  2. 完成上述操作后,自动生成密钥和IV的问题就显而易见了,不再是问题。

从问题修改的代码:

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);
        ...
    }

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM