vue使用JSEncrypt加密解密中文以及超长文本的解决办法

发布于 2024-01-29  656 次阅读


复制整个jsencrypt包至自己的目录下,然后打开jsencrypt/lib/JSEncrypt.js文件,在return JSEncrypt上方,加入以下代码:

// 获取RSA key 长度
    JSEncrypt.prototype.getkeylength = function () {
        // eslint-disable-next-line no-bitwise
        return (this.key.n.bitLength() + 7) >> 3
    }

    // 分段解密,支持中文
    // eslint-disable-next-line consistent-return
    JSEncrypt.prototype.decryptLong = function (string) {
        const k = this.getKey()
        // 解密长度=key size.hex2b64结果是每字节每两字符,所以直接*2
        // eslint-disable-next-line no-bitwise
        const maxLength = ((k.n.bitLength() + 7) >> 3) * 2
        try {
            const hexString = b64tohex(string)
            let decryptedString = ''
            const rexStr = `.{1,${maxLength}}`
            const rex = new RegExp(rexStr, 'g')
            const subStrArray = hexString.match(rex)
            if (subStrArray) {
                subStrArray.forEach(function (entry) {
                    decryptedString += k.decrypt(entry)
                })
                return decryptedString
            }
        } catch (ex) {
            return false
        }
    }

    // 分段加密,支持中文
    JSEncrypt.prototype.encryptLong = function (string) {
        const k = this.getKey()
        // 根据key所能编码的最大长度来定分段长度。key size - 11:11字节随机padding使每次加密结果都不同。
        // eslint-disable-next-line no-bitwise
        const maxLength = ((k.n.bitLength() + 7) >> 3) - 11
        try {
            const len = string.length
            let i = 0
            let subStr = ''
            let encryptedString = ''
            let subStart = 0
            let subEnd = 0
            let bitLen = 0
            let tmpPoint = 0
            for (; i < len; i++) {
                // js 是使用 Unicode 编码的,每个字符所占用的字节数不同
                const charCode = string.charCodeAt(i)
                if (charCode <= 0x007f) {
                    bitLen += 1
                } else if (charCode <= 0x07ff) {
                    bitLen += 2
                } else if (charCode <= 0xffff) {
                    bitLen += 3
                } else {
                    bitLen += 4
                }
                // 字节数到达上限,获取子字符串加密并追加到总字符串后。更新下一个字符串起始位置及字节计算。
                if (bitLen > maxLength) {
                    subStr = string.substring(subStart, subEnd)
                    encryptedString += k.encrypt(subStr)
                    subStart = subEnd
                    bitLen -= tmpPoint
                } else {
                    subEnd = i
                    tmpPoint = bitLen
                }
            }
            subStr = string.substring(subStart, len)
            encryptedString += k.encrypt(subStr)
            return hex2b64(encryptedString)
        } catch (ex) {
            return false
        }
    }

加密和解密,均使用"decryptLong"和"encryptLong"即可

啊~~~~~~~~~
最后更新于 2024-01-29