3

SHA-256 简介及 C# 和 js 实现【加密知多少系列】 - 橙子家

 1 year ago
source link: https://www.cnblogs.com/czzj/p/JMZDS_SHA256.html
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

SHA-256 简介及 C# 和 js 实现【加密知多少系列】


SHA-256 是 SHA-2 下细分出的一种算法。截止目前(2023-03)未出现“碰撞”案例,被视为是绝对安全的加密算法之一。

SHA-2(安全散列算法 2:Secure Hash Algorithm 2)是一种密码散列函数算法标准,由美国国家安全局 2001 年发布,属于 SHA 算法之一,是 SHA-1 的后继者。SHA-1 算法在 2017-02-23 被谷歌发现了第一个“碰撞”案例,因此也非绝对安全。SHA-2 下不仅只有一种细分算法,总共包括六种:SHA-224、SHA-256、SHA-384、SHA-512、SHA-512/224、SHA-512/256。这些变体除了生成摘要的长度、循环运行的次数等一些微小差异外,算法的基本结构是一致的。

SHA256 其实就是一个哈希函数。哈希函数又称散列算法,是一种从任何一种数据中创建小的数字“指纹”的方法。散列函数把消息或数据压缩成摘要,使得数据量变小,将数据的格式固定下来。该函数将数据打乱混合,重新创建一个叫做散列值(或哈希值)的指纹。散列值通常用一个短的随机字母和数字组成的字符串来代表。关于哈希算法可以参考:Hash算法总结

对于任意长度的消息,SHA256 都会产生一个 256bit 长的哈希值,称作消息摘要。这个摘要相当于是个长度为 32 个字节的数组,通常用一个长度为 64 的十六进制字符串来表示。

一、C# 语言实现

// 测试string jiamihx = SecuritySHA256.SHA256EncryptString("TestString测试"); // ede38cb25c21cea386a6b7a105a8cececfbdd10abecddd9c155a274d3baf2272string jiamihX = SecuritySHA256.SHA256EncryptString("TestString测试", true); // EDE38CB25C21CEA386A6B7A105A8CECECFBDD10ABECDDD9C155A274D3BAF2272byte[] jiamihbyte = SecuritySHA256.SHA256EncryptByte("TestString测试"); // byte[32] using System.Security.Cryptography;/// <summary>/// SHA256加密,返回字符串/// </summary>/// <param name="deseninstr">待加密字符串</param>/// <param name="isupper">false:小写 true:大写</param>/// <returns></returns>public static string SHA256EncryptString(string deseninstr, bool isupper = false){ byte[] bytes = Encoding.UTF8.GetBytes(deseninstr); using (var mySHA256 = SHA256Managed.Create()) { byte[] hash = mySHA256.ComputeHash(bytes); StringBuilder builder = new StringBuilder(); for (int i = 0; i < hash.Length; i++) { builder.Append(hash[i].ToString(isupper?"X2":"x2")); } return builder.ToString(); }}/// <summary>/// SHA256加密,返回字节数组/// </summary>/// <param name="deseninstr">待加密字符串</param>/// <returns>加密数组</returns>public static Byte[] SHA256EncryptByte(string deseninstr){ using (var mySHA256 = SHA256Managed.Create()) { byte[] deseninbyte = Encoding.UTF8.GetBytes(deseninstr); byte[] EncryptBytes = mySHA256.ComputeHash(deseninbyte); return EncryptBytes; }}

二、js 语言实现

 1、引用第三方库 crypto-js 实现加密

// 引入 js 库<script src="http://cdn.bootcdn.net/ajax/libs/crypto-js/4.0.0/crypto-js.js"></script>// npm 方式引入>npm install crypto-js // 加密操作let encryptpk = CryptoJS.SHA256("TestString测试").toString();console.log("加密后:",encryptpk);

 2、纯 js 方式加密

