PHP加密和c#解密[Rijndael]

本文关键字:Rijndael 解密 加密 PHP | 更新日期: 2023-09-27 17:51:14

我使用RJ256登录,因为返回字符串相当小,它工作(PHP给出加密字符串,c#需要解密)。

数据被解密并完全工作。虽然,现在我正在从PHP(加密)传输79KB字符串到c#(需要解密),我得到这个错误:https://i.stack.imgur.com/S2286.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));
}

我怎样才能使它工作?

PHP加密和c#解密[Rijndael]

这个怎么样:

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