当前位置: 首页 > news >正文

javascript实现sha256算法,支持分多次计算

概述:

本人前端需要实现sha256计算的功能,最好是能做到分多次计算,在网上找了很久,发现达不到预期的功能:
比如这里代码:http://www.webtoolkit.info/javascript_sha256.html和这里代码:https://blog.csdn.net/BHSZZY/article/details/127111589,是说的一步计算的,
这里的代码用的比较广泛:https://blog.csdn.net/qq_40164190/article/details/83384234,支持分多次计算,但是,分多次计算结果却是错的,即

sha256_init();
sha256_update(1234, 4);
sha256_final();
sha256_encode_hex();

结果是对的
但是分多次计算

sha256_init();
sha256_update(12, 2);
sha256_update(34, 2);
sha256_final();
sha256_encode_hex();

结果是错的
查找js中crypto库,发现过于庞大不适合微信小程序,基于此,本人在现有sha256的C++代码,反复测试对比计算过程参数,成功改造成sha256的javascript代码,并成功验证好分多次计算sha256数据。

测试平台:

已经在如下环境中测试通过,其他平台应该也不会有问题:
1、nodejs中node.exe运行
2、Microsoft Edge和GPT Chrome浏览器
3、微信小程序

功能代码:

function strSha256CtxParams() {this.state;this.data;this.datalen;this.bitlenhigh;this.bitlenlow;
};var K256 = new Array(0x428a2f98, 0x71374491, 0xb5c0fbcf, 0xe9b5dba5,0x3956c25b, 0x59f111f1, 0x923f82a4, 0xab1c5ed5,0xd807aa98, 0x12835b01, 0x243185be, 0x550c7dc3,0x72be5d74, 0x80deb1fe, 0x9bdc06a7, 0xc19bf174,0xe49b69c1, 0xefbe4786, 0x0fc19dc6, 0x240ca1cc,0x2de92c6f, 0x4a7484aa, 0x5cb0a9dc, 0x76f988da,0x983e5152, 0xa831c66d, 0xb00327c8, 0xbf597fc7,0xc6e00bf3, 0xd5a79147, 0x06ca6351, 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
);function ROTLEFT(a, b) {return (((a) << (b)) | ((a) >>> (32-(b))));
}function ROTRIGHT(a,b) {return (((a) >>> (b)) | ((a) << (32-(b))));
}function CH(x,y,z) {return (((x) & (y)) ^ (~(x) & (z)));
}function MAJ(x,y,z) {return (((x) & (y)) ^ ((x) & (z)) ^ ((y) & (z)));
}function EP0(x) {return (ROTRIGHT(x,2) ^ ROTRIGHT(x,13) ^ ROTRIGHT(x,22));
}function EP1(x) {return (ROTRIGHT(x,6) ^ ROTRIGHT(x,11) ^ ROTRIGHT(x,25));
}function SIG0(x) {return (ROTRIGHT(x,7) ^ ROTRIGHT(x,18) ^ ((x) >>> 3));
}function SIG1(x) {return (ROTRIGHT(x,17) ^ ROTRIGHT(x,19) ^ ((x) >>> 10));
}function BitLenAdd(sha256CtxParams, add) {sha256CtxParams.bitlenlow += add;if (sha256CtxParams.bitlenlow >= 4294967296) {sha256CtxParams.bitlenhigh++;sha256CtxParams.bitlenlow = sha256CtxParams.bitlenlow & 0xffffffff;}
}function sha256_init() {var sha256CtxParams = new strSha256CtxParams();sha256CtxParams.state = new Array(8);sha256CtxParams.data = new Uint8Array(64);sha256CtxParams.state[0] = 0x6a09e667;sha256CtxParams.state[1] = 0xbb67ae85;sha256CtxParams.state[2] = 0x3c6ef372;sha256CtxParams.state[3] = 0xa54ff53a;sha256CtxParams.state[4] = 0x510e527f;sha256CtxParams.state[5] = 0x9b05688c;sha256CtxParams.state[6] = 0x1f83d9ab;sha256CtxParams.state[7] = 0x5be0cd19;sha256CtxParams.datalen = 0;sha256CtxParams.bitlenhigh = 0;sha256CtxParams.bitlenlow = 0;return sha256CtxParams;
}function sha256_update(sha256CtxParams, data, datalen) {var i = 0;for (i = 0; i < datalen; i++) {sha256CtxParams.data[sha256CtxParams.datalen] = data.charCodeAt(i);sha256CtxParams.datalen++;if (sha256CtxParams.datalen == 64) {sha256_transform(sha256CtxParams);BitLenAdd(sha256CtxParams, 512);sha256CtxParams.datalen = 0;}}
}function sha256_transform(sha256CtxParams) {var a, b, c, d, e, f, g, h, t1, t2;var i, j;var m = new Array(64);for (i = 0, j = 0; i < 16; ++i, j += 4) {m[i] = ((parseInt(sha256CtxParams.data[j]) & 0xff) << 24) | ((parseInt(sha256CtxParams.data[j + 1]) & 0xff) << 16) | ((parseInt(sha256CtxParams.data[j + 2]) & 0xff) << 8) | (parseInt(sha256CtxParams.data[j + 3]) & 0xff);m[i] &= m[i];}for ( ; i < 64; ++i) {m[i] = (SIG1(m[i - 2]) & 0xffffffff) + m[i - 7] + (SIG0(m[i - 15]) & 0xffffffff) + m[i - 16];m[i] &= m[i];}a = sha256CtxParams.state[0];b = sha256CtxParams.state[1];c = sha256CtxParams.state[2];d = sha256CtxParams.state[3];e = sha256CtxParams.state[4];f = sha256CtxParams.state[5];g = sha256CtxParams.state[6];h = sha256CtxParams.state[7];for (i = 0; i < 64; ++i) {t1 = h + EP1(e) + CH(e,f,g) + K256[i] + m[i];t2 = EP0(a) + MAJ(a,b,c);h = g;g = f;f = e;e = d + t1;d = c;c = b;b = a;a = t1 + t2;}sha256CtxParams.state[0] += a;sha256CtxParams.state[1] += b;sha256CtxParams.state[2] += c;sha256CtxParams.state[3] += d;sha256CtxParams.state[4] += e;sha256CtxParams.state[5] += f;sha256CtxParams.state[6] += g;sha256CtxParams.state[7] += h;for (i = 0; i < 8; i++) {sha256CtxParams.state[i] &= 0xffffffff;}
}function sha256_final(sha256CtxParams) {var i = 0;var j = 0;var result = new Uint8Array(32);i = sha256CtxParams.datalen;// Pad whatever data is left in the buffer.if (sha256CtxParams.datalen < 56) {sha256CtxParams.data[i] = 0x80;  // pad 10000000 = 0x80i++;while (i < 56) {sha256CtxParams.data[i] = 0x00;i++;}}else {sha256CtxParams.data[i] = 0x80;i++;while (i < 64) {sha256CtxParams.data[i] = 0x00;i++;}sha256_transform(sha256CtxParams);//memset(sha256CtxParams.data, 0, 56);for (j = 0; j < 56; j++) {sha256CtxParams.data[j] = 0x00;}}BitLenAdd(sha256CtxParams, sha256CtxParams.datalen * 8);sha256CtxParams.data[63] = sha256CtxParams.bitlenlow;sha256CtxParams.data[62] = sha256CtxParams.bitlenlow >> 8;sha256CtxParams.data[61] = sha256CtxParams.bitlenlow >> 16;sha256CtxParams.data[60] = sha256CtxParams.bitlenlow >> 24;sha256CtxParams.data[59] = sha256CtxParams.bitlenhigh >> 0;sha256CtxParams.data[58] = sha256CtxParams.bitlenhigh >> 8;sha256CtxParams.data[57] = sha256CtxParams.bitlenhigh >> 16;sha256CtxParams.data[56] = sha256CtxParams.bitlenhigh >> 24;	sha256_transform(sha256CtxParams);// copying the final state to the output hash(use big endian).for (i = 0; i < 4; ++i) {result[i]      = (sha256CtxParams.state[0] >>> (24 - i * 8)) & 0x000000ff;result[i + 4]  = (sha256CtxParams.state[1] >>> (24 - i * 8)) & 0x000000ff;result[i + 8]  = (sha256CtxParams.state[2] >>> (24 - i * 8)) & 0x000000ff;result[i + 12] = (sha256CtxParams.state[3] >>> (24 - i * 8)) & 0x000000ff;result[i + 16] = (sha256CtxParams.state[4] >>> (24 - i * 8)) & 0x000000ff;result[i + 20] = (sha256CtxParams.state[5] >>> (24 - i * 8)) & 0x000000ff;result[i + 24] = (sha256CtxParams.state[6] >>> (24 - i * 8)) & 0x000000ff;result[i + 28] = (sha256CtxParams.state[7] >>> (24 - i * 8)) & 0x000000ff;}return result;
}function sha256_encode_hex(result) {var sha256_hex_digits = "0123456789abcdef";var output = new String();var i = 0;for (i = 0; i < 32; i++) {output += sha256_hex_digits.charAt((result[i] >>> 4) & 0x0f);output += sha256_hex_digits.charAt((result[i]) & 0x0f);}return output;
}function sha256_digest(data) {var result = null;var sha256CtxParams = sha256_init();sha256_update(sha256CtxParams, data, data.length);result = sha256_final(sha256CtxParams);return sha256_encode_hex(result);
}