// 调用方法 message() 查看测试结果function message() { var data_de1 = SHA256("TestString测试", false) console.log(data_de1); // ede38cb25c21cea386a6b7a105a8cececfbdd10abecddd9c155a274d3baf2272 var data_de2 = SHA256("TestString测试", true) console.log(data_de2); // EDE38CB25C21CEA386A6B7A105A8CECECFBDD10ABECDDD9C155A274D3BAF2272} // 纯 js 加密方法function Sha256Encrypt(encrypt_content, isupper = false) { const chrsz = 8 function safe_add(x, y) { const lsw = (x & 0xFFFF) + (y & 0xFFFF) const msw = (x >> 16) + (y >> 16) + (lsw >> 16) return (msw << 16) | (lsw & 0xFFFF) } function S(X, n) { return (X >>> n) | (X << (32 - n)) } function R(X, n) { return (X >>> n) } function Ch(x, y, z) { return ((x & y) ^ ((~x) & z)) } function Maj(x, y, z) { return ((x & y) ^ (x & z) ^ (y & z)) } function Sigma0256(x) { return (S(x, 2) ^ S(x, 13) ^ S(x, 22)) } function Sigma1256(x) { return (S(x, 6) ^ S(x, 11) ^ S(x, 25)) } function Gamma0256(x) { return (S(x, 7) ^ S(x, 18) ^ R(x, 3)) } function Gamma1256(x) { return (S(x, 17) ^ S(x, 19) ^ R(x, 10)) } function core_sha256(m, l) { const K = [0x428A2F98, 0x71374491, 0xB5C0FBCF, 0xE9B5DBA5, 0x3956C25B, 0x59F111F1, 0x923F82A4, 0xAB1C5ED5, 0xD807AA98, 0x12835B01, 0x243185BE, 0x550C7DC3, 0x72BE5D74, 0x80DEB1FE, 0x9BDC06A7, 0xC19BF174, 0xE49B69C1, 0xEFBE4786, 0xFC19DC6, 0x240CA1CC, 0x2DE92C6F, 0x4A7484AA, 0x5CB0A9DC, 0x76F988DA, 0x983E5152, 0xA831C66D, 0xB00327C8, 0xBF597FC7, 0xC6E00BF3, 0xD5A79147, 0x6CA6351, 0x14292967, 0x27B70A85, 0x2E1B2138, 0x4D2C6DFC, 0x53380D13, 0x650A7354, 0x766A0ABB, 0x81C2C92E, 0x92722C85, 0xA2BFE8A1, 0xA81A664B, 0xC24B8B70, 0xC76C51A3, 0xD192E819, 0xD6990624, 0xF40E3585, 0x106AA070, 0x19A4C116, 0x1E376C08, 0x2748774C, 0x34B0BCB5, 0x391C0CB3, 0x4ED8AA4A, 0x5B9CCA4F, 0x682E6FF3, 0x748F82EE, 0x78A5636F, 0x84C87814, 0x8CC70208, 0x90BEFFFA, 0xA4506CEB, 0xBEF9A3F7, 0xC67178F2] const HASH = [0x6A09E667, 0xBB67AE85, 0x3C6EF372, 0xA54FF53A, 0x510E527F, 0x9B05688C, 0x1F83D9AB, 0x5BE0CD19] const W = new Array(64) let a, b, c, d, e, f, g, h, i, j let T1, T2 m[l >> 5] |= 0x80 << (24 - l % 32) m[((l + 64 >> 9) << 4) + 15] = l for (i = 0; i < m.length; i += 16) { a = HASH[0] b = HASH[1] c = HASH[2] d = HASH[3] e = HASH[4] f = HASH[5] g = HASH[6] h = HASH[7] for (j = 0; j < 64; j++) { if (j < 16) { W[j] = m[j + i] } else { W[j] = safe_add(safe_add(safe_add(Gamma1256(W[j - 2]), W[j - 7]), Gamma0256(W[j - 15])), W[j - 16]) } T1 = safe_add(safe_add(safe_add(safe_add(h, Sigma1256(e)), Ch(e, f, g)), K[j]), W[j]) T2 = safe_add(Sigma0256(a), Maj(a, b, c)) h = g g = f f = e e = safe_add(d, T1) d = c c = b b = a a = safe_add(T1, T2) } HASH[0] = safe_add(a, HASH[0]) HASH[1] = safe_add(b, HASH[1]) HASH[2] = safe_add(c, HASH[2]) HASH[3] = safe_add(d, HASH[3]) HASH[4] = safe_add(e, HASH[4]) HASH[5] = safe_add(f, HASH[5]) HASH[6] = safe_add(g, HASH[6]) HASH[7] = safe_add(h, HASH[7]) } return HASH } function str2binb(str) { const bin = [] const mask = (1 << chrsz) - 1 for (let i = 0; i < str.length * chrsz; i += chrsz) { bin[i >> 5] |= (str.charCodeAt(i / chrsz) & mask) << (24 - i % 32) } return bin } function Utf8Encode(string) { string = string.replace(/\r\n/g, '\n') let utfText = '' for (let n = 0; n < string.length; n++) { const 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 } function binb2hex(binarray) { const hex_tab = isupper ? '0123456789ABCDEF' : '0123456789abcdef' let str = '' for (let i = 0; i < binarray.length * 4; i++) { str += hex_tab.charAt((binarray[i >> 2] >> ((3 - i % 4) * 8 + 4)) & 0xF) + hex_tab.charAt((binarray[i >> 2] >> ((3 - i % 4) * 8)) & 0xF) } return str } encrypt_content = Utf8Encode(encrypt_content) return binb2hex(core_sha256(str2binb(encrypt_content), encrypt_content.length * chrsz))}

About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK