JS实现RSA/ECB/PKCS1Padding的私钥加密

1 篇文章 0 订阅

JS实现RSA/ECB/PKCS1Padding的私钥加密


题目是私钥加密,为啥要写,就是因为目前网络能搜到的库,都没有这个算法。不管是jsencrypt.js,还是js-rsa-security.js,还是kjur-jsrsasign-d282c71,加密算法其实都一样的函数,不知道为啥取了不同的名字。

代码

代码是直接在kjur-jsrsasign-d282c71库里面的jsrsasign-all-min.js添加的。所以要了解具体情况需要先下载该库。

//输入d是需要加密的字符串
RSAKey.prototype.privEncrypt = function(d) {
//关键是pkcs1pad1函数,实现了PKCS1Padding,
//PKCS1Padding的实现原理可以参照下面的超链接[PKCS1Padding分析](https://www.cnblogs.com/spencerN/archive/2012/10/18/2729602.html)
//n是啥意思,看看下面的超链接[RSA公钥私钥加密](https://www.cnblogs.com/zhaoxingjun/articles/6139127.html)就知道了
//n的大概意思就是两个素数的乘积累
  var a = pkcs1pad1(d, (this.n.bitLength() + 7) >> 3);
  if (a == null) {
    return null
  }
  var e = this.doPrivate(a);
  if (e == null) {
    return null
  }
  //转成16进制的字符串
  var b = e.toString(16);
  if ((b.length & 1) == 0) {
    return b
  } else {
    return "0" + b
  }
};

RSA加密参照网页链接:
RSA公钥私钥加密
PKCS1Padding分析

pkcs1pad1的实现

PKCS1Padding分析页面,看看具体原理

// An highlighted block
function pkcs1pad1(e, h) {
  //EB = 00 + BT+ PS + 00 +D
  // BT | PS             PS.length = 1024/8 - 3 - D.length
  // 00 | 00
  // 01 | FF             for private
  // 02 | ramdom value   for public
  // D is the  plaintext
  if (h < e.length + 11) {
    throw "Message too long for RSA";
    return null
  }
  var g = new Array();
  var d = e.length - 1;
  while (d >= 0 && h > 0) {
    var f = e.charCodeAt(d--);
    g[--h] = f;
  }
  g[--h] = 0;
  while (h > 2) {
    g[--h] = 255;
  }
  g[--h] = 1;
  g[--h] = 0;
  return new BigInteger(g)
}

调用方式

//私钥传入是hex的格式,我这里是特殊需要。
        let priHex = "";
        let rsa = new RSAKey();
        rsa.readPKCS8PrvKeyHex(priHex);
	//输入是字符串,输入是hex的字串
        let hSig = rsa.privEncrypt(content);
        //转成Base64的字符串
        let hipherText = hex2b64(hSig);

如果是PKCS#1的pem格式的Base64私钥可以用下面的接口读入

        let prvKey = "";
        let rsa = new RSAKey();
        rsa.readPrivateKeyFromPEMString(prvKey);
        //输入是字符串,输入是hex的字串
        let hSig = rsa.privEncrypt(content);
        let hipherText = hex2b64(hSig);
  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值