@lsqswl/rsaencrypt
Version:
基于jsencrypt封装的RSA加解密工具。支持长字符串;支持与java/Object-C互相加解密。
170 lines (169 loc) • 4.6 kB
JavaScript
"use strict";
/**
* index.js
* Created by lsqswl on 2018/8/20.
*/
exports.__esModule = true;
var jsencrypt_1 = require("jsencrypt");
var b64map = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/';
var b64pad = '=';
function hex2b64(h) {
var i;
var c;
var ret = '';
for (i = 0; i + 3 <= h.length; i += 3) {
c = parseInt(h.substring(i, i + 3), 16);
ret += b64map.charAt(c >> 6) + b64map.charAt(c & 63);
}
if (i + 1 === h.length) {
c = parseInt(h.substring(i, i + 1), 16);
ret += b64map.charAt(c << 2);
}
else if (i + 2 === h.length) {
c = parseInt(h.substring(i, i + 2), 16);
ret += b64map.charAt(c >> 2) + b64map.charAt((c & 3) << 4);
}
while ((ret.length & 3) > 0) {
ret += b64pad;
}
return ret;
}
var BI_RM = '0123456789abcdefghijklmnopqrstuvwxyz';
function int2char(n) {
return BI_RM.charAt(n);
}
function b64tohex(s) {
var ret = '';
var i;
var k = 0; // b64 state, 0-3
var slop = 0;
for (i = 0; i < s.length; ++i) {
if (s.charAt(i) === b64pad) {
break;
}
var v = b64map.indexOf(s.charAt(i));
if (v < 0) {
continue;
}
if (k === 0) {
ret += int2char(v >> 2);
slop = v & 3;
k = 1;
}
else if (k === 1) {
ret += int2char((slop << 2) | (v >> 4));
slop = v & 0xf;
k = 2;
}
else if (k === 2) {
ret += int2char(slop);
ret += int2char(v >> 2);
slop = v & 3;
k = 3;
}
else {
ret += int2char((slop << 2) | (v >> 4));
ret += int2char(v & 0xf);
k = 0;
}
}
if (k === 1) {
ret += int2char(slop << 2);
}
return ret;
}
/**
* rsa公钥加密长字符串
* @param str
* @param publicKey
* @returns {any}
*/
function encryptPublicLong(text, publicKey) {
var rsa = new jsencrypt_1["default"]();
rsa.setPublicKey(publicKey);
var key = rsa.getKey();
var ct = "";
// RSA每次加密117bytes,需要辅助方法判断字符串截取位置
// 1.获取字符串截取点
var bytes = new Array();
bytes.push(0);
var byteNo = 0;
var len = text.length;
var c;
var temp = 0;
for (var i = 0; i < len; i++) {
c = text.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 = void 0;
if (i === 0) {
str = text.substring(0, bytes[i + 1] + 1);
}
else {
str = text.substring(bytes[i] + 1, bytes[i + 1] + 1);
}
var t1 = key.encrypt(str);
ct += t1;
}
if (bytes[bytes.length - 1] !== text.length - 1) {
var lastStr = text.substring(bytes[bytes.length - 1] + 1);
ct += key.encrypt(lastStr);
}
return (hex2b64(ct));
}
var t = key.encrypt(text);
return hex2b64(t);
}
exports.encryptPublicLong = encryptPublicLong;
/**
* rsa私钥解密长字符串
* @param str
* @param privateKey
* @returns {any}
*/
function decryptPrivateLong(text, privateKey) {
var rsa = new jsencrypt_1["default"]();
rsa.setPrivateKey(privateKey);
var key = rsa.getKey();
text = b64tohex(text);
var maxLength = ((key.n.bitLength() + 7) >> 3);
try {
if (text.length > maxLength) {
var ct1_1 = "";
var lt = text.match(/.{1,256}/g);
if (lt) {
lt.forEach(function (entry) {
var t1 = key.decrypt(entry);
ct1_1 += t1;
});
}
return ct1_1;
}
var y = key.decrypt(text);
return y;
}
catch (ex) {
return false;
}
}
exports.decryptPrivateLong = decryptPrivateLong;