1、简介
1.1、国产加密算法,是一个分组算法,该算法的分组长度为128bit,密钥长度为128bit,SM4算法与AES算法具有相同的密钥长度分组长度128比特,因此在安全性上高于3DES算法
1.2、经过SM4加密的明文都需要经过32轮变换后变换为密文
2、实现
在项目中,我是直接执行的js,然后对js执行的调用,其中密钥是其他接口的响应体参数,这里先给出js
var each = function(object, callback) {
var type = (function() {
switch (object.constructor) {
case Object:
return 'Object';
break;
case Array:
return 'Array';
break;
case NodeList:
return 'NodeList';
break;
default:
return 'null';
break;
}
})();
if (type === 'Array' || type === 'NodeList') {
[].every.call(object, function(v, i) {
return callback.call(v, i, v) === false ? false : true;
});
} else if (type === 'Object') {
for (var i in object) {
if (callback.call(object[i], i, object[i]) === false) {
break;
}
}
}
}
sm4 = function(r) {
function n(e) {
if (t[e]) return t[e].exports;
var o = t[e] = {
i: e,
l: !1,
exports: {}
};
return r[e].call(o.exports, o, o.exports, n),
o.l = !0,
o.exports
}
var t = {};
return n.m = r,
n.c = t,
n.d = function(r, t, e) {
n.o(r, t) || Object.defineProperty(r, t, {
configurable: !1,
enumerable: !0,
get: e
})
},
n.n = function(r) {
var t = r && r.__esModule ? function() {
return r['default']
} : function() {
return r
};
return n.d(t, "a", t),
t
},
n.o = function(r, n) {
return Object.prototype.hasOwnProperty.call(r, n)
},
n.p = "",
n(n.s = 8)
}({
8: function(r, n, t) {
"use strict";
function e(r) {
if (Array.isArray(r)) {
for (var n = 0, t = Array(r.length); n < r.length; n++)
t[n] = r[n];
return t
}
return Array.from(r)
}
function o(r) {
for (var n = [], t = 0, e = r.length; t < e; t += 2)
n.push(parseInt(r.substr(t, 2), 16));
return n
}
function u(r) {
var temp = "";
each(r, function(i, p) {
temp = temp + (p = p.toString(16),
1 === p.length ? "0" + p : p);
});
return temp;
}
function i(r) {
for (var n = [], t = 0, e = r.length; t < e; t++) {
var o = r.charCodeAt(t);
o <= 127 ? n.push(o) : o <= 2047 ? (n.push(192 | o >>> 6),
n.push(128 | 63 & o)) : (n.push(224 | o >>> 12),
n.push(128 | o >>> 6 & 63),
n.push(128 | 63 & o))
}
return n
}
function f(r) {
for (var n = [], t = 0, e = r.length; t < e; t++)
r[t] >= 224 && r[t] <= 239 ? (n.push(String.fromCharCode(((15 & r[t]) << 12) + ((63 & r[t + 1]) << 6) + (63 & r[t + 2]))),
t += 2) : r[t] >= 192 && r[t] <= 223 ? (n.push(String.fromCharCode(((31 & r[t]) << 6) + (63 & r[t + 1]))),
t++) : n.push(String.fromCharCode(r[t]));
return n.join("")
}
function a(r, n) {
return r << n | r >>> 32 - n
}
function c(r) {
return (255 & w[r >>> 24 & 255]) << 24 | (255 & w[r >>> 16 & 255]) << 16 | (255 & w[r >>> 8 & 255]) << 8 | 255 & w[255 & r]
}
function s(r) {
return r ^ a(r, 2) ^ a(r, 10) ^ a(r, 18) ^ a(r, 24)
}
function p(r) {
return r ^ a(r, 13) ^ a(r, 23)
}
function h(r, n, t) {
for (var e = new Array(4), o = new Array(4), u = 0; u < 4; u++)
o[0] = 255 & r[0 + 4 * u],
o[1] = 255 & r[1 + 4 * u],
o[2] = 255 & r[2 + 4 * u],
o[3] = 255 & r[3 + 4 * u],
e[u] = o[0] << 24 | o[1] << 16 | o[2] << 8 | o[3];
for (var i, f = 0; f < 32; f += 4)
i = e[1] ^ e[2] ^ e[3] ^ t[f + 0],
e[0] ^= s(c(i)),
i = e[2] ^ e[3] ^ e[0] ^ t[f + 1],
e[1] ^= s(c(i)),
i = e[3] ^ e[0] ^ e[1] ^ t[f + 2],
e[2] ^= s(c(i)),
i = e[0] ^ e[1] ^ e[2] ^ t[f + 3],
e[3] ^= s(c(i));
for (var a = 0; a < 16; a += 4)
n[a] = e[3 - a / 4] >>> 24 & 255,
n[a + 1] = e[3 - a / 4] >>> 16 & 255,
n[a + 2] = e[3 - a / 4] >>> 8 & 255,
n[a + 3] = 255 & e[3 - a / 4]
}
function v(r, n, t) {
for (var e = new Array(4), o = new Array(4), u = 0; u < 4; u++)
o[0] = 255 & r[0 + 4 * u],
o[1] = 255 & r[1 + 4 * u],
o[2] = 255 & r[2 + 4 * u],
o[3] = 255 & r[3 + 4 * u],
e[u] = o[0] << 24 | o[1] << 16 | o[2] << 8 | o[3];
e[0] ^= 2746333894,
e[1] ^= 1453994832,
e[2] ^= 1736282519,
e[3] ^= 2993693404;
for (var i, f = 0; f < 32; f += 4)
i = e[1] ^ e[2] ^ e[3] ^ A[f + 0],
n[f + 0] = e[0] ^= p(c(i)),
i = e[2] ^ e[3] ^ e[0] ^ A[f + 1],
n[f + 1] = e[1] ^= p(c(i)),
i = e[3] ^ e[0] ^ e[1] ^ A[f + 2],
n[f + 2] = e[2] ^= p(c(i)),
i = e[0] ^ e[1] ^ e[2] ^ A[f + 3],
n[f + 3] = e[3] ^= p(c(i));
if (t === g) for (var a, s = 0; s < 16; s++)
a = n[s],
n[s] = n[31 - s],
n[31 - s] = a
}
function l(r, n, t) {
var a = arguments.length > 3 && void 0 !== arguments[3] ? arguments[3] : {}, c = a.padding,
s = void 0 === c ? "pkcs#5" : c,
p = (a.mode,
a.output),
l = void 0 === p ? "string" : p;
if ("string" == typeof n && (n = o(n)),
16 !== n.length) throw new Error("key is invalid");
if (r = "string" == typeof r ? t !== g ? i(r) : o(r) : [].concat(e(r)),
"pkcs#5" === s && t !== g) for (var w = d - r.length % d, A = 0; A < w; A++)
r.push(w);
var m = new Array(y);
v(n, m, t);
for (var C = [], x = r.length, b = 0; x >= d;) {
var j = r.slice(b, b + 16),
k = new Array(16);
h(j, k, m);
for (var S = 0; S < d; S++)
C[b + S] = k[S];
x -= d,
b += d
}
if ("pkcs#5" === s && t === g) {
var O = C[C.length - 1];
C.splice(C.length - O, O)
}
return "array" !== l ? t !== g ? u(C) : f(C) : C
}
var g = 0,
y = 32,
d = 16,
w = [214, 144, 233, 254, 204, 225, 61, 183, 22, 182, 20, 194, 40, 251, 44, 5, 43, 103, 154, 118, 42, 190, 4, 195, 170, 68, 19, 38, 73, 134, 6, 153, 156, 66, 80, 244, 145, 239, 152, 122, 51, 84, 11, 67, 237, 207, 172, 98, 228, 179, 28, 169, 201, 8, 232, 149, 128, 223, 148, 250, 117, 143, 63, 166, 71, 7, 167, 252, 243, 115, 23, 186, 131, 89, 60, 25, 230, 133, 79, 168, 104, 107, 129, 178, 113, 100, 218, 139, 248, 235, 15, 75, 112, 86, 157, 53, 30, 36, 14, 94, 99, 88, 209, 162, 37, 34, 124, 59, 1, 33, 120, 135, 212, 0, 70, 87, 159, 211, 39, 82, 76, 54, 2, 231, 160, 196, 200, 158, 234, 191, 138, 210, 64, 199, 56, 181, 163, 247, 242, 206, 249, 97, 21, 161, 224, 174, 93, 164, 155, 52, 26, 85, 173, 147, 50, 48, 245, 140, 177, 227, 29, 246, 226, 46, 130, 102, 202, 96, 192, 41, 35, 171, 13, 83, 78, 111, 213, 219, 55, 69, 222, 253, 142, 47, 3, 255, 106, 114, 109, 108, 91, 81, 141, 27, 175, 146, 187, 221, 188, 127, 17, 217, 92, 65, 31, 16, 90, 216, 10, 193, 49, 136, 165, 205, 123, 189, 45, 116, 208, 18, 184, 229, 180, 176, 137, 105, 151, 74, 12, 150, 119, 126, 101, 185, 241, 9, 197, 110, 198, 132, 24, 240, 125, 236, 58, 220, 77, 32, 121, 238, 95, 62, 215, 203, 57, 72],
A = [462357, 472066609, 943670861, 1415275113, 1886879365, 2358483617, 2830087869, 3301692121, 3773296373, 4228057617, 404694573, 876298825, 1347903077, 1819507329, 2291111581, 2762715833, 3234320085, 3705924337, 4177462797, 337322537, 808926789, 1280531041, 1752135293, 2223739545, 2695343797, 3166948049, 3638552301, 4110090761, 269950501, 741554753, 1213159005, 1684763257];
r.exports = {
encrypt: function(r, n, t) {
return l(r, n, 1, t)
},
decrypt: function(r, n, t) {
return l(r, n, 0, t)
}
}
}
});
function get_pointJson(coordinate,secretKey){
var result = sm4.encrypt(coordinate, secretKey);
return result;
}
function get_captchCode(token,coordinate,secretKey) {
var message = token + "---" + coordinate;
var result = sm4.encrypt(message, secretKey);
return result;
}