繁体   English   中英

为什么 .NET 中的 AEC 加密产生与 JavaScript 不同的结果?

[英]Why AEC encryption in .NET yields different result than JavaScript?

我要疯了这个。 花了一整天,仍然无法理解发生了什么。 我在.Net 和 JavaScript 中都使用 AES256CBC 加密。 出于某种原因,我得到了不同的结果,尽管我使用的是相同的密钥。 我的代码是:

JavaScript:

function convertStringToArrayBuffer(str) {
        var length = str.length;
        var bytes = new Uint8Array(length);
        for(var i = 0; i < length; i++) {
            bytes[i] = str.charCodeAt(i);
        }
        return bytes;
    }

    var keyB64 ="sy/d1Ddy/9K3p8x6pWMq2P8Qw2ftUjkkrAA7xFC7aK8=";
    var viB64 = "t8eI2F+QmlUBWZJVIlTX6Q==";

    var dataToEnc = "Test123!"
    let dataInBytes = convertStringToArrayBuffer(dataToEnc);

    let key = window.atob(keyB64);
    let iv = window.atob(viB64);

    console.log(key);
    console.log(iv);
    window.crypto.subtle.importKey("raw", convertStringToArrayBuffer(key).buffer, {name: "AES-CBC", length: 256}, false, ["encrypt"]).then(function(key){
        console.log(key);
        window.crypto.subtle.encrypt({name: "AES-CBC", iv: convertStringToArrayBuffer(iv).buffer}, key, dataInBytes.buffer).then(function(encrypted){
            console.log(encrypted);
        });
    });

这个产生

在此处输入图像描述

。网:

public static void Test()
        {
            var dataToEnc = "Test123!";
            var keyB64 = "sy/d1Ddy/9K3p8x6pWMq2P8Qw2ftUjkkrAA7xFC7aK8=";
            var viB64 = "t8eI2F+QmlUBWZJVIlTX6Q==";
            var key = Convert.FromBase64String(keyB64);
            var iv = Convert.FromBase64String(viB64);
            var data = Encoding.UTF8.GetBytes(dataToEnc);

            byte[] encrypted = null;
            using (Aes aesAlg = Aes.Create())
            {
                aesAlg.Key = key;
                aesAlg.IV = iv;

                ICryptoTransform encryptor = aesAlg.CreateEncryptor(aesAlg.Key, aesAlg.IV);
                using (MemoryStream msEncrypt = new MemoryStream())
                {
                    using (CryptoStream csEncrypt = new CryptoStream(msEncrypt, encryptor, CryptoStreamMode.Write))
                    {
                        using (StreamWriter swEncrypt = new StreamWriter(csEncrypt))
                        {
                            swEncrypt.Write(data);
                        }
                        encrypted = msEncrypt.ToArray();
                    }
                }

            }

        }

这个产生

在此处输入图像描述

我相信这是微不足道的,但我找不到这个。 我很感激这里的任何提示。

如果其他人遇到此问题@Topaco 的评论是 go 的正确方法,我将其粘贴在下面

该错误位于 C# 代码中。 您必须使用 swEncrypt.Write(dataToEnc) 而不是 swEncrypt.Write(data)。 您当前使用的重载隐式执行 data.ToString()

暂无
暂无

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

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