朋友说用JS计算的SHA1编码出问题了,使用三种不一样的代码,出现了三组不同的结果。原因是汉字编码在字符转换成字节过程中采取的编码格式不同而导致的。如图所示。

JS和C#的SHA1计算代码及演示

JS和C#的SHA1计算代码及演示

在utf8大行网络的今天,我们比较赞同采取utf8格式作为JS计算方式,其代码摘自:http://www.webtoolkit.info/javascript-sha1.html

示例源码如***意文件格式和页面声明为utf8

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv="content-type" content="text/html;charset=UTF-8"> <title>Sha1 Test</title> <mce:script src="jquery-1.4.1.min.js" mce_src="jquery-1.4.1.min.js"></mce:script> <mce:script type="text/javascript"><!-- /** * * Secure Hash Algorithm (SHA1) * http://www.webtoolkit.info/ * http://www.webtoolkit.info/javascript-sha1.html * **/ function SHA1(msg) { function rotate_left(n, s) { var t4 = (n << s) | (n >>> (32 - s)); return t4; }; function lsb_hex(val) { var str = ""; var i; var vh; var vl; for (i = 0; i <= 6; i += 2) { vh = (val >>> (i * 4 + 4)) & 0x0f; vl = (val >>> (i * 4)) & 0x0f; str += vh.toString(16) + vl.toString(16); } return str; }; function cvt_hex(val) { var str = ""; var i; var v; for (i = 7; i >= 0; i--) { v = (val >>> (i * 4)) & 0x0f; str += v.toString(16); } return str; }; function Utf8Encode(string) { string = string.replace(/\r\n/g, "\n"); var utftext = ""; for (var n = 0; n < string.length; n++) { var c = string.charCodeAt(n); if (c < 128) { utftext += String.fromCharCode(c); } else if ((c > 127) && (c < 2048)) { utftext += String.fromCharCode((c >> 6) | 192); utftext += String.fromCharCode((c & 63) | 128); } else { utftext += String.fromCharCode((c >> 12) | 224); utftext += String.fromCharCode(((c >> 6) & 63) | 128); utftext += String.fromCharCode((c & 63) | 128); } } return utftext; }; var blockstart; var i, j; var W = new Array(80); var H0 = 0x67452301; var H1 = 0xEFCDAB89; var H2 = 0x98BADCFE; var H3 = 0x10325476; var H4 = 0xC3D2E1F0; var A, B, C, D, E; var temp; msg = Utf8Encode(msg); var msg_len = msg.length; var word_array = new Array(); for (i = 0; i < msg_len - 3; i += 4) { j = msg.charCodeAt(i) << 24 | msg.charCodeAt(i + 1) << 16 | msg.charCodeAt(i + 2) << 8 | msg.charCodeAt(i + 3); word_array.push(j); } switch (msg_len % 4) { case 0: i = 0x080000000; break; case 1: i = msg.charCodeAt(msg_len - 1) << 24 | 0x0800000; break; case 2: i = msg.charCodeAt(msg_len - 2) << 24 | msg.charCodeAt(msg_len - 1) << 16 | 0x08000; break; case 3: i = msg.charCodeAt(msg_len - 3) << 24 | msg.charCodeAt(msg_len - 2) << 16 | msg.charCodeAt(msg_len - 1) << 8 | 0x80; break; } word_array.push(i); while ((word_array.length % 16) != 14) word_array.push(0); word_array.push(msg_len >>> 29); word_array.push((msg_len << 3) & 0x0ffffffff); for (blockstart = 0; blockstart < word_array.length; blockstart += 16) { for (i = 0; i < 16; i++) W[i] = word_array[blockstart + i]; for (i = 16; i <= 79; i++) W[i] = rotate_left(W[i - 3] ^ W[i - 8] ^ W[i - 14] ^ W[i - 16], 1); A = H0; B = H1; C = H2; D = H3; E = H4; for (i = 0; i <= 19; i++) { temp = (rotate_left(A, 5) + ((B & C) | (~B & D)) + E + W[i] + 0x5A827999) & 0x0ffffffff; E = D; D = C; C = rotate_left(B, 30); B = A; A = temp; } for (i = 20; i <= 39; i++) { temp = (rotate_left(A, 5) + (B ^ C ^ D) + E + W[i] + 0x6ED9EBA1) & 0x0ffffffff; E = D; D = C; C = rotate_left(B, 30); B = A; A = temp; } for (i = 40; i <= 59; i++) { temp = (rotate_left(A, 5) + ((B & C) | (B & D) | (C & D)) + E + W[i] + 0x8F1BBCDC) & 0x0ffffffff; E = D; D = C; C = rotate_left(B, 30); B = A; A = temp; } for (i = 60; i <= 79; i++) { temp = (rotate_left(A, 5) + (B ^ C ^ D) + E + W[i] + 0xCA62C1D6) & 0x0ffffffff; E = D; D = C; C = rotate_left(B, 30); B = A; A = temp; } H0 = (H0 + A) & 0x0ffffffff; H1 = (H1 + B) & 0x0ffffffff; H2 = (H2 + C) & 0x0ffffffff; H3 = (H3 + D) & 0x0ffffffff; H4 = (H4 + E) & 0x0ffffffff; } var temp = cvt_hex(H0) + cvt_hex(H1) + cvt_hex(H2) + cvt_hex(H3) + cvt_hex(H4); return temp.toLowerCase(); } // --></mce:script> <mce:script type="text/javascript"><!-- $(document).ready(function() { $("#input").keyup(function() { $("#result").text(SHA1($("#input").val())); }); }); // --></mce:script> </head> <body> <div> <input id="input" type="text" /> <div id="result" /> </div> </body> </html>

