简体   繁体   English

解密使用AES-256-CBC在C#中加密的数据,与PHP一样

[英]Decrypting data encrypted with AES-256-CBC in C# as with PHP

I did some encryption using PHP in my Database and would normally decrypt using: 我在我的数据库中使用PHP进行了一些加密,通常使用以下方法解密:

$encrypt_method = "AES-256-CBC";
$secret_key = "testing";
$secret_iv = "testingyes!!!";
$key = hash('sha256', $secret_key); // hash the key
$iv = substr(hash('sha256', $secret_iv), 0, 16); // iv - encrypt method AES-256-CBC expects 16 bytes - else you will get a warning
echo(openssl_decrypt(base64_decode($data), $encrypt_method, $key, 0, $iv)); // the decrypted data

I'm trying to do the same task but with C# 2013 to decrypt the same data, any ideas? 我正在尝试执行相同的任务,但使用C#2013来解密相同的数据,任何想法?

I would encrypt in php using: 我会在php中加密使用:

$encrypt_method = "AES-256-CBC";
$secret_key = "testing";
$secret_iv = "testingyes!!!";
$key = hash('sha256', $secret_key); // hash the key
$iv = substr(hash('sha256', $secret_iv), 0, 16); // iv - encrypt method AES-256-CBC expects 16 bytes - else you will get a warning
echo(base64_encode(openssl_encrypt($data, $encrypt_method, $key, 0, $iv))); // the encrypted data

encrypting: this is a test 加密:这是一个测试

gives: d0EzQ2MvMHkxRks2cXg5NkFkK2twZz09= 给出:d0EzQ2MvMHkxRks2cXg5NkFkK2twZz09 =

I tried this in C#: 我在C#中试过这个:

public static String sha256_hash(String value)
    {
        StringBuilder Sb = new StringBuilder();

        using (SHA256 hash = SHA256Managed.Create())
        {
            Encoding enc = Encoding.UTF8;
            Byte[] result = hash.ComputeHash(enc.GetBytes(value));

            foreach (Byte b in result)
                Sb.Append(b.ToString("x2"));
        }

        return Sb.ToString();
    }

private static String AES_decrypt(String Input)
    {
        RijndaelManaged aes = new RijndaelManaged();
        aes.KeySize = 256;
        aes.BlockSize = 256;
        aes.Mode = CipherMode.CBC;
        aes.Padding = PaddingMode.None;

        aes.Key = Convert.FromBase64String(sha256_hash("testing"));            
        aes.IV = Convert.FromBase64String(sha256_hash("testingyes!!!").Substring(0, 16));
        var decrypt = aes.CreateDecryptor();
        byte[] xBuff = null;
        using (var ms = new MemoryStream())
        {
            using (var cs = new CryptoStream(ms, decrypt, CryptoStreamMode.Write))
            {
                byte[] xXml = Convert.FromBase64String(Input);
                cs.Write(xXml, 0, xXml.Length);
            }
            xBuff = ms.ToArray();
        }
        String Output = Encoding.UTF8.GetString(xBuff);
        return Output;
    }

string cipherData = "d0EzQ2MvMHkxRks2cXg5NkFkK2twZz09=";
string f = AES_decrypt(cipherData);
Console.Write(f);

But I'm getting error: specified key is not a valid size for this algorithm 但我收到错误:指定的密钥不是此算法的有效大小

However the key I'm using is working when I use PHP 但是,当我使用PHP时,我正在使用的密钥正在工作

    RijndaelManaged aes = new RijndaelManaged();
    aes.KeySize = 256;
    aes.BlockSize = 256;

Block size should be 128 to be compatible with AES-256-CBC. 块大小应为128,以与AES-256-CBC兼容。

Rijndael supports variable block sizes - AES does not. Rijndael支持可变块大小 - AES不支持。

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

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