Шифрование с использованием C# AES шифрование и дешифрование из этих кодов PHP

Я сталкиваюсь с некоторыми проблемами в шифровании AES с использованием PHP и декодировать то же самое с помощью C #. Мой справочный сайт.

Вот код PHP:

function encrypt_string($input, $key)
   {
       $iv = mcrypt_create_iv(mcrypt_get_iv_size(MCRYPT_RIJNDAEL_128, MCRYPT_MODE_CBC), MCRYPT_RAND);
       return preg_replace('/=/', "", base64_encode($iv . mcrypt_encrypt(MCRYPT_RIJNDAEL_128, hash("sha256", $key, true), $input, MCRYPT_MODE_CBC, $iv)));
   }

function decrypt_string($input, $key)
   {
       $input .= "=";
       $data = base64_decode($input);
       $iv = substr($data, 0, mcrypt_get_iv_size(MCRYPT_RIJNDAEL_128, MCRYPT_MODE_CBC));
       return rtrim(mcrypt_decrypt(MCRYPT_RIJNDAEL_128,hash('sha256', $key, true),substr($data, mcrypt_get_iv_size(MCRYPT_RIJNDAEL_128, MCRYPT_MODE_CBC)),MCRYPT_MODE_CBC,$iv),"\0");
   }

Вот код C#, который я пробовал:

private static byte[] sha256_data(string input)
{
    SHA256 hash = SHA256Managed.Create();
    Encoding encode = Encoding.UTF8;
    return hash.ComputeHash(encode.GetBytes(input));
}

private string encode_data(string data, string key)
{
    byte[] buff;

    RijndaelManaged rij = new RijndaelManaged();

    rij.BlockSize = 256;
    rij.KeySize = 256;

    rij.GenerateIV();
    rij.Key = sha256_data(key);

    rij.Mode = CipherMode.CBC;
    ICryptoTransform encoder = rij.CreateEncryptor(rij.Key, rij.IV);
    using (MemoryStream mem = new MemoryStream())
    {
        using (CryptoStream crypt = new CryptoStream(mem, encoder, CryptoStreamMode.Write))
        {
            byte[] temp = Encoding.UTF8.GetBytes(data);
            crypt.Write(temp, 0, temp.Length);

        }
        buff = mem.ToArray();
    }
    return Convert.ToBase64String(result);
} 

private string decode_data(string input, string key)
{
    RijndaelManaged rij = new RijndaelManaged();

    rij.KeySize = 256;
    rij.BlockSize = 256;

    rij.Key = sha256_data(key);
    rij.GenerateIV();

    rij.Mode = CipherMode.CBC;
    rij.Padding = PaddingMode.PKCS7;

    ICryptoTransform decrypter = rij.CreateDecryptor();

    byte[] buff;
    using (MemoryStream mem = new MemoryStream())
    {
        using (CryptoStream cstream = new CryptoStream(mem, decrypter, CryptoStreamMode.Write))
        {
            byte[] data = Convert.FromBase64String(input);
            cstream.Write(data, 0, data.Length);
        }
        buff = mem.ToArray();
    }
    return Encoding.UTF8.GetString(buff);
}

Что я делаю неправильно?

1 ответ

Когда вы декодируете, вы должны анализировать IV, который использовался для кодирования, а не генерировать новый.

Другие вопросы по тегам