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

标签 c# php encryption aes

我在我的数据库中使用 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

我正在尝试执行相同的任务,但使用 C# 2013 来解密相同的数据,有什么想法吗?

我会在 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

加密:这是一个测试

给出:d0EzQ2MvMHkxRks2cXg5NkFkK2twZz09=

我在 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);

但我收到错误:指定的 key 不是该算法的有效大小

但是当我使用 PHP 时,我使用的 key 是有效的

最佳答案

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

block 大小应为 128 以与 AES-256-CBC 兼容。

Rijndael 支持可变 block 大小——AES 不支持。

关于c# - 与 PHP 一样,在 C# 中解密使用 AES-256-CBC 加密的数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40178532/

相关文章:

php - FPDF 错误 : This document (mine. pdf) 可能使用了 FDI 随附的免费解析器不支持的压缩技术

c# - 运行具有公共(public)连接对象和不同连接状态的单元测试用例

php - EC2 Ubuntu mysql_connect 函数导致 500 Internal Server Error

php - 无法访问 ajax 发送的 php 页面上的数据?

python - 用 Python 加密

c - 此代码是否有资格成为 block 密码

java - RSA 2048 加密解密 - 异常

c# - 无法以编程方式在 WPF 中设置动画控件的宽度或高度(甚至不能通过 Snoop)

C# 和 MySQL 连接问题 : mysql_clear_password not supported by any of the available plugins

C# - 从字节创建 BMP