复制整个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"即可
Comments NOTHING