Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/324.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/414.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# cryptojs不';t在加密后返回true base64字符串_C#_Javascript_Encryption_Aes_Cryptojs - Fatal编程技术网

C# cryptojs不';t在加密后返回true base64字符串

C# cryptojs不';t在加密后返回true base64字符串,c#,javascript,encryption,aes,cryptojs,C#,Javascript,Encryption,Aes,Cryptojs,我需要使用AES CBC技术对纯文本进行加密,但需要在javascript端进行加密。基本上我需要加密URL 并通过ajax调用启动该URL。URL要解密的系统是用c#编写的。所以我必须回答他们的问题 用c#编写的加密方法。我需要在javascript中使用相同的逻辑,这样它就可以在c中轻松解密# Javascript代码 var Base64encodedandencryptedtext = "username=abc|password=xyz" // have a password need

我需要使用AES CBC技术对纯文本进行加密,但需要在javascript端进行加密。基本上我需要加密URL 并通过ajax调用启动该URL。URL要解密的系统是用c#编写的。所以我必须回答他们的问题 用c#编写的加密方法。我需要在javascript中使用相同的逻辑,这样它就可以在c中轻松解密#

Javascript代码

var Base64encodedandencryptedtext = "username=abc|password=xyz"
// have a password need to hash on that and then pass into aes encryption function
var hash =  CryptoJS.SHA512("234-234-1231"); //password key
var finalhash = hash.toString((CryptoJS.enc.Base64));
Base64encodedandencryptedtext = CryptoJS.AES.encrypt(Base64encodedandencryptedtext ,finalhash)

var Base64encodedkey = Base64.encode("encodedkey");
var baseURL = "https://www.xyz.com/"
var DHINquery = baseURL+"?key="+Base64encodedkey+"&value="+Base64encodedandencryptedtext;

//launch via ajax

    $.ajax({
            type : 'GET',
            async : true,
            url : DHINquery,
            dataType : 'html',
            data : {},          
            success : function (htmlcontent) {
                $("#htmlpage").html(htmlcontent)                
            }, // end success
            complete : function (htmlcontent) {

            }, // end complete
            error : function (htmlcontent) {
            alert("error")
            }
        });
C#加密在他们这边

string Base64encodedandencryptedtext = "username=abc|password=xyz"
Encrypt(Base64encodedandencryptedtext ,passwordkey, "AES") // call that function

 public static string Encrypt(string text, string keyguid, string cryptoService)
    {
        ICryptoTransform transform;
        string text1 = keyguid;
        UTF8Encoding enc = new UTF8Encoding();
        byte[] bytes = enc.GetBytes(text);
        string str = CalculateHashToBase64String(text1, enc, "SHA512");
        string s = str.Substring(4, 24);
        string str3 = str.Substring(0, 4) + str.Substring(0x1c, 4);
        string str4 = str.Substring(0, 4) + str.Substring(28, 12);
        string str5 = str.Substring(0, 4) + str.Substring(0x1c, 20);
        byte[] rgbKey = enc.GetBytes(s);
        string str7 = cryptoService;
        byte[] buffer3 = enc.GetBytes(str4);
        AesCryptoServiceProvider provider2 = new AesCryptoServiceProvider();
        provider2.Padding = PaddingMode.PKCS7;
        provider2.Mode = CipherMode.CBC;
        provider2.KeySize = 0x100;
        transform = provider2.CreateEncryptor(rgbKey, buffer3);
        return Convert.ToBase64String(Transform(bytes, transform)); // return the base64 string
    }
    private static byte[] Transform(byte[] input, ICryptoTransform CryptoTransform)
    {
        byte[] buffer;
        using (MemoryStream stream = new MemoryStream())
        {
            using (CryptoStream stream2 = new CryptoStream(stream, CryptoTransform, CryptoStreamMode.Write))
            {
                stream2.Write(input, 0, input.Length);
                stream2.FlushFinalBlock();
                stream.Position = 0L;
                buffer = stream.ToArray();
            }
        }
        return buffer;
    }
在javascript端进行调试时,加密后我仍然得到base64string,但c#encryption base64string和javascript 加密base64string看起来不同。由于这个原因,webservice没有成功地返回数据

我想知道我使用的aes插件并不像他们在c#side中所做的那样


有人知道为什么吗?任何帮助都将是一个很好的输入。

我发现这两种方法在计算键的方式上有很大的不同。在JS中,对密码密钥进行散列,然后将该散列的二进制数据表示为base64。而在C#代码中,看起来是表示哈希的二进制数据库base64,然后获取base64字符串的子字符串,然后获取base64字符的UTF8字节。这是一些非常显著的差异。JS端可以简化一点,C端可以简化很多。在两侧,取密码密钥的散列,并使用该散列本身作为密钥。不要将哈希转换为base64。不要做任何其他的操作

**实际上,使用像PBKDF2这样的东西会更好,但让我们先让双方同步


**实际上,由于数据是通过ajax发送的,如果您可以使用HTTPS,这将是最好的选择。

这可能与JavaScript在内部使用UTF-16有关,与页面的字符编码无关。另外,CryptoJS的Base64二进制文件安全吗?我们正在javascript方面工作。因此,我们没有其他加密选择。有人知道吗?问题是:
1
,加密方法不等效,或者
2
,base64方法为等效字符串提供不同的输出。例如,尝试将问题缩小到加密字符串
x
(或字节
b
)在JavaScript中转换为base64
a
,在c中转换为
b
。当你把范围缩小到只有几行时,你会更清楚哪些方法不匹配。正如我所说的,这些不一致通常来自于字符集不匹配(在JavaScript中你无法控制)我说我在JavaScript端使用了插件。插件库中几乎没有一行代码和所有其他代码,因为插件中有太多的代码行很难调试这些类型的代码。