• jsencrypt 公私钥解加密


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

    /**
         * 公钥解密 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;
        }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    /**
         * 公钥加密
         * @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
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

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

    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); 
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

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

  • 相关阅读:
    【前端】尚硅谷Webpack教程笔记
    excel中删除重复项
    【数据挖掘】十大算法之Apriori关联算法
    [UNR #6]稳健型选手
    好用且免费的ChatGPT工具
    SpringBoot整合MongoDB以及副本集、分片集群的搭建
    PROFINET转EtherCAT网关方案设计
    [机器学习]分类算法系列①:初识概念
    【GlobalMapper精品教程】028:栅格计算器的使用方法总结
    计算机毕业设计之java+springboot基于vue的校友社交系统
  • 原文地址:https://blog.csdn.net/weixin_41865469/article/details/126223728