繁体   English   中英

通过这些PHP代码使用C#AES加密和解密进行加密

[英]Encrypting using C# AES encryption & decryption from these PHP codes

我在使用PHP的AES加密中遇到一些问题,并在使用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);
}

我究竟做错了什么?

解码时,您必须解析用于编码的IV,而不会生成新的IV。

暂无
暂无

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

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