• 前端使用jsencrypt进行RSA公钥解密


    默认jsencrypt是不支持公钥解密的,需要更改
    1.将jsencrypt.js源码复制一分到utils包下

    在这里插入图片描述
    在这里插入图片描述
    2.然后对utils包下的jsencrypt进行更改

    更改RSAKey.prototype.decrypt 方法(将doPrivate改为doPublic)

    	RSAKey.prototype.decrypt = function (ctext) {
            var c = parseBigInt(ctext, 16);
            var m = this.doPublic(c);
            if (m == null) {
                return null;
            }
            return pkcs1unpad2(m, (this.n.bitLength() + 7) >> 3);
        };
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    原:
    在这里插入图片描述
    新:
    在这里插入图片描述
    更改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(c)
          } 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
      }
      
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31

    原:
    在这里插入图片描述
    新:
    在这里插入图片描述
    3. 实际使用:
    import JSEncrypt from '@/utils/jsencrypt'

    var encryptor = new JSEncrypt();  
    	//	私钥加密后的数据
      var data = 'fGrPg4EOup/nopw4f8XCqNenVsPE2Ujr70TvjDvrfUDFFiYcx7ewLG7tM76x7N0nKiO7/QiWZU0GAEhrMBr4oNm+zGCiCnMGeLaPUM0KOnYgN6kimFsMOIerd/25S3qdqj4qED84bTaT7VBni1L3APo8JOKVcWIk4kJPKK1nJUNwsQxJvbrD2+nOdrWjRuq3WIftdcEHBiVGycai+j8QUrVTKcTmYFjCWwC7JFRQjYv26pmCbq3rs3CT24xazc4CLDkx+y98H++my7zZkVTI675kH+pYlZbQfBkiHvLtCHUOEi+RDXhGNi9GO2DVTBVnAP173BV2VyFFYj85qeD/Qw==';
    	// 公钥
    var publicKey = 
      '-----BEGIN PUBLIC KEY-----\n' +  
      'MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA3IHVdOJg+nqaZGKc9wXJ'+
      'KUqwI95F/qCvPQoDyf0cDZzebbAGEOs4m7LAQwfa6A+q6cRhBHtDYco6cv7wufmi'+
      'qJ9U7yVFnvha1wi3jkXn1AxUAvUw+bLtrhjZg/akxAukXX7fsOdCPbk8AitlnaH1'+
      '2S5Np0Ugxx/rN+LOkkxwAOIzu/z1SvGLoPGFDHW/7mna8txs3SwlpG3TDGOXOsEu'+
      '4vcXbRKmLApUlrluhny7GTGGVi8TqrmviyrfcAj/098AI5aRzv/Y0TchsJVOtoaz'+
      'CsHjjp/Cf4RnSuL+KyBio7wGlR+Iyy/ywpMUiae3vJb3qd0Wx8824SbgClTIA1f4'+
      'HwIDAQAB'+
        '\n-----END PUBLIC KEY-----';  
    
      // console.log("111",decrypt(data,publicKey));
    
      encryptor.setPublicKey(publicKey);  
      var decryptedData = encryptor.decrypt(data,publicKey);  
        
      // 显示解密结果  
      console.log("解密:",decryptedData);
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22

    在这里插入图片描述
    在这里插入图片描述

  • 相关阅读:
    12 张图看懂 CPU 缓存一致性与 MESI 协议,真的一致吗?
    气传导蓝牙耳机怎么样?好用的气传导耳机有哪些?气传导耳机推荐
    为什么需要工业物联网 (IIoT)?如何实施?
    springboot+mysql大学生就业管理系统-计算机毕业设计源码85553
    微信超实用的小功能
    LLM长度外推——位置插值(llama/baichuan)
    理解HTTPS/TLS/SSL(二)可视化TLS握手过程并解密加密数据
    HttpClient实现RPC解析(通过Get方式访问)
    【Git企业开发】第一节.Git 的分支管理
    发明专利说明书如何撰写
  • 原文地址:https://blog.csdn.net/YXWik/article/details/132896151