#312·jsencrypt

RSA 加密长字符串时,直接加密中文(不进行编码)会出现问题,这里可以尝试使用别人提供的方法,我直接新增一个方法,复用别人分段加密的算法代码。

作者: wisejin创建于 2024年8月2日更新于 2024年8月2日

/**

  • 分段加密长字符串 - 支持中文
  • @param {string} str 要加密的字符串
  • @return {string} 加密后的字符串,以base64编码
  • @public */ JSEncrypt.prototype.encryptLongSupportCh = function (string) { var k = this.getKey(); try { var lt = ''; var ct = ''; // RSA 每次加密117个字节,需要辅助方法判断字符串截取位置 // 1. 获取字符串截取点 var bytes = new Array(); bytes.push(0); var byteNo = 0; var len, c; len = string.length; var temp = 0; for (var i = 0; i < len; i++) { c = string.charCodeAt(i); if (c >= 0x010000 && c <= 0x10ffff) { byteNo += 4; } else if (c >= 0x000800 && c <= 0x00ffff) { byteNo += 3; } else if (c >= 0x000080 && c <= 0x0007ff) { byteNo += 2; } else { byteNo += 1; } if (byteNo % 117 >= 114 || byteNo % 117 == 0) { if (byteNo - temp >= 114) { bytes.push(i); temp = byteNo; } } } // 2. 截取字符串并分段加密 if (bytes.length > 1) { for (var i = 0; i < bytes.length - 1; i++) { var str; if (i == 0) { str = string.substring(0, bytes[i + 1] + 1); } else { str = string.substring(bytes[i] + 1, bytes[i + 1] + 1); } var t1 = k.encrypt(str); ct += t1; } if (bytes[bytes.length - 1] != string.length - 1) { var lastStr = string.substring(bytes[bytes.length - 1] + 1); ct += k.encrypt(lastStr); } return hex2b64(ct); } var t = k.encrypt(string); var y = hex2b64(t); return y; } catch (ex) { return false; } };

内容来源: travist/jsencrypt