小工具知识网

当前位置: 首页 > 行业知识 > 2024年Web前端最新前端使用国密SM4进行加密、解密

行业知识

2024年Web前端最新前端使用国密SM4进行加密、解密

2026-11-15 04:55:43 来源:互联网转载
结束

一次完整的面试流程就是这样啦,小编综合了腾讯的面试题做了一份前端面试题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

上一篇:JSON格式化详解,数据呈现的艺术之道

下一篇:怎么设置使用代理服务器?