行业知识
2024年Web前端最新前端使用国密SM4进行加密、解密
结束
一次完整的面试流程就是这样啦,小编综合了腾讯的面试题做了一份前端面试题PDF文档,里面有面试题的详细解析,分享给小伙伴们,有没有需要的小伙伴们都去领取!
开源分享:【大厂前端面试题解析+核心总结学习笔记+真实项目实战+最新讲解视频】
}this.PUT\_ULONG\_BE(ulbuf[35], output, 0)this.PUT\_ULONG\_BE(ulbuf[34], output, 4)this.PUT\_ULONG\_BE(ulbuf[33], output, 8)this.PUT\_ULONG\_BE(ulbuf[32], output, 12)
}
this.sm4_crypt_ecb = function (ctx, input) {
if (input == null) {
alert(‘input is null!’)
}
if (ctx.isPadding && ctx.mode == this.SM4_ENCRYPT) {
input = this.padding(input, this.SM4_ENCRYPT)
}
var i = 0var length = input.lengthvar bous = new Array()for (; length > 0; length -= 16) { var out = new Array(16) var ins = input.slice(i \* 16, 16 \* (i + 1)) this.sm4\_one\_round(ctx.sk, ins, out) bous = bous.concat(out) i++}var output = bousif (ctx.isPadding && ctx.mode == this.SM4\_DECRYPT) { output = this.padding(output, this.SM4\_DECRYPT)}for (var i = 0; i }
this.sm4_crypt_cbc = function (ctx, iv, input) {
if (iv == null || iv.length != 16) {
alert(‘iv error!’)
}
if (input == null) { alert('input is null!')}if (ctx.isPadding && ctx.mode == this.SM4\_ENCRYPT) { input = this.padding(input, this.SM4\_ENCRYPT)}var i = 0var length = input.lengthvar bous = new Array()if (ctx.mode == this.SM4\_ENCRYPT) { var k = 0 for (; length > 0; length -= 16) { var out = new Array(16) var out1 = new Array(16) var ins = input.slice(k \* 16, 16 \* (k + 1)) for (i = 0; i 0; length -= 16) { var out = new Array(16) var out1 = new Array(16) var ins = input.slice(k \* 16, 16 \* (k + 1)) temp = ins.slice(0, 16) sm4\_one\_round(ctx.sk, ins, out) for (i = 0; i }
}
// function SM4Util(key = ‘1111111111111111’) {
function SM4Util() {
console.log(‘SM4Util key----’, key)
// 和后端key一致(key为密钥)
// this.secretKey = key
this.secretKey = ‘1111111111111111’
// 当时用CBC模式的时候
this.iv = ‘1111111111111111’
this.hexString = false
// ECB模式加密
this.encryptData_ECB = function (plainText) {
try {
var sm4 = new SM4()
var ctx = new SM4_Context()
ctx.isPadding = true
ctx.mode = sm4.SM4_ENCRYPT
var keyBytes = stringToByte(this.secretKey)
sm4.sm4_setkey_enc(ctx, keyBytes)
var encrypted = sm4.sm4_crypt_ecb(ctx, stringToByte(plainText))
var cipherText = base64js.fromByteArray(encrypted)
if (cipherText != null && cipherText.trim().length > 0) {
cipherText.replace(/(\s*|\t|\r|\n)/g, ‘’)
}
return cipherText
} catch (e) {
console.error(e)
return null
}
}
// CBC模式加密
this.encryptData_CBC = function (plainText) {
try {
var sm4 = new SM4()
var ctx = new SM4_Context()
ctx.isPadding = true
ctx.mode = sm4.SM4_ENCRYPT
var keyBytes = stringToByte(this.secretKey) var ivBytes = stringToByte(this.iv) sm4.sm4\_setkey\_enc(ctx, keyBytes) var encrypted = sm4.sm4\_crypt\_cbc(ctx, ivBytes, stringToByte(plainText)) var cipherText = base64js.fromByteArray(encrypted) if (cipherText != null && cipherText.trim().length > 0) { cipherText.replace(/(\s\*|\t|\r|\n)/g, '') } return cipherText} catch (e) { console.error(e) return null} }
stringToByte = function (str) {
var bytes = new Array()
var len, c
len = str.length
for (var i = 0; i
c = str.charCodeAt(i)
if (c >= 0x010000 && c > 18) & 0x07) | 0xf0)
bytes.push(((c >> 12) & 0x3f) | 0x80)
bytes.push(((c >> 6) & 0x3f) | 0x80)
bytes.push((c & 0x3f) | 0x80)
} else if (c >= 0x000800 && c > 12) & 0x0f) | 0xe0)
bytes.push(((c >> 6) & 0x3f) | 0x80)
bytes.push((c & 0x3f) | 0x80)
} else if (c >= 0x000080 && c > 6) & 0x1f) | 0xc0)
bytes.push((c & 0x3f) | 0x80)
} else {
bytes.push(c & 0xff)
}
}
console.log(‘bytes----’, bytes)
return bytes
}
byteToString = function (arr) {
if (typeof arr === ‘string’) {
return arr
}
var str = ‘’,
_arr = arr
for (var i = 0; i
var one = _arr[i].toString(2),
v = one.match(/^1+?(?=0)/)
if (v && one.length == 8) {
var bytesLength = v[0].length
var store = _arr[i].toString(2).slice(7 - bytesLength)
for (var st = 1; st
store += _arr[st + i].toString(2).slice(2)
}
str += String.fromCharCode(parseInt(store, 2))
i += bytesLength - 1
} else {
str += String.fromCharCode(_arr[i])
}
}
return str
}
}
### 2. body 标签上引入该文件
### 3. 使用 - ECB 模式加密
// 加密 - 使用默认秘钥 1111111111111111
var sm4 = new SM4Util();
sm4.encryptData_ECB(‘123’);
// 加密 - 使用自定义秘钥 93F3044B07393417A737E2CC389D01AF (需将 sm4.js 文件中SM4Util 函数处注释的代码打开)
var sm4 = new SM4Util(‘93F3044B07393417A737E2CC389D01AF’);
sm4.encryptData_ECB(‘123’); // 后端解密的好像对不上,
该加密办法参考博客 ## 【方法3】### 1. 本地写 js 文件`@/utils/SM4Util/index.js`
let base64js = require(‘./base64js’)
let Hex = require(‘./hex’)
let SM4 = require(‘./sm4’)
function SM4Util() {}
/**
* sm4 ecb 加密
* @param utf8Str
* @param utf8Key
*/
SM4Util.sm4ECBEncrypt = function (utf8Str, utf8Key) {
if (!utf8Key) {
utf8Key = ‘zzfh!@#$QazxWsxc’
}
let sm4 = new SM4()
let keyBytes = Hex.utf8StrToBytes(utf8Key)
let contentBytes = Hex.utf8StrToBytes(utf8Str)
let cipher = sm4.encrypt_ecb(keyBytes, contentBytes)
return base64js.fromByteArray(cipher)
}
/**
* sm4 ecb 解密
* @param utf8Str
* @param utf8Key
*/
SM4Util.sm4ECBDecrypt = function (base64Str, utf8Key) {
if (!utf8Key) {
utf8Key = ‘zzfh!@#$QazxWsxc’
}
let sm4 = new SM4()
let keyBytes = Hex.utf8StrToBytes(utf8Key)
let contentBytes = base64js.toByteArray(base64Str)
let plain = sm4.decrypt_ecb(keyBytes, contentBytes)
return Hex.bytesToUtf8Str(plain)
}
/**
* sm4 cbc 加密
* @param utf8Str
* @param utf8Key
* @param utf8Iv
*/
SM4Util.sm4CBCEncrypt = function (utf8Str, utf8Key, utf8Iv) {
if (!utf8Key) {
utf8Key = ‘cmbtest1cmbtest1’
}
if (!utf8Iv) {
utf8Iv = ‘cmbtest1cmbtest1’
}
let sm4 = new SM4()
let keyBytes = Hex.utf8StrToBytes(utf8Key)
let ivBytes = Hex.utf8StrToBytes(utf8Iv)
let contentBytes = Hex.utf8StrToBytes(utf8Str)
let cipher = sm4.encrypt_cbc(keyBytes, ivBytes, contentBytes)
return base64js.fromByteArray(cipher)
}
/**
* sm4 cbc 解密
* @param utf8Str
* @param utf8Key
* @param utf8Iv
*/
SM4Util.sm4CBCDecrypt = function (base64Str, utf8Key, utf8Iv) {
if (!utf8Key) {
utf8Key = ‘cmbtest1cmbtest1’
}
if (!utf8Iv) {
utf8Iv = ‘cmbtest1cmbtest1’
}
let sm4 = new SM4()
let keyBytes = Hex.utf8StrToBytes(utf8Key)
let ivBytes = Hex.utf8StrToBytes(utf8Iv)
let contentBytes = base64js.toByteArray(base64Str)
let plain = sm4.decrypt_cbc(keyBytes, ivBytes, contentBytes)
return Hex.bytesToUtf8Str(plain)
}
module.exports = SM4Util
`@/utils/SM4Util/base64js.js`
/**
* base64js
* base64js.toByteArray(utf8Str)
* base64js.fromByteArray(bytes);
*/
;(function ® {
if (typeof exports === ‘object’ && typeof module !== ‘undefined’) {
module.exports = r()
} else {
if (typeof define === ‘function’ && define.amd) {
define([], r)
} else {
var e
if (typeof window !== ‘undefined’) {
e = window
} else {
if (typeof global !== ‘undefined’) {
e = global
} else {
if (typeof self !== ‘undefined’) {
e = self
} else {
e = this
}
}
}
e.base64js = r()
}
}
})(function () {
var r, e, t
return (function r(e, t, n) {
function o(i, a) {
if (!t[i]) {
if (!e[i]) {
var u = typeof require == ‘function’ && require
if (!a && u) {
return u(i, !0)
}
if (f) {
return f(i, !0)
}
var d = new Error(“Cannot find module '” + i + “'”)
throw ((d.code = ‘MODULE_NOT_FOUND’), d)
}
var c = (t[i] = {
exports: {}
})
e[i][0].call(
c.exports,
function ® {
var t = e[i][1][r]
return o(t ? t : r)
},
c,
c.exports,
r,
e,
t,
n
)
}
return t[i].exports
}
var f = typeof require == ‘function’ && require
for (var i = 0; i
o(n[i])
}
return o
})(
{
‘/’: [
function (r, e, t) {
t.byteLength = c
t.toByteArray = v
t.fromByteArray = s
var n = []
var o = []
var f = typeof Uint8Array !== ‘undefined’ ? Uint8Array : Array
var i = ‘ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/’
for (var a = 0, u = i.length; a
n[a] = i[a]
o[i.charCodeAt(a)] = a
}
o[‘-’.charCodeAt(0)] = 62
o[‘_’.charCodeAt(0)] = 63
function d(r) { var e = r.length if (e % 4 > 0) { throw new Error('Invalid string. Length must be a multiple of 4') } return r[e - 2] === '=' ? 2 : r[e - 1] === '=' ? 1 : 0 } function c(r) { return (r.length \* 3) / 4 - d(r) } function v(r) { var e, t, n, i, a var u = r.length i = d(r) a = new f((u \* 3) / 4 - i) t = i > 0 ? u - 4 : u var c = 0 for (e = 0; e 8) & 255 a[c++] = n & 255 } if (i === 2) { n = (o[r.charCodeAt(e)] > 4) a[c++] = n & 255 } else { if (i === 1) { n = (o[r.charCodeAt(e)] 2) a[c++] = (n >> 8) & 255 a[c++] = n & 255 } } return a } function l(r) { return n[(r >> 18) & 63] + n[(r >> 12) & 63] + n[(r >> 6) & 63] + n[r & 63] } function h(r, e, t) { var n var o = [] for (var f = e; f 2] f += n[(e 10] f += n[(e >> 4) & 63] f += n[(e > 4]hexCh[++j] = hexCode[b[i] & 0x0f]
}
return hexCh.join(‘’)
}
/**
* 16进制字符串转为字节数组
* @param hex
* @returns {any[]|null}
*/
Hex.decode = function (hex) {
if (hex == null || hex == ‘’) {
return null
}
if (hex.length % 2 != 0) {
return null
}
var ascLen = hex.length / 2
var hexCh = this.toCharCodeArray(hex)
var asc = new Array(ascLen)
for (var i = 0; i
if (hexCh[2 * i] >= 0x30 && hexCh[2 * i] (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
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 >> (32 - 2))) ^
((bint >> (32 - 10))) ^
((bint >> (32 - 18))) ^
((bint >> (32 - 24)))
return c
},
pkcs7padding: function (input, mode) {
if (input == null) {
return null
}
var ret = nullif (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 },
/**
*
* @param key 字节数组
* @param data 字节数组
* @returns {any[]|null}
*/
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
下一篇:怎么设置使用代理服务器?