.net中的Openssl_Decrypt方法无法在PHP

时间:2019-07-09 11:48:42

标签: c# php encryption cryptography aes

我有一个PHP代码示例,显示了如何解密某些消息。我正在尝试使用C#解密该消息,但还没有运气。

这是我正在尝试的:

public static string AesDecrypt(byte[] dataToDecrypt, byte[] key, byte[] iv)
    {
        using (var aes = new AesCryptoServiceProvider())
        {
            aes.Mode = CipherMode.CBC;
            aes.Padding = PaddingMode.None;
            //aes.KeySize = 256;

            aes.Key = key;
            aes.IV = iv;

            using (var memoryStream = new MemoryStream(dataToDecrypt))
            {
                var cryptoStream = new CryptoStream(memoryStream, aes.CreateDecryptor(key, iv), CryptoStreamMode.Read);

                using (var reader = new StreamReader(cryptoStream))
                {
                    return reader.ReadToEnd();
                }
            }
        }

    }

这是我调用方法的方式:

        var aesKey = GenerateSha256Hash(Encoding.ASCII.GetBytes("t-3zafRa"));

        var aesIv = GenerateSha256Hash(Encoding.ASCII.GetBytes("St@cE4eZ"));
        var ivString = ConvertByteArrayToSring(aesIv).Substring(0, 16);

        // I'm getting a 24 byte array here, but message needs to be multiple of 16, isn't it?
        var encryptedText = Convert.FromBase64String("RmVpUjU4VjJlcXp2dkN5UlhUODQzUT09");


        var aesDecryptedBytes = AesDecrypt(encryptedText, aesKey, Encoding.ASCII.GetBytes(ivString));

这是上面的用户定义方法:

public static byte[] GenerateSha256Hash(byte[] toBeHashed)
    {
        using (var sha256 = SHA256.Create())
        {
            return sha256.ComputeHash(toBeHashed);
        }
    }

    public static string ConvertByteArrayToSring(byte[] bytes)
    {
        var builder = new StringBuilder();
        foreach (var t in bytes)
        {
            builder.Append(t.ToString("x2"));
        }
        return builder.ToString();
    }

下面是我的PHP代码示例:

php > $secret_key = "t-3zafRa";
$secret_iv = "St@cE4eZ";
php > $encrypted_txt = "RmVpUjU4VjJlcXp2dkN5UlhUODQzUT09";
php > $encrypt_method = "AES-256-CBC";
php > $key = hash('sha256', $secret_key);
php > $iv = substr(hash('sha256', $secret_iv), 0, 16);
php > echo openssl_decrypt(base64_decode($encrypted_txt), $encrypt_method, $key, 0, $iv);

当我从base64String转换为Key,IV甚至消息时,我都获得了正确的值,但是对Openssl_Decrypt的最终调用似乎对我不起作用。

我收到一条错误消息,提示“输入数据不是一个完整的块”,这是我所期望的,我试图从消息中删除IV的第一个和最后一个8个字节,使其成为16个字节,但是我还在变得胡言乱语。

我在这里想念的是什么?谢谢。

0 个答案:

没有答案