• 前端使用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

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

  • 相关阅读:
    MCU固件加密
    杂谈记录——整数转罗马数字
    rabbitmq-exporter部署方式
    Linux操作系统
    基于 Retina-GAN 的视网膜图像血管分割
    SQLite数据库的安装和使用
    GC8837 12V 单通道电机驱动芯片,大电流,短gnd,短电源保护 可替代DRV8837/TI
    【JUC源码专题】LinkedBlockingDeque 源码分析(JDK8)
    Java 代理模式之静态代理与动态代理
    正大数据周五新鲜报 做期货要关注哪块消息?
  • 原文地址:https://blog.csdn.net/YXWik/article/details/132896151