Commit ced5769b authored by xinzhedeai's avatar xinzhedeai

爱山东获取用户信息 加密授权版本

parent 27e5d7cd
......@@ -7,6 +7,10 @@
content="width=device-width, initial-scale=1.0, user-scalable=no, minimum-scale=1.0, maximum-scale=1.0, viewprot-fit:cover">
<title>高区应急系统-首页</title>
<script type="text/javascript" src="./js/includeHead.js"></script>
<script type="text/javascript" src="//cdn.bootcdn.net/ajax/libs/eruda/2.4.1/eruda.js"></script>
<script>
eruda.init();
</script>
<style>
.wrapper .item {
width: 7.5rem;
......@@ -49,6 +53,10 @@
</style>
</head>
<body>
<script type="text/javascript" src="https://isdapp.shandong.gov.cn/jmopen/jssdk/index.js"></script>
<script type="text/javascript" src="js/jssdk2/aes.js"></script>
<script type='text/javascript' src="js/jssdk2/sm2/build/SM.js"></script>
<script type="text/javascript" src="js/jssdk2/index.js"></script>
<div id="app">
<div class="wrapper">
<div class="">
......
......@@ -9,10 +9,20 @@ window.addEventListener("load", function() {
}
},
mounted() {
http2.post({
serviceId: 'gqyjglptthHiddenDanger',
interfacePublicKey: "041a0802713d674bfc3db46293d83e2b3ebe99cd0ee9b5ae507a0aa07f41cd8bf1407d8c16fab3ceb28bfa233452417373ac0c7864e085895a27b4ebf14b2eb3b1",
interfacePrivateKey: "73ae80b0f34740ce795821bf4354f1621e4ab7d01d9f3f7fc7c05e52c527c528",
reqParams: {id: '4234234'}
}, function(res){
if(res){
console.log('接口回调数据', JSON.parse(res))
}
})
},
methods: {
nav(type){
gemhoUtil.navigatePage('./views/'+ type +'.html')
gemhoUtil.navigatePage('./src/'+ type +'.html')
},
},
});
......
/** 爱山东网管请求封装
* 请求拦截、相应拦截、错误统一处理
*/
// const appmark = "sdzwapp"
var http2 = {
post: function(params, fn) {
/**
* 网关验签接口
* @param {1} = appid应用唯一标识
* @param {2} = interfaceid接口唯一标识
* @param {3} = interfacecontent接口参数,请使用json格式, 例如:{"siteid":"2","cateid":"1"}
* @param {4} = fromport端口来源"0":PC;"1":APP;"2":支付宝;"3":微信
* @param {5} = signurl签名接口地址
* @param {6} = gatewayurl网关接口地址
* @param {7} = extraData 额外参数,附件,请求头一类的参数
*
*/
// var params = '{"ticket":"' + ticket + '"}'
// const interfaceContent = {
// app_id: appmark,
// servicename: "ticketValidate",
// params: params
// }
// var params = '{"ticket":"' + ticket + '"}'
// debugger
const interfaceContent = {
// app_id: appmark,
// servicename: param.serviceId, // "ticketValidate",
params: SM.decrypt(JSON.stringify(params.reqParams), params.interfacePublicKey)
}
const data = SM.encrypt(JSON.stringify(params.reqParams), params.interfacePublicKey)
// const data = JSON.stringify(params.reqParams)
console.log('http2方法进来了', JSON.stringify(params.reqParams))
const headers = {
Authorization: "Bearer eyJhbGciOiJIUzUxMiJ9.eyJqdGkiOiI0ODA3ODFkZmQxYmE0MmM0OGQyZDQ5NTllYzcyYTUwNCIsInVzZXIiOiJqYyIsInN1YiI6ImpjIn0.WfLq11T7iWPiMuzqDY2N54aIqdv-ciYCe6pINqQAeBdqlMiJmkufsqlD2YMmUzsHA-o4WerkiSYnPzexEMiAJA"
}
const extraData = {
header: {
Authorization: "Bearer eyJhbGciOiJIUzUxMiJ9.eyJqdGkiOiI0ODA3ODFkZmQxYmE0MmM0OGQyZDQ5NTllYzcyYTUwNCIsInVzZXIiOiJqYyIsInN1YiI6ImpjIn0.WfLq11T7iWPiMuzqDY2N54aIqdv-ciYCe6pINqQAeBdqlMiJmkufsqlD2YMmUzsHA-o4WerkiSYnPzexEMiAJA"
},
}
// vaildInterfacefn("jisnzjk", "ticketvalidate", JSON.stringify(interfaceContent), "1", "https://" + urldomaincreatesign, "https://" + urldomaingateway).then((value) => {
// vaildInterfaceWithHeadersfn(appid, interfaceid, interfacecontent, fromport, headers, signurl, gatewayurl)
// vaildInterfaceWithHeadersfn("gqyjglptxiefn", params.serviceId, data, "1", headers, "https://" + urldomaincreatesign, "https://" + urldomaingateway).then((value) => {
// vaildInterfacefn("gqyjglptxiefn", params.serviceId, data, "1", "https://" + urldomaincreatesign, "https://" + urldomaingateway).then((value) => {
vaildInterfacefn("gqyjglptxiefn", params.serviceId, data, "1", extraData).then((value) => {
if(value.code === '401'){
vant.Dialog.alert({
title: '信息提示',
message: value.msg,
})
return
}
console.log('vaildInterfacefn响应', value)
/**
* code: 200
data: "048b04671ad85e52e" // value 值就是接口返回的data值
msg: "请求成功"
success: true
*/
let sm2_encrypt_result = value
let sm2_decrypt_result = sm2_Decrypt(sm2_encrypt_result, params.interfacePrivateKey)
console.log('vaildInterfacefn响应解密', sm2_decrypt_result)
fn && fn(sm2_decrypt_result)
})
},
}
\ No newline at end of file
......@@ -19,7 +19,7 @@ document.write('<script type="text/javascript" src="' + contextPath + '/js/vue.m
<script type="text/javascript" src="' + contextPath + '/js/flexible.js"></script>\
<script type="text/javascript" src="' + contextPath + '/js/util.js?rev=' + jsVersion + '"></script>\
<script type="text/javascript" src="' + contextPath + '/js/common.js?rev=' + jsVersion + '"></script>\
<script type="text/javascript" src="' + contextPath + '/js/http.js?rev=' + jsVersion + '"></script>');
<script type="text/javascript" src="' + contextPath + '/js/http2.js?rev=' + jsVersion + '"></script>');
......
This diff is collapsed.
let urlCreatesign = urldomaincreatesign
let urlGateway = urldomaingateway
const appmark = "sdzwapp"
const appword = "aKd20dbGdFvmuwrt"
let userType = "1" //用户类型 1个人 2法人
window.onload = function () {
getUserInfo()
}
/**
* 通过jssdk方法获取APP本地用户票据
*/
function getUserInfo() {
lightAppJssdk.user.getTicket({
success: function (data) {
//成功回调
console.log(JSON.stringify(data))
if (data == "未登录") {
onLoginApp() //APP用户未登录,调用登录页面
} else {
var jsonData = JSON.parse(data)
if (jsonData.retcode == "000000") {
var dataValueObj = JSON.parse(jsonData.data)
var ticket = dataValueObj.ticket //解析出用户票据信息
userType = dataValueObj.usertype //解析保存用户类型(个人法人)
getUserToken(ticket)
}
}
},
fail: function (data) {
//错误返回
console.log(JSON.stringify(data))
}
})
}
/**
* 使用jssdk调用登录页面
*/
function onLoginApp() {
lightAppJssdk.user.loginapp({
success: function (data) {
if (data == "未登录") {
//取消登录或登录失败,关闭页面
oncloseWindow()
} else {
var dataObj = JSON.parse(data)
if (dataObj.retcode == "000000") {
//登录成功,返回用户的票据和用户类型
var dataValueObj = JSON.parse(dataObj.data)
getUserToken(dataValueObj.ticket) //解析出用户票据信息
userType = jsonData.usertype //解析保存用户类型(个人法人)
} else {
//关闭页面
oncloseWindow()
}
}
},
fail: function (data) {
//关闭页面
oncloseWindow()
}
})
}
/**
* 通过用户票据获取用户的令牌数据,票据使用一次后失效,token时效性较长
*/
function getUserToken(ticket) {
var params = '{"ticket":"' + ticket + '"}'
const interfaceContent = {
app_id: appmark,
servicename: "ticketValidate",
params: params
}
vaildInterfacefn("jisnzjk", "ticketvalidate", JSON.stringify(interfaceContent), "1", "https://" + urlCreatesign, "https://" + urlGateway).then((value) => {
const data = JSON.parse(value)
if (data.retcode == "000000") {
const userToken = JSON.parse(data.data).token
if (userType == "1") {
//个人类型获取用户信息
getUserInfoByToken(userToken)
} else {
//法人类型获取用户信息
findCorUserByToken(userToken)
}
} else {
lightAppJssdk.notification.alert({
title: "提示", //可传空
message: data.msg,
buttonName: "确认",
success: function (data) {
oncloseWindow()
}
})
}
})
}
/**
* 根据令牌获取个人完整信息
*/
function getUserInfoByToken(userToken) {
const params = '{"token":"' + userToken + '"}'
const interfaceContent = {
app_id: appmark,
servicename: "findOutsideUserByToken",
params: params
}
try {
vaildInterfacefn("jisnzjk", "findoutsideuserbytoken", JSON.stringify(interfaceContent), "2", "https://" + urlCreatesign, "https://" + urlGateway).then((value) => {
const data = JSON.parse(value)
if (data.retcode == "000000") {
const userInfo = data.data
const userObj = JSON.parse(userInfo)
document.getElementById("name").innerText = userObj.name
document.getElementById("cardid").innerText = userObj.papersnumber
document.getElementById("mobile").innerText = userObj.mobile
} else {
}
})
} catch (error) {}
}
/**
* 根据令牌获取完整法人信息
*/
function findCorUserByToken(userToken) {
try {
const params = '{"token":"' + userToken + '"}'
const interfaceContent = {
app_id: appmark,
servicename: "findCorUserByToken",
params: params
}
vaildInterfacefn("jisnzjk", "findcoruserytoken", JSON.stringify(interfaceContent), "2", "https://" + urlCreatesign, "https://" + urlGateway).then((value) => {
const data = JSON.parse(value)
if (data.retcode == "000000") {
const userInfo = JSON.stringify(data.data)
document.getElementById("userinfo").innerText = userInfo
} else {
}
})
} catch (err) {}
}
/**
* 关闭容器
*/
function oncloseWindow() {
lightAppJssdk.navigation.close({
success: function (data) {},
fail: function (data) {}
})
}
/**
* AES解密
*/
function Decrypt(word, key) {
var key = CryptoJS.enc.Utf8.parse(key) //转为128bit
var srcs = CryptoJS.enc.Hex.parse(word) //转为16进制
var str = CryptoJS.enc.Base64.stringify(srcs) //变为Base64编码的字符串
var decrypt = CryptoJS.AES.decrypt(str, key, {
mode: CryptoJS.mode.ECB,
spadding: CryptoJS.pad.Pkcs7
})
return decrypt.toString(CryptoJS.enc.Utf8)
}
This diff is collapsed.
This diff is collapsed.
const appword = "aKd20dbGdFvmuwrt" // 固定值
window.onload = function() {
getUserInfo()
}
function getUserInfo() {
lightAppJssdk.user.getUserInfoWithEncryptedParamByAppId({
appId: "whsdsjzxsfrzdjqwsczptsr", //"gqyjglptxiefn", // 接入方在成功创建应用后自动生成
success: function(data) {
if (data == '未登录') onLoginApp()
else {
if (typeof data == 'string')
data = JSON.parse(data)
console.log('请求成功的数据', data)
// 对于该方法的返回结果,需要进行两步解密才能得到明文用户信息,
// 先对返回结果进行sm2解密,需要用到 接入方在创建应用时,选择应用的加密方式为sm2,并成功创建应用后,拿到的应用私钥来进行解密
const sm2_privateKey = '145e8920d0ec9b60eaaa73a208e711a68e8aa614b786e45d3eb7eca850ba7843'
let sm2_encrypt_result = data.data
let sm2_decrypt_result = sm2_Decrypt(sm2_encrypt_result, sm2_privateKey)
if (typeof sm2_decrypt_result == 'string')
sm2_decrypt_result = JSON.parse(sm2_decrypt_result)
// 其次,对sm2解密后的结果进行 aes解密
// aes解密需要用到 appword , 为固定值,使用示例代码中的即可
let aes_encrypt_result = sm2_decrypt_result.data
let aes_decrypt_result = aes_Decrypt(aes_encrypt_result, appword)
// 请求获取高区应急后台真是token,传参,授权获取的用户信息
http2.post({
serviceId: 'gqyjglptthHiddenDanger',
interfacePublicKey: "041a0802713d674bfc3db46293d83e2b3ebe99cd0ee9b5ae507a0aa07f41cd8bf1407d8c16fab3ceb28bfa233452417373ac0c7864e085895a27b4ebf14b2eb3b1",
interfacePrivateKey: "73ae80b0f34740ce795821bf4354f1621e4ab7d01d9f3f7fc7c05e52c527c528",
reqParams: {id: '4234234'}
}, function(res){
if(res){
console.log('接口回调数据', JSON.parse(res))
// 存储后台返回token存储本地localstorage
}
})
}
},
fail: function(data) {
}
});
}
/**
* 使用jssdk调用登录页面
*/
function onLoginApp() {
lightAppJssdk.user.loginapp({
success: function(data) {
if (data == "未登录") {
//取消登录或登录失败,关闭页面
oncloseWindow()
} else {
getUserInfo()
}
},
fail: function(data) {
//关闭页面
oncloseWindow()
}
})
}
/**
* 关闭容器
*/
function oncloseWindow() {
lightAppJssdk.navigation.close({
success: function(data) {},
fail: function(data) {}
})
}
// aes解密
function aes_Decrypt(word, key) {
var key = CryptoJS.enc.Utf8.parse(key) //转为128bit
var srcs = CryptoJS.enc.Hex.parse(word) //转为16进制
var str = CryptoJS.enc.Base64.stringify(srcs) //变为Base64编码的字符串
var decrypt = CryptoJS.AES.decrypt(str, key, {
mode: CryptoJS.mode.ECB,
spadding: CryptoJS.pad.Pkcs7
})
return decrypt.toString(CryptoJS.enc.Utf8)
}
// sm2解密,需要创建加密应用时的私钥
function sm2_Decrypt(word, key) {
return SM.decrypt(word, key)
}
\ No newline at end of file
var hexcase = 0;
var b64pad = "";
var chrsz = 8;
function hex_md5(s){ return binl2hex(core_md5(str2binl(s), s.length * chrsz));}
function b64_md5(s){ return binl2b64(core_md5(str2binl(s), s.length * chrsz));}
function hex_hmac_md5(key, data) { return binl2hex(core_hmac_md5(key, data)); }
function b64_hmac_md5(key, data) { return binl2b64(core_hmac_md5(key, data)); }
function calcMD5(s){ return binl2hex(core_md5(str2binl(s), s.length * chrsz));}
function md5_vm_test()
{
return hex_md5("abc") == "900150983cd24fb0d6963f7d28e17f72";
}
function core_md5(x, len)
{
x[len >> 5] |= 0x80 << ((len) % 32);
x[(((len + 64) >>> 9) << 4) + 14] = len;
var a = 1732584193;
var b = -271733879;
var c = -1732584194;
var d = 271733878;
for(var i = 0; i < x.length; i += 16)
{
var olda = a;
var oldb = b;
var oldc = c;
var oldd = d;
a = md5_ff(a, b, c, d, x[i+ 0], 7 , -680876936);
d = md5_ff(d, a, b, c, x[i+ 1], 12, -389564586);
c = md5_ff(c, d, a, b, x[i+ 2], 17, 606105819);
b = md5_ff(b, c, d, a, x[i+ 3], 22, -1044525330);
a = md5_ff(a, b, c, d, x[i+ 4], 7 , -176418897);
d = md5_ff(d, a, b, c, x[i+ 5], 12, 1200080426);
c = md5_ff(c, d, a, b, x[i+ 6], 17, -1473231341);
b = md5_ff(b, c, d, a, x[i+ 7], 22, -45705983);
a = md5_ff(a, b, c, d, x[i+ 8], 7 , 1770035416);
d = md5_ff(d, a, b, c, x[i+ 9], 12, -1958414417);
c = md5_ff(c, d, a, b, x[i+10], 17, -42063);
b = md5_ff(b, c, d, a, x[i+11], 22, -1990404162);
a = md5_ff(a, b, c, d, x[i+12], 7 , 1804603682);
d = md5_ff(d, a, b, c, x[i+13], 12, -40341101);
c = md5_ff(c, d, a, b, x[i+14], 17, -1502002290);
b = md5_ff(b, c, d, a, x[i+15], 22, 1236535329);
a = md5_gg(a, b, c, d, x[i+ 1], 5 , -165796510);
d = md5_gg(d, a, b, c, x[i+ 6], 9 , -1069501632);
c = md5_gg(c, d, a, b, x[i+11], 14, 643717713);
b = md5_gg(b, c, d, a, x[i+ 0], 20, -373897302);
a = md5_gg(a, b, c, d, x[i+ 5], 5 , -701558691);
d = md5_gg(d, a, b, c, x[i+10], 9 , 38016083);
c = md5_gg(c, d, a, b, x[i+15], 14, -660478335);
b = md5_gg(b, c, d, a, x[i+ 4], 20, -405537848);
a = md5_gg(a, b, c, d, x[i+ 9], 5 , 568446438);
d = md5_gg(d, a, b, c, x[i+14], 9 , -1019803690);
c = md5_gg(c, d, a, b, x[i+ 3], 14, -187363961);
b = md5_gg(b, c, d, a, x[i+ 8], 20, 1163531501);
a = md5_gg(a, b, c, d, x[i+13], 5 , -1444681467);
d = md5_gg(d, a, b, c, x[i+ 2], 9 , -51403784);
c = md5_gg(c, d, a, b, x[i+ 7], 14, 1735328473);
b = md5_gg(b, c, d, a, x[i+12], 20, -1926607734);
a = md5_hh(a, b, c, d, x[i+ 5], 4 , -378558);
d = md5_hh(d, a, b, c, x[i+ 8], 11, -2022574463);
c = md5_hh(c, d, a, b, x[i+11], 16, 1839030562);
b = md5_hh(b, c, d, a, x[i+14], 23, -35309556);
a = md5_hh(a, b, c, d, x[i+ 1], 4 , -1530992060);
d = md5_hh(d, a, b, c, x[i+ 4], 11, 1272893353);
c = md5_hh(c, d, a, b, x[i+ 7], 16, -155497632);
b = md5_hh(b, c, d, a, x[i+10], 23, -1094730640);
a = md5_hh(a, b, c, d, x[i+13], 4 , 681279174);
d = md5_hh(d, a, b, c, x[i+ 0], 11, -358537222);
c = md5_hh(c, d, a, b, x[i+ 3], 16, -722521979);
b = md5_hh(b, c, d, a, x[i+ 6], 23, 76029189);
a = md5_hh(a, b, c, d, x[i+ 9], 4 , -640364487);
d = md5_hh(d, a, b, c, x[i+12], 11, -421815835);
c = md5_hh(c, d, a, b, x[i+15], 16, 530742520);
b = md5_hh(b, c, d, a, x[i+ 2], 23, -995338651);
a = md5_ii(a, b, c, d, x[i+ 0], 6 , -198630844);
d = md5_ii(d, a, b, c, x[i+ 7], 10, 1126891415);
c = md5_ii(c, d, a, b, x[i+14], 15, -1416354905);
b = md5_ii(b, c, d, a, x[i+ 5], 21, -57434055);
a = md5_ii(a, b, c, d, x[i+12], 6 , 1700485571);
d = md5_ii(d, a, b, c, x[i+ 3], 10, -1894986606);
c = md5_ii(c, d, a, b, x[i+10], 15, -1051523);
b = md5_ii(b, c, d, a, x[i+ 1], 21, -2054922799);
a = md5_ii(a, b, c, d, x[i+ 8], 6 , 1873313359);
d = md5_ii(d, a, b, c, x[i+15], 10, -30611744);
c = md5_ii(c, d, a, b, x[i+ 6], 15, -1560198380);
b = md5_ii(b, c, d, a, x[i+13], 21, 1309151649);
a = md5_ii(a, b, c, d, x[i+ 4], 6 , -145523070);
d = md5_ii(d, a, b, c, x[i+11], 10, -1120210379);
c = md5_ii(c, d, a, b, x[i+ 2], 15, 718787259);
b = md5_ii(b, c, d, a, x[i+ 9], 21, -343485551);
a = safe_add(a, olda);
b = safe_add(b, oldb);
c = safe_add(c, oldc);
d = safe_add(d, oldd);
}
return Array(a, b, c, d);
}
function md5_cmn(q, a, b, x, s, t)
{
return safe_add(bit_rol(safe_add(safe_add(a, q), safe_add(x, t)), s),b);
}
function md5_ff(a, b, c, d, x, s, t)
{
return md5_cmn((b & c) | ((~b) & d), a, b, x, s, t);
}
function md5_gg(a, b, c, d, x, s, t)
{
return md5_cmn((b & d) | (c & (~d)), a, b, x, s, t);
}
function md5_hh(a, b, c, d, x, s, t)
{
return md5_cmn(b ^ c ^ d, a, b, x, s, t);
}
function md5_ii(a, b, c, d, x, s, t)
{
return md5_cmn(c ^ (b | (~d)), a, b, x, s, t);
}
function core_hmac_md5(key, data)
{
var bkey = str2binl(key);
if(bkey.length > 16) bkey = core_md5(bkey, key.length * chrsz);
var ipad = Array(16), opad = Array(16);
for(var i = 0; i < 16; i++)
{
ipad[i] = bkey[i] ^ 0x36363636;
opad[i] = bkey[i] ^ 0x5C5C5C5C;
}
var hash = core_md5(ipad.concat(str2binl(data)), 512 + data.length * chrsz);
return core_md5(opad.concat(hash), 512 + 128);
}
function safe_add(x, y)
{
var lsw = (x & 0xFFFF) + (y & 0xFFFF);
var msw = (x >> 16) + (y >> 16) + (lsw >> 16);
return (msw << 16) | (lsw & 0xFFFF);
}
function bit_rol(num, cnt)
{
return (num << cnt) | (num >>> (32 - cnt));
}
function str2binl(str)
{
var bin = Array();
var mask = (1 << chrsz) - 1;
for(var i = 0; i < str.length * chrsz; i += chrsz)
bin[i>>5] |= (str.charCodeAt(i / chrsz) & mask) << (i%32);
return bin;
}
function binl2hex(binarray)
{
var hex_tab = hexcase ? "0123456789ABCDEF" : "0123456789abcdef";
var str = "";
for(var i = 0; i < binarray.length * 4; i++)
{
str += hex_tab.charAt((binarray[i>>2] >> ((i%4)*8+4)) & 0xF) +
hex_tab.charAt((binarray[i>>2] >> ((i%4)*8 )) & 0xF);
}
return str;
}
function binl2b64(binarray)
{
var tab = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
var str = "";
for(var i = 0; i < binarray.length * 4; i += 3)
{
var triplet = (((binarray[i >> 2] >> 8 * ( i %4)) & 0xFF) << 16)
| (((binarray[i+1 >> 2] >> 8 * ((i+1)%4)) & 0xFF) << 8 )
| ((binarray[i+2 >> 2] >> 8 * ((i+2)%4)) & 0xFF);
for(var j = 0; j < 4; j++)
{
if(i * 8 + j * 6 > binarray.length * 32) str += b64pad;
else str += tab.charAt((triplet >> 6*(3-j)) & 0x3F);
}
}
return str;
}
\ No newline at end of file
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
/*
* sm3-1.0.js
*
* Copyright (c) 2019 RuXing Liang
*/
/**
* @name sm3-1.0.js
* @author RuXing Liang
* @version 1.0.0 (2019-04-16)
*/
//加密数据不能超过500M
function SM3Digest(){
this.ivByte = new Array( 0x73, 0x80, 0x16, 0x6f, 0x49,
0x14, 0xb2, 0xb9, 0x17, 0x24, 0x42, 0xd7,
0xda, 0x8a, 0x06, 0x00, 0xa9, 0x6f, 0x30,
0xbc, 0x16, 0x31, 0x38, 0xaa, 0xe3,
0x8d, 0xee, 0x4d, 0xb0, 0xfb, 0x0e,
0x4e );
this.iv = byteArrayToIntArray(
this.ivByte
);
this.tj = new Array(64);
this.BLOCK_BYTE_LEN = 64;
this.vbuf = new Array(8);
//数据缓冲区
this.dataBuf = new Array(64);
//缓冲区长度
this.dataBufLen = 0;
//缓冲区总长度
this.totalLen = 0;//事实上需要long,后续需改进
for(var i = 0;i<64;i++) {
if(i<=15) {
this.tj[i] = 0x79cc4519;
}else {
this.tj[i] = 0x7a879d8a;
}
}
arrayCopy(this.iv, 0, this.vbuf, 0, this.vbuf.length);
}
SM3Digest.prototype = {
ffj:function(x,y,z,i){
var tmp;
if(i<=15) {
tmp = x^y^z;
}else{
tmp = (x&y)|(x&z)|(y&z);
}
return tmp;
},
ggj:function(x,y,z,i){
var tmp = 0;
if(i<=15) {
tmp = x^y^z;
}else {
tmp = (x&y)|(~x&z);
}
return tmp;
},
p0:function(x) {
//这里的公式是:对于一个二进制有n位的数字循环左移(循环右移)m位,
//可以将此数字左移(无符号右移)m位的结果与此数字 无符号 右移(左移)n-m位的结果进行或操作。
return x^(x<<9|(x>>>(32-9)))^(x<<17|(x>>>(32-17)));
},
p1:function(x) {
//这里的公式是:对于一个二进制有n位的数字循环左移(循环右移)m位,
//可以将此数字左移(无符号右移)m位的结果与此数字 无符号 右移(左移)n-m位的结果进行或操作。
return x^(x<<15|(x>>>(32-15)))^(x<<23|(x>>>(32-23)));
},
/**
* 循环左移
*/
cycleLeft:function(x,moveLen) {
return x<<moveLen|(x>>>(32-moveLen));
},
/**
* 消息填充函数
* @param data
* @return
*/
padding:function(data) {
var k = 0;
var len = data.length;
var padding;
k = 64 - (len + 1 + 8)%64;
if(k>=64) {
k = 0;
}
padding = new Array(k+1+len+8);
padding[len] = 1<<7;
arrayCopy(data, 0, padding, 0, len);
arrayCopy(longToByte(this.totalLen<<3), 0, padding, len+k+1, 8);
return padding;
},
/**
* 对数据进行分组迭代,每64个字节迭代一次
* <br>1、对消息进行分组,由于是int类型,则每16个分一组,对每一组再调用{@link #expand}进行拓展
* <br>2、使用上一轮的迭代结果V,调用{@link #cf}进行本轮迭代
* <br>3、最后一轮迭代结果复制进缓冲区vbuf
* @param message
*/
iterate:function(message) {
var len = message.length;
var n = parseInt(len/16);
var v,b;
var ep;
v = this.vbuf;
b = new Array(16);
for(var i = 0;i<n;i++) {
arrayCopy(message, i*16, b, 0, b.length);
ep = this.expand(b);
v = this.cf(v, ep[0], ep[1]);
}
arrayCopy(v, 0, this.vbuf, 0, v.length);
},
/**
* 消息数据拓展函数
* @param b
* @return
*/
expand:function(b) {
var w1 = new Array(68);
var w2 = new Array(64);
arrayCopy(b, 0, w1, 0, b.length);
for(var i = 16;i<w1.length;i++) {
w1[i] = this.p1(w1[i-16]^w1[i-9]^this.cycleLeft(w1[i-3], 15))^this.cycleLeft(w1[i-13],7)^w1[i-6];
}
for(var i = 0;i<w2.length;i++) {
w2[i] = w1[i]^w1[i+4];
}
return new Array(w1,w2);
},
/**
* 迭代压缩函数
*
* @param v
* @param w1
* @param w2
* @return
*/
cf:function(v,w1,w2) {
var result;
var a,b,c,d,e,f,g,h,ss1,ss2,tt1,tt2;
a = v[0];
b = v[1];
c = v[2];
d = v[3];
e = v[4];
f = v[5];
g = v[6];
h = v[7];
for(var i = 0;i<64;i++) {
ss1 = this.cycleLeft(this.cycleLeft(a, 12)+e+this.cycleLeft(this.tj[i], i),7);
ss2 = ss1^this.cycleLeft(a, 12);
tt1 = this.ffj(a, b, c,i)+d+ss2+w2[i];
tt2 = this.ggj(e,f,g,i)+h+ss1+w1[i];
d = c;
c = this.cycleLeft(b, 9);
b = a;
a = tt1;
h = g;
g = this.cycleLeft(f, 19);
f = e;
e = this.p0(tt2);
}
result = new Array(8);
result[0] = a^v[0];
result[1] = b^v[1];
result[2] = c^v[2];
result[3] = d^v[3];
result[4] = e^v[4];
result[5] = f^v[5];
result[6] = g^v[6];
result[7] = h^v[7];
return result;
},
digest:function(data) {
var mac;
var padding = this.padding(data);
var paddingInt = byteArrayToIntArray(padding);
this.iterate(paddingInt);
var macInt = this.vbuf;
mac = intArrayToByteArray(macInt);
return mac;
},
update:function(data,pos,len) {
var loop = parseInt((len+this.dataBufLen)/64);//向下取整
this.totalLen += len;
if(len+this.dataBufLen<this.BLOCK_BYTE_LEN) {
arrayCopy(data, 0, this.dataBuf, this.dataBufLen, len);
this.dataBufLen = len+this.dataBufLen;
}else {
var dataInt;
arrayCopy(data, 0 , this.dataBuf, this.dataBufLen, this.BLOCK_BYTE_LEN-this.dataBufLen);
dataInt = byteArrayToIntArray(this.dataBuf);
this.iterate(dataInt);
for(var i = 1;i<loop;i++) {
arrayCopy(data, i*this.BLOCK_BYTE_LEN-this.dataBufLen, this.dataBuf, 0, this.BLOCK_BYTE_LEN);
dataInt = byteArrayToIntArray(this.dataBuf);
this.iterate(dataInt);
}
arrayCopy(data, loop*this.BLOCK_BYTE_LEN-this.dataBufLen , this.dataBuf, 0, len-(loop*this.BLOCK_BYTE_LEN-this.dataBufLen));
this.dataBufLen = len-(loop*this.BLOCK_BYTE_LEN-this.dataBufLen);
}
},
doFinal:function() {
var mac;
var finalData = new Array(this.dataBufLen);
arrayCopy(this.dataBuf, 0, finalData, 0, this.dataBufLen);
//对不足64字节的数据进行填充
var paddingArr = this.padding(finalData);
var paddingInt = byteArrayToIntArray(paddingArr);
this.iterate(paddingInt);
var macInt = this.vbuf;
mac = intArrayToByteArray(macInt);
return mac;
}
}
\ No newline at end of file
/*
* sm4-1.0.js
*
* Copyright (c) 2019 RuXing Liang
*/
/**
* @name sm4-1.0.js
* @author RuXing Liang
* @version 1.0.0 (2019-04-19)
*/
var debug = false;
function SM4(){
this.sbox = new Array(
0xd6,0x90,0xe9,0xfe,0xcc,0xe1,0x3d,0xb7,0x16,0xb6,0x14,0xc2,0x28,0xfb,0x2c,0x05,
0x2b,0x67,0x9a,0x76,0x2a,0xbe,0x04,0xc3,0xaa,0x44,0x13,0x26,0x49,0x86,0x06,0x99,
0x9c,0x42,0x50,0xf4,0x91,0xef,0x98,0x7a,0x33,0x54,0x0b,0x43,0xed,0xcf,0xac,0x62,
0xe4,0xb3,0x1c,0xa9,0xc9,0x08,0xe8,0x95,0x80,0xdf,0x94,0xfa,0x75,0x8f,0x3f,0xa6,
0x47,0x07,0xa7,0xfc,0xf3,0x73,0x17,0xba,0x83,0x59,0x3c,0x19,0xe6,0x85,0x4f,0xa8,
0x68,0x6b,0x81,0xb2,0x71,0x64,0xda,0x8b,0xf8,0xeb,0x0f,0x4b,0x70,0x56,0x9d,0x35,
0x1e,0x24,0x0e,0x5e,0x63,0x58,0xd1,0xa2,0x25,0x22,0x7c,0x3b,0x01,0x21,0x78,0x87,
0xd4,0x00,0x46,0x57,0x9f,0xd3,0x27,0x52,0x4c,0x36,0x02,0xe7,0xa0,0xc4,0xc8,0x9e,
0xea,0xbf,0x8a,0xd2,0x40,0xc7,0x38,0xb5,0xa3,0xf7,0xf2,0xce,0xf9,0x61,0x15,0xa1,
0xe0,0xae,0x5d,0xa4,0x9b,0x34,0x1a,0x55,0xad,0x93,0x32,0x30,0xf5,0x8c,0xb1,0xe3,
0x1d,0xf6,0xe2,0x2e,0x82,0x66,0xca,0x60,0xc0,0x29,0x23,0xab,0x0d,0x53,0x4e,0x6f,
0xd5,0xdb,0x37,0x45,0xde,0xfd,0x8e,0x2f,0x03,0xff,0x6a,0x72,0x6d,0x6c,0x5b,0x51,
0x8d,0x1b,0xaf,0x92,0xbb,0xdd,0xbc,0x7f,0x11,0xd9,0x5c,0x41,0x1f,0x10,0x5a,0xd8,
0x0a,0xc1,0x31,0x88,0xa5,0xcd,0x7b,0xbd,0x2d,0x74,0xd0,0x12,0xb8,0xe5,0xb4,0xb0,
0x89,0x69,0x97,0x4a,0x0c,0x96,0x77,0x7e,0x65,0xb9,0xf1,0x09,0xc5,0x6e,0xc6,0x84,
0x18,0xf0,0x7d,0xec,0x3a,0xdc,0x4d,0x20,0x79,0xee,0x5f,0x3e,0xd7,0xcb,0x39,0x48
);
this.fk = new Array(0xa3b1bac6, 0x56aa3350, 0x677d9197, 0xb27022dc);
this.ck = new Array(
0x00070e15,0x1c232a31,0x383f464d,0x545b6269,
0x70777e85,0x8c939aa1,0xa8afb6bd,0xc4cbd2d9,
0xe0e7eef5,0xfc030a11,0x181f262d,0x343b4249,
0x50575e65,0x6c737a81,0x888f969d,0xa4abb2b9,
0xc0c7ced5,0xdce3eaf1,0xf8ff060d,0x141b2229,
0x30373e45,0x4c535a61,0x686f767d,0x848b9299,
0xa0a7aeb5,0xbcc3cad1,0xd8dfe6ed,0xf4fb0209,
0x10171e25,0x2c333a41,0x484f565d,0x646b7279
);
}
SM4.prototype = {
expandKey:function(key){
var k = new Array(36);
var mk = byteArrayToIntArray(key);
k[0] = mk[0] ^ this.fk[0];
k[1] = mk[1] ^ this.fk[1];
k[2] = mk[2] ^ this.fk[2];
k[3] = mk[3] ^ this.fk[3];
var rk = new Array(32);
for (var i = 0; i < 32; i++)
{
k[(i + 4)] = (k[i] ^ this.T1(k[(i + 1)] ^ k[(i + 2)] ^ k[(i + 3)] ^ this.ck[i]));
rk[i] = k[(i + 4)];
}
return rk;
},
T1:function(ta){
var rk = 0;
var b = new Array(4);
var a = intToByte(ta);
b[0] = this.sbox[a[0] & 0xFF];
b[1] = this.sbox[a[1] & 0xFF];
b[2] = this.sbox[a[2] & 0xFF];
b[3] = this.sbox[a[3] & 0xFF];
var bint = byteToInt(b,0);
var rk = bint ^ (bint<<13|(bint>>>(32-13))) ^ (bint<<23|(bint>>>(32-23)));
return rk;
},
one_encrypt:function(rk, data){
var x = new Array(36);
x[0] = byteToInt(data, 0);
x[1] = byteToInt(data, 4);
x[2] = byteToInt(data, 8);
x[3] = byteToInt(data, 12);
for(var i = 0;i < 32;i++)
{
x[(i + 4)] = x[i] ^ this.T0(x[(i + 1)]^x[(i + 2)]^x[(i + 3)]^rk[i]);
}
var tmpx = new Array(4);
for(var i = 35;i >= 32;i--){
tmpx[35-i] = x[i];
}
var xbyte = intArrayToByteArray(tmpx);
return xbyte;
},
T0:function(ta){
var a = intToByte(ta);
var b = new Array(4);
b[0] = this.sbox[a[0] & 0xFF];
b[1] = this.sbox[a[1] & 0xFF];
b[2] = this.sbox[a[2] & 0xFF];
b[3] = this.sbox[a[3] & 0xFF];
var bint = byteToInt(b,0);
var c = bint ^ (bint<<2|(bint>>>(32-2))) ^ (bint<<10|(bint>>>(32-10))) ^ (bint<<18|(bint>>>(32-18))) ^ (bint<<24|(bint>>>(32-24)));
return c;
},
pkcs7padding:function(input,mode){
if (input == null)
{
return null;
}
var ret = null;
if (mode == 1)//填充
{
var p = 16 - input.length % 16;
ret = new Array(input.length + p);
arrayCopy(input, 0, ret, 0, input.length);
for (var i = 0; i < p; i++)
{
ret[input.length + i] = p;
}
}
else//去除填充
{
var p = input[input.length - 1];
ret = new Array(input.length - p);
arrayCopy(input, 0, ret, 0, input.length - p);
}
return ret;
},
encrypt_ecb:function(key,data){
if(key == undefined || key == null || key.length%16 != 0){
console.log("sm4 key is error!");
return null;
}
if(data == undefined || data == null || data.length <= 0){
console.log("data is error!");
return null;
}
var rk = this.expandKey(key);
/*if(debug){
var rkb = intArrayToByteArray(rk);
console.log(Hex.encode(rkb,0,rkb.length));
}*/
var blockLen = 16;
var loop = parseInt(data.length/blockLen);//注意不能整除会有小数,要取整
var cipher = new Array((loop+1)*blockLen);
var tmp = new Array(blockLen);
var oneCipher = null;
for(var i = 0;i<loop;i++){
arrayCopy(data,i*blockLen,tmp,0,blockLen);
oneCipher = this.one_encrypt(rk,tmp);
arrayCopy(oneCipher,0,cipher,i*blockLen,blockLen);
}
var lessData = new Array(data.length%blockLen);
if(lessData.length > 0){
arrayCopy(data,loop*blockLen,lessData,0,data.length%blockLen);
}
var padding = this.pkcs7padding(lessData,1);
oneCipher = this.one_encrypt(rk,padding);
arrayCopy(oneCipher,0,cipher,loop*blockLen,blockLen);
return cipher;
},
decrypt_ecb:function(key,data){
if(key == undefined || key == null || key.length%16 != 0){
console.log("sm4 key is error!");
return null;
}
if(data == undefined || data == null || data.length%16 != 0){
console.log("data is error!");
return null;
}
var rk = this.expandKey(key);
var nrk = new Array(32);
for(var i = 0;i<rk.length;i++){
nrk[i] = rk[32-i-1];
}
/*if(debug){
var rkb = intArrayToByteArray(rk);
console.log(Hex.encode(rkb,0,rkb.length));
}*/
var blockLen = 16;
var loop = data.length/blockLen - 1;
var tmp = new Array(blockLen);
var onePlain = null;
var plain = null;
//先解密最后一部分,确定数据长度
arrayCopy(data,loop*blockLen,tmp,0,blockLen);
onePlain = this.one_encrypt(nrk,tmp);
var lastPart = this.pkcs7padding(onePlain,0);
plain = new Array(loop*blockLen+lastPart.length);
arrayCopy(lastPart,0,plain,loop*blockLen,lastPart.length);
//解密剩下部分数据
for(var i = 0;i<loop;i++){
arrayCopy(data,i*blockLen,tmp,0,blockLen);
onePlain = this.one_encrypt(nrk,tmp);
arrayCopy(onePlain,0,plain,i*blockLen,blockLen);
}
return plain;
},
encrypt_cbc:function(key,iv,data){
if(key == undefined || key == null || key.length%16 != 0){
console.log("sm4 key is error!");
return null;
}
if(data == undefined || data == null || data.length <= 0){
console.log("data is error!");
return null;
}
if(iv == undefined || iv == null || iv.length%16 != 0){
console.log("iv is error!");
return null;
}
var rk = this.expandKey(key);
/*if(debug){
var rkb = intArrayToByteArray(rk);
console.log(Hex.encode(rkb,0,rkb.length));
}*/
var blockLen = 16;
var loop = parseInt(data.length/blockLen);//注意不能整除会有小数,要取整
var cipher = new Array((loop+1)*blockLen);
var tmp = new Array(blockLen);
var oneCipher = null;
for(var i = 0;i<loop;i++){
arrayCopy(data,i*blockLen,tmp,0,blockLen);
for(var j = 0;j<blockLen;j++){
tmp[j] = tmp[j] ^ iv[j];
}
iv = this.one_encrypt(rk,tmp);
arrayCopy(iv,0,cipher,i*blockLen,blockLen);
}
var lessData = new Array(data.length%blockLen);
if(lessData.length > 0){
arrayCopy(data,loop*blockLen,lessData,0,data.length%blockLen);
}
var padding = this.pkcs7padding(lessData,1);
for(var i = 0;i<blockLen;i++){
padding[i] = padding[i] ^ iv[i];
}
iv = this.one_encrypt(rk,padding);
arrayCopy(iv,0,cipher,loop*blockLen,blockLen);
return cipher;
},
decrypt_cbc:function(key,iv,data){
if(key == undefined || key == null || key.length%16 != 0){
console.log("sm4 key is error!");
return null;
}
if(data == undefined || data == null || data.length%16 != 0){
console.log("data is error!");
return null;
}
if(iv == undefined || iv == null || iv.length%16 != 0){
console.log("iv is error!");
return null;
}
var rk = this.expandKey(key);
var nrk = new Array(32);
for(var i = 0;i<rk.length;i++){
nrk[i] = rk[32-i-1];
}
/*if(debug){
var rkb = intArrayToByteArray(rk);
console.log(Hex.encode(rkb,0,rkb.length));
}*/
var blockLen = 16;
var loop = data.length/blockLen;
var tmp = new Array(blockLen);
var onePlain = null;
var plain = null;
//解密
plain = new Array(data.length);
for(var i = 0;i<loop;i++){
arrayCopy(data,i*blockLen,tmp,0,blockLen);
onePlain = this.one_encrypt(nrk,tmp);
for(var j = 0;j<blockLen;j++){
onePlain[j] = onePlain[j] ^ iv[j];
}
arrayCopy(tmp,0,iv,0,blockLen);
arrayCopy(onePlain,0,plain,i*blockLen,blockLen);
}
//去填充,确定数据长度
//arrayCopy(data,data.length-blockLen,tmp,0,blockLen);
var lastPart = this.pkcs7padding(onePlain,0);
var realPlain = new Array(plain.length-blockLen+lastPart.length);
arrayCopy(plain,0,realPlain,0,plain.length-blockLen);
arrayCopy(lastPart,0,realPlain,plain.length-blockLen,lastPart.length);
//先解密最后一部分,确定数据长度
/*arrayCopy(data,loop*blockLen,tmp,0,blockLen);
onePlain = this.one_encrypt(nrk,tmp);
for(var i = 0;i<blockLen;i++){
onePlain[i] = onePlain[i] ^ iv[i];
}
var lastPart = this.pkcs7padding(onePlain,0);
plain = new Array(loop*blockLen+lastPart.length);
arrayCopy(lastPart,0,plain,loop*blockLen,lastPart.length);
//解密剩下部分数据
for(var i = 0;i<loop;i++){
arrayCopy(data,i*blockLen,tmp,0,blockLen);
onePlain = this.one_encrypt(nrk,tmp);
arrayCopy(onePlain,0,plain,i*blockLen,blockLen);
}*/
return realPlain;
}
}
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
/*! (c) Tom Wu | http://www-cs-students.stanford.edu/~tjw/jsbn/
*/
// prng4.js - uses Arcfour as a PRNG
function Arcfour() {
this.i = 0;
this.j = 0;
this.S = new Array();
}
// Initialize arcfour context from key, an array of ints, each from [0..255]
function ARC4init(key) {
var i, j, t;
for(i = 0; i < 256; ++i)
this.S[i] = i;
j = 0;
for(i = 0; i < 256; ++i) {
j = (j + this.S[i] + key[i % key.length]) & 255;
t = this.S[i];
this.S[i] = this.S[j];
this.S[j] = t;
}
this.i = 0;
this.j = 0;
}
function ARC4next() {
var t;
this.i = (this.i + 1) & 255;
this.j = (this.j + this.S[this.i]) & 255;
t = this.S[this.i];
this.S[this.i] = this.S[this.j];
this.S[this.j] = t;
return this.S[(t + this.S[this.i]) & 255];
}
Arcfour.prototype.init = ARC4init;
Arcfour.prototype.next = ARC4next;
// Plug in your RNG constructor here
function prng_newstate() {
return new Arcfour();
}
// Pool size must be a multiple of 4 and greater than 32.
// An array of bytes the size of the pool will be passed to init()
var rng_psize = 256;
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
......@@ -204,3 +204,20 @@ gemhoUtil.navigatePage = function(path) {
}
location.href = url;
}
/**
* 爱山东下载方法
* @param {Object} url 下载文件全路径
* https://h5.tfryb.com/hos-server/pub/jmas/jmasbucket//jmopen_files/webapp/jssdk/be0c4a53adf04f9db4e39a303af78689.docx
*/
gemhoUtil.downloadFile(url) {
lightAppJssdk.download.downloadFiles({
filePath: 'https://h5.tfryb.com/hos-server/pub/jmas/jmasbucket//jmopen_files/webapp/jssdk/be0c4a53adf04f9db4e39a303af78689.docx',
success: function (data) {
alert(JSON.stringify(data))
},
fail: function (err) {
alert(JSON.stringify(err))
}
})
}
\ No newline at end of file
......@@ -120,6 +120,7 @@ window.addEventListener("load", function() {
}
this.editAble = this.form.hdStatus === 0 || this.form.hdStatus === 2 || this.form.hdStatus === 3
this.editAble = true
})
},
submit() {
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment