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

默认jsencrypt是不支持公钥解密的,需要更改

1.将jsencrypt.js源码复制一分到utils包下


2.然后对utils包下的jsencrypt进行更改

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

java 复制代码
	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);
    };

原:

新:

更改pkcs1unpad2方法,更换内容如下:

java 复制代码
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. 实际使用:
    import JSEncrypt from '@/utils/jsencrypt'
java 复制代码
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);


相关推荐
eason_fan1 分钟前
字节前端面试提问:微应用的实现方式有哪些?
前端·面试·前端框架
Surprisec14 分钟前
动手实践YJS:构建你的第一个实时协作文档编辑器
前端·javascript·面试
晴殇i15 分钟前
JavaScript新一代异步写法:不用await,性能提升80%
前端·面试
患得患失94917 分钟前
【前端】【React】useCallback的作用与使用场景总结
前端·javascript·react.js
wordbaby18 分钟前
TanStack Query :现代 Web 应用的异步状态管理利器
前端
柚子81620 分钟前
真不要依赖dom结构
javascript·dom
江沉晚呤时20 分钟前
深入解析策略模式在C#中的应用与实现
java·服务器·开发语言·前端·.netcore
居然是阿宋22 分钟前
Kotlin 中的 `reified` 关键字全解析:保留类型信息 + 优化高阶函数的双重魔法
android·开发语言·kotlin
Hamm23 分钟前
如何在TypeScript里使用类封装枚举来实现Java的枚举形参倒置
java·前端·typescript
树上有只程序猿1 小时前
如果单表数据量大,只能考虑分库分表吗?
前端