测试代码:

var tmpStr = null;
var result = null;
var sha256Ctx = null;sha256Ctx = sha256_init();
sha256_update(sha256Ctx, "00112233445566778899", 20);
sha256_update(sha256Ctx, "PP", 2);
result = sha256_final(sha256Ctx);
tmpStr = sha256_encode_hex(result);
console.log("sha256_final:" + tmpStr);

测试结果:

sha256_final:808d90e4e1646dbe9af4edad8a45c446eb86888b0426e2c6855890189cf90f22


http://www.mrgr.cn/news/56782.html

相关文章:

  • 黑马javaWeb笔记重点备份11:Web请求与响应
  • 找剪辑中的BGM、音效,就上这8个网站
  • 想让服务端请求更高效?为什么说alova比axios更胜一筹?
  • C++11
  • 我与Linux的爱恋:进程程序替换
  • 人工智能岗位英语面试 - 如何确保模型的可靠性和性能
  • QT界面开发:图形化设计、资源文件添加
  • SegFormer模型实现医学影像图像分割
  • 记一行代码顺序引起的事故
  • 梳理一下spring中,与message相关的知识点
  • Unity中使用UnityEvent遇到Bug
  • 每日一练 —— map习题
  • 软件测试学习笔记丨Selenium学习笔记:元素定位与操作
  • Mbox网关在风力发电产业:破除痛点,驱动收益
  • dump文件生成代码
  • 编程新手小白入门最佳攻略
  • 【MATLAB源码-第187期】基于matlab的人工蜂群优化算法(ABC)机器人栅格路径规划,输出做短路径图和适应度曲线。
  • PC版Windows电脑微信双开|微信分身神器|同一台电脑端微信分身微信多开
  • 高频电源模块HXT240D10直流屏充电模块HXT240D05整流器HXT120D10
  • 国产数据库正在崛起,为什么少不了OceanBase?