【问题标题】:PHP Encryption and C# Decryption [Rijndael]PHP 加密和 C# 解密 [Rijndael]
【发布时间】:2014-03-22 07:18:52
【问题描述】:

我使用RJ256登录,由于返回字符串比较小,可以正常工作(PHP给出加密字符串,C#需要解密)。

数据被解密并完全正常工作。虽然,现在我正在将一个 79KB 的字符串从 PHP(加密)传输到 C#(需要解密),但我收到了这个错误: http://i.imgur.com/M4sgEct.png 仅当字符串比正常情况稍大时才会发生此错误。

这是我要加密的 PHP 代码:

private function _encrypt($data)
{
    $iv = "sfhfskfsusfdsfd79fd8s79sdf789f79";
    $key = "da4b9237bacccdf1";
    // to append string with trailing characters as for PKCS7 padding scheme
    $block = mcrypt_get_block_size(MCRYPT_RIJNDAEL_256, MCRYPT_MODE_CBC);
    $padding = $block - (strlen($data) % $block);
    $data .= str_repeat(chr($padding), $padding);

    $crypttext = mcrypt_encrypt(MCRYPT_RIJNDAEL_256, $key, $data, MCRYPT_MODE_CBC, $iv);

    // this is not needed here            
    //$crypttext = urlencode($crypttext);

    return base64_encode($crypttext);
}

这是我要解密的 C# 代码:

public static dynamic DecryptRJ256(string cypher, bool isJson = true, bool getBytes = false)
{
    string sRet;

    var encoding = new UTF8Encoding();
    var key = encoding.GetBytes("da4b9237bacccdf1");
    var iv = encoding.GetBytes("sfhfskfsusfdsfd79fd8s79sdf789f79");

    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(Decode(cypher));

            using (var cs = new CryptoStream(ms, rj.CreateDecryptor(key, iv), CryptoStreamMode.Read))
            {
                using (var sr = new StreamReader(cs))
                {
                    sRet = sr.ReadLine();
                }
            }
        }
        finally
        {
            rj.Clear();
        }
    }

    // ReSharper disable once AssignNullToNotNullAttribute
    return (isJson ? JsonConvert.DeserializeObject<dynamic>(sRet) : (getBytes ? Encoding.UTF8.GetBytes(sRet) : (dynamic)sRet));
}

我怎样才能让它工作?

【问题讨论】:

  • 有趣,带有 256 位块的 Rijndael - 选择背后的任何理由?它不是很便携的超大 PHP 和 C#。另外,我希望您不只是与世界分享您的密钥。
  • 哪种转换适合您的情况var key1 = encoding.GetBytes("da4b9237bacccdf1"); var key2 = SoapHexBinary.Parse("da4b9237bacccdf1").Value; /*(namespace System.Runtime.Remoting.Metadata.W3cXsd2001)*/
  • 尝试做一个 cs.FlushFinalBlock();在 cs = new CryptoStream.. 代码块的右大括号之前。
  • @ntoskrnl 我不明白你在说什么。第一个返回 16 个字节(128 位),第二个返回 8 个字节。我不认为第一个是正确的。
  • @L.B 是的,我也看到了,评论已删除。由于 AES 不适用于 64 位密钥,因此肯定会排除十六进制。当被告知使用 256 位密钥但给出 128 位密钥时,我不知道 C# 会做什么。

标签: c# php encryption cryptography rsa


【解决方案1】:

这个怎么样:

  public static byte[] DecryptRJ256(string prm_key, string prm_iv, string prm_text_to_decrypt)
  {
        var sEncryptedString = prm_text_to_decrypt;

        var myRijndael = new RijndaelManaged();
        myRijndael.Padding = PaddingMode.Zeros;
        myRijndael.Mode = CipherMode.CBC;
        myRijndael.KeySize = 256;
        myRijndael.BlockSize = 256;

        byte[] key;
        byte[] IV;

        key = Encoding.ASCII.GetBytes(prm_key);
        IV = Encoding.ASCII.GetBytes(prm_iv);

        var decryptor = myRijndael.CreateDecryptor(key, IV);

        var sEncrypted = Convert.FromBase64String(sEncryptedString);
        var fromEncrypt = new byte[sEncrypted.Length];

        var msDecrypt = new MemoryStream(sEncrypted);
        var csDecrypt = new CryptoStream(msDecrypt, decryptor, CryptoStreamMode.Read);

        csDecrypt.Read(fromEncrypt, 0, fromEncrypt.Length);

        //Return (System.Text.Encoding.ASCII.GetString(fromEncrypt))
        return fromEncrypt;

  }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-03-26
    • 2012-11-18
    • 2012-05-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-23
    相关资源
    最近更新 更多