C#的计算代码直接使用SHA1CryptoServiceProvider 实现,主要代码如下:

using System; using System.Security.Cryptography; using System.Text; using System.Windows.Forms; namespace WindowsFormsApplication1 { public partial class Form1 : Form { public Form1() { InitializeComponent(); this.Text += " F1 - Blog"; } private void textBox1_TextChanged(object sender, EventArgs e) { string input = (sender as TextBox).Text; string utf8, unicode, utf32, bigEndianUnicode, utf7, ascii; SHA1(input, Encoding.UTF8, out utf8); SHA1(input, Encoding.Unicode, out unicode); SHA1(input, Encoding.UTF32, out utf32); SHA1(input, Encoding.BigEndianUnicode, out bigEndianUnicode); SHA1(input, Encoding.UTF7, out utf7); SHA1(input, Encoding.ASCII, out ascii); StringBuilder sb = new StringBuilder(); string format = "{0,18}: {1}{2}"; sb.AppendFormat(format, "UTF8", utf8, Environment.NewLine); sb.AppendFormat(format, "UNICODE", unicode, Environment.NewLine); sb.AppendFormat(format, "UTF32", utf32, Environment.NewLine); sb.AppendFormat(format, "BIGENDIANUNICODE", bigEndianUnicode, Environment.NewLine); sb.AppendFormat(format, "UTF7", utf7, Environment.NewLine); sb.AppendFormat(format, "ASCII", ascii, Environment.NewLine); textBox2.Text = sb.ToString(); } private bool SHA1(string input, Encoding encoding, out string result) { bool r = false; result = ""; try { SHA1CryptoServiceProvider sha1 = new SHA1CryptoServiceProvider(); byte[] data = sha1.ComputeHash(encoding.GetBytes(input)); StringBuilder sb = new StringBuilder(); foreach (byte @byte in data) { sb.AppendFormat("{0:x2}", @byte); } result = sb.ToString(); r = true; } catch (System.Exception error) { result = "ERROR: " + error.Message; } return r; } protected override bool ProcessCmdKey(ref Message msg, Keys keyData) { if (keyData == Keys.F1) System.Diagnostics.Process.Start("http://blog.csdn.net/oyi319/archive/2010/03/24/5413143.aspx"); return base.ProcessCmdKey(ref msg, keyData); } } }

示例文件下载页面:http://www.uushare.com/user/m2nlight/file/2772397

JS和C#的SHA1计算代码及演示
sha1test.7z
类型: 7Z 压缩文件
大小: 31.7 KB

相关文章:

  • 2021-04-13
  • 2022-02-23
  • 2022-03-02
  • 2022-01-05
  • 2022-12-23
  • 2021-12-22
  • 2021-10-30
  • 2022-12-23
猜你喜欢
  • 2021-06-28
  • 2021-06-13
  • 2021-09-15
  • 2022-12-23
  • 2022-12-23
  • 2022-12-23
  • 2021-12-24
相关资源
相似解决方案