jsencrypt 公私钥解加密

本文介绍了RSA算法在后端的公钥解密和私钥加密方法,以及前端如何进行公钥解密的调整。示例代码详细展示了如何在浏览器环境中使用JavaScript进行RSA加密和解密操作,特别指出小程序环境下的处理方式有所不同。同时,文章鼓励读者根据实际需求完善和应用这些代码。
摘要由CSDN通过智能技术生成

以下主要介绍的长解密
一 后端部分处理

/**
     * 公钥解密 RSA算法私钥加密
     * @param string $encrypted 公钥加密串
     * @param string $privKey 私钥
     * @return bool|null|string
     */
    public static function RSADecrypt($encrypted = '', $privKey = '')
    {
        //用base64将内容还原成二进制
        $content = base64_decode($encrypted);
        //把需要解密的内容,按128位拆开解密
        $decrypted = '';
        for ($i = 0; $i < strlen($content) / 128; $i++) {
            $data = substr($content, $i * 128, 128);
            openssl_public_decrypt($data, $decrypt, $privKey);
            $decrypted .= $decrypt;
        }
        openssl_free_key($res);
        return $decrypted;
    }
/**
     * 公钥加密
     * @param string $content   [待加密字符串]
     * @param string $publicKey [公钥]
     */
    public static function RSAEncrypt($content = '', $publicKey = '')
    {
        $encrypted = '';
        openssl_public_encrypt($content, $encrypted, openssl_pkey_get_public($publicKey));

        //加密成功,返回base64编码的字符串
        return base64_encode($encrypted);
    }

二 前端部分处理
一般我们使用到公钥加密的比较多,但是也会有一些需求需要前端来进行公钥解密
实现

  1. 修改 RSAKey.prototype.decrypt 中 this.doPrivate 为 this.doPublic
    RSAKey.prototype.decrypt = function (ctext) {
    var c = parseBigInt(ctext, 16);
    var m = this.doPublic©;
    //var m = this.doPrivate©;
    if (m == null) {
    return null;
    }
    return pkcs1unpad2(m, (this.n.bitLength() + 7) >> 3);
    };
  2. 修改 pkcs1unpad2;
    function pkcs1unpad2(d, n) {
    var b = d.toByteArray();
    var i = 0;
    while (i < b.length && b[i] == 0) {
    ++i;
    }
    //注释即可
    // if (b.length - i != n - 1 || b[i] != 2) {
    // return null;
    // }
    ++i;
    while (b[i] != 0) {
    if (++i >= b.length) {
    return null;
    }
    }
    var ret = “”;
    while (++i < b.length) {
    var c = b[i] & 255;
    if (c < 128) { // utf-8 decode
    ret += String.fromCharCode©;
    } else if ((c > 191) && (c < 224)) {
    ret += String.fromCharCode(((c & 31) << 6) | (b[i + 1] & 63));
    ++i;
    } else {
    ret += String.fromCharCode(((c & 15) << 12) | ((b[i + 1] & 63) << 6) | (b[i + 2] & 63));
    i += 2;
    }
    }
    return ret;
    }
    在这里插入图片描述
    当然了以上只是试用于浏览器的情况,小程序的情况 需要另做修改 这里没有window对象
    还需要 将 window 改成 window2
    navigator 改成 navigator2
    以下举例公钥解密
var encrypt = new JSEncrypt();

encrypt.setPublicKey('-----BEGIN PUBLIC KEY-----' + PUBLIC_KEY + '-----END PUBLIC KEY-----');
var str = 'QIMXGxXvt5jrE/LNB0aaL3Ejpv4WQbNPNBxXSjrnIgDceTY2s0aaJcpWvTcNhjv+UoudA4HtJ6+sogqbpVWxV7WdhsyTyqjiqij0YkmjH4cn2uftZaWjljD9ZjBoJ6gxh/tlOK9h+tpuafhXv9CbQRQqcDfB44q35OZQvuG6bnFf+2sBFTMNsdHGTtKVslJUcLoFQwZ0NAv/NQyaQ0zWOb42mN/xSXrhEcP7H4+EHtcQ6J8NQqj6pcn439zSShSgQFlnHpkyWA3et/BvAcs1ly1JCBpd9vLAx3R/oHq6SBWxjthzY5N4SnsGV82PKUtGxfCDYjLFbUwVJNnCkWbPG7cV83uDAwX9vs1ikXn2O1j5C/rH4v3yB9a2uub/VGOi1x+o36OCLLgch1wRuj+252cWEhE8UQHy48lbznv7itvy6UjG+G5hf1frHqRziFIM+aPlmVYrlsBo8cKN9/Y04fxiTzwZSIAbNUvpQYc+jbqWExNwPGW4GgeqsEA60xWVocYPDInqhP5GvWV0L2hoG97QXiyIHR7nba/l/CS1E/e0oWkWiOBIDqj8eyajUUm2SExQSxW2/xy23eXkcNNr2iApHQloqAfc9CzJUGc47iIUT4r9cVO7hbLwRMw05+5Kagc6Z9vRxwhV2viFTpNYZVIYekyWtt3IU91EzCnhiL65fsRc4vJT2Vym0jHQdgufnVCPjT1dDNJEi9d4hObYUEFkOsAFPV80lOG+YGLRT6sZ4Jhy4VYv2LGPJhv5ZehqUjkph0AqeDlPOI+if/mT0OktLFG/t3FjVyY6yOq3xgYvCBQxBO+fnFr35fD2FJEpSnwlcTfwunWJ+VWW1pgyjw==';
var s = encrypt.decryptLong(str);
console.log(s); 

以上就是大概介绍吧,用到的伙伴可以直接拿去用 有什么需要完善的欢迎大家评论!

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值