Question

I use RJ256 to login, since the return string is fairly small, it works (PHP gives encrypted string and C# needs to decrypt).

The data gets decrypted and fully works. Although, now I am transferring a 79KB string from PHP (Encrypted) to C# (Needs to Decrypt) and I get this error: http://i.imgur.com/M4sgEct.png This error only happens when the string is a bit larger than normally.

Here is my PHP code to encrypt:

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

Here is my C# Code to decrypt:

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

How can I make it work?

Était-ce utile?

La solution

How about this:

  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;

  }
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top