Koo*_*eng 5 javascript c# encoding cryptojs
我有一个C#函数,如下所示:
string stringvalue = "530500480530490480530480480520570480520510500490";
var encodedvalue= Encoding.Unicode.GetBytes(stringvalue);
using (HashAlgorithm ssp = System.Security.Cryptography.HashAlgorithm.Create("SHA256"))
{
var digest = ssp.ComputeHash(encodedvalue);
return BitConverter.ToString(digest);
}
Run Code Online (Sandbox Code Playgroud)
我需要创建一个与上面的代码匹配的javascript函数,以便C#和JS的最终结果相同。
目前在我的JS代码中,我正在使用以下代码:
var hash = CryptoJS.SHA256("530500480530490480530480480520570480520510500490");
var hexhash = hash.toString(CryptoJS.enc.hex);
Run Code Online (Sandbox Code Playgroud)
这是我的哈希值的结果:
d956678c8f12c65299daf35019a9a1eb3e6eb9855fd850aeb5aafe46057d179e
Run Code Online (Sandbox Code Playgroud)
但是在我的C#代码中,此行var digest = ssp.ComputeHash(bPass);返回以下数组:

我对编码了解不多。请告诉我上面的C#代码中填充了哪种类型的结果?如果我没记错的话,ComputeHash正在返回字节,但是我需要大量阅读才能确认那是又一个漫长的学习时间
我尝试了许多不同的方法来转换JS Sha256代码,但是没有运气。我被困在这条特定线上将近一天。
请帮忙。谢谢
编辑:对不起,代码错误。我已经更新了C#代码。ComputeHash接受数组
在我的示例中,我使用System.Security.Cryptography.SHA256Managed获取C#中的SHA256。
方法SHA256Managed.ComputeHash将字节数组作为参数,并返回另一个字节数组。现在我们需要将您的字节数组转换回字符串。
以下代码将相同的结果返回给Javascript SHA-256。
byte[] bytes = Encoding.UTF8.GetBytes("530500480530490480530480480520570480520510500490");
SHA256Managed hashstring = new SHA256Managed();
byte[] hash = hashstring.ComputeHash(bytes);
string hashString = string.Empty;
foreach (byte x in hash)
{
hashString += String.Format("{0:x2}", x);
}
return(hashString);
Run Code Online (Sandbox Code Playgroud)
只是说明一下:String.Format(“ {0:x2}”,x)
经过无数个小时的反复试验,我终于找到了答案。
C# 代码var digest = ssp.ComputeHash(encodedvalue)从 Jean 回复的结果中返回字节数组var encodedvalue= Encoding.Unicode.GetBytes(stringvalue);。为了在 Javascript 中创建该函数,我需要确保编码值生成正确的编码格式和大小,就像 C# 中的一样。
仅使用 CryptoJS,我设法从下面获得匹配结果
function GetHexFromString() {
var stringVal = '8563A578-7402-4567-A6CE-4DE4E0825B021234';
// Convert the string to UTF 16 little-endian
// Result: 560530540510650530550560450550520480500450520530540550450650540670690450520680690520690480560500530660480500490500510520
var utf16le = CryptoJS.enc.Utf16LE.parse(stringVal);
// Convert to Sha256 format and get the word array
var utf16Sha256 = CryptoJS.SHA256(utf16le);
// Convert the Sha256 word array to Uint8Array to get the 32 byte array just to see the result to ensure it match with the C# function
// Result: 94,203,69,29,35,202,209,149,121,144,44,6,98,250,141,161,102,7,238,35,228,117,111,236,118,115,51,113,134,72,52,69
var utf16sha256Array = convertWordArrayToUint8Array(utf16Sha256);
// Convert the Sha256 to hex (if i'm not mistaken, it's base 16) format
var hexSha256 = utf16Sha256.toString(CryptoJS.enc.hex);
// Insert a dash in between 2 characters in the string
hexSha256 = hexSha256.replace(/(\S{2})/g, "$1-");
// Remove the last dash in the string
hexSha256 = hexSha256.replace(/-$/, "");
// Final Result: 5E-CB-45-1D-23-CA-D1-95-79-90-2C-06-62-FA-8D-A1-66-07-EE-23-E4-75-6F-EC-76-73-33-71-86-48-34-45
return hexSha256.toUpperCase();
}
function convertWordArrayToUint8Array(wordArray) {
var len = wordArray.words.length,
u8_array = new Uint8Array(len << 2),
offset = 0, word, i
;
for (i = 0; i < len; i++) {
var word = wordArray.words[i];
u8_array[offset++] = word >> 24;
u8_array[offset++] = (word >> 16) & 0xff;
u8_array[offset++] = (word >> 8) & 0xff;
u8_array[offset++] = word & 0xff;
}
return u8_array;
}
Run Code Online (Sandbox Code Playgroud)
希望对需要这种方法的人有所帮助
尝试
var digest = ssp.ComputeHash(Encoding.UTF8.GetBytes(stringvalue))
return BitConverter.ToString(digest)
.Replace("-", string.Empty)
.ToLowerInvariant();
Run Code Online (Sandbox Code Playgroud)
该 js 库在计算其哈希值之前将字符串转换为 UTF8。