一个用于浏览器端 RSA 加密的辅助函数

一个用于浏览器端 RSA 加密的辅助函数,支持多字节字符加密,支持长文本分组加密

JavaScript 安全处理

详细介绍

RSA Encrypt

一个用于浏览器端 RSA 加密的辅助函数,支持多字节字符加密,支持长文本分组加密。主要基于 Tom Wu 的 RSA and ECC in JavaScript 代码进行封装。

点此查看演示页面。

接口说明

/**
 * 加密指定文本
 *
 * @param {number} keybits keybits 秘钥长度
 * @param {string} modulus base64 编码的 modulus 信息
 * @param {string} exponent base64 编码的 public exponent 信息
 * @param {string} text 需要加密的文本(在加密前会被 URI 编码)
 * @throws {TypeError|Error} 加密失败或参数错误时抛出错误
 * @returns {string} 返回 base64 编码后的加密数据
 */
RSAEncrypt(keybits, modulus, exponent, text);

其它具体细节请查看源代码

加密说明

本函数的所进行的加密是指:使用 RSA 公钥信息对明文进行加密。除此之外,为了避免直接对中文等多字节字符进行加密导致出错,在进行 RSA 加密前,我们先对明文进行了 URI 编码(基于 RFC 3986 规范)。因此,服务端在(分组)解密时,应使用以下步骤:

  1. 提交的数据 --> base64解码 --> 加密的数据
  2. 加密的数据 --> RSA解密 --> URI编码的原始数据
  3. 拼接所有分组的URI编码的原始数据 --> URI解码(RFC 3986) --> 原始的数据

由于URI编码的原因,在使用此函数加密含有多字节字符(如中文)的数据时,密文的体积会远大于明文体积。

加密示例

var keybits = 512;
var modulus = 'xgA9y1LngGIQ6EWVpbo8NqMDj5shPLkBmmJt94cdELzcpIcmVVr2AzytufYJwHTuOJysJqz9+ic5M++T76UYCQ==';
var exponent = 'AQAB';

try {
    var encrypted = RSAEncrypt(keybits, modulus, exponent, 'This is a "秘密"!');
    console.log(encrypted);
} catch (e) {
    console.error(e.stack);
}

构建工具

以下命令均可使用 cnpm 进行替换。

# 安装依赖
npm i

# 启动测试服务器
npm start 8080

# 构建代码
npm run build

License