前端RSA加密、解密、签名、验签。本文包含jsencrypt和jsrsasign两种方法教程

用jsencrypt和jsrsasign实现前端RSA加密、解密、签名、验签

开门见山的说,如果本文有用记得点个赞~

jsencrypt

安装 npm i jsencrypt --save
引用 import {JSEncrypt} from ‘jsencrypt’

使用
第零步
定义明文

var plainText = '这是明文,你懂哒~'

第一步
定义公钥
和后台同事一起定义公钥【注】开头和结尾的分隔线和英文不要去掉

var pubkey = "-----BEGIN PUBLIC KEY-----\n"+
'这里是写公钥的位置,你懂哒'+
'-----END PUBLIC KEY-----';

【注】私钥最好让后台储存,一般来说前端储存的数据都是不安全哒~

定义私钥

var privkey = "-----BEGIN RSA PRIVATE KEY-----\n"+
'这里是写私钥的位置,你懂哒'+
'-----END RSA PRIVATE KEY-----';

第二步 加密和解密

		  //**加密**
		  var encrypt = new JSEncrypt();
		  //设置公钥
          encrypt.setPublicKey(pubkey);
          //用公钥加密明文
          var encrypted = encrypt.encrypt($('#input').val());

          // **解密**
          var decrypt = new JSEncrypt();
          //设置私钥
          decrypt.setPrivateKey(privkey);
          //使用私钥解密刚才用公钥加密的密文
          var uncrypted = decrypt.decrypt(encrypted);

          // 判断解密后的字符串和明文是否相同          
          if (uncrypted == plainText) {
            alert('成功了瞄~');
          }
          else {
            alert('MD又错了吗....');
          }

第三部 加签和验签

		//**加签**
		var encrypt = new JSEncrypt();
		//设置私钥
        decrypt.setPrivateKey(privkey);
        //用私钥给明文加签,例子中使用SHA256算法,具体情况具体调整
		var signature = sign.sign(plainText, CryptoJS.SHA256, "sha256");
		
		//**验签**
		var verify = new JSEncrypt();
		//设置公钥
        encrypt.setPublicKey(pubkey);
        //验证方法有三个参数明文,用私钥加签后的字符串,加签的算法(跟上文保持一致哈~)
		var verified = verify.verify(plainText, signature, CryptoJS.SHA256);
		
		// 判断验签是否成功
		if (verified) {
		  alert('成功啦嘿~');
		}
		else {
		  alert('MD又双叒叕错了....');
		}

----------------jsencrypt完

**

jsrsasign

**

首先去下个JS
然后引用

<script src="./jsrsasign-all-min.js"></script>

以下是代码

        // 公钥
        let pk="-----BEGIN PUBLIC KEY-----\n" +
            "MFwwDQYJKoZIhvcNAQEBBQADSwAwSAJBAMF4B4aDnV6j+yXiiXBYJjHM8sEgRicQ\n" +
            "TsRndPKocf4PyNTcd9D1046wRMdtV5cijT3oVzBXQYupN+VXmMiM7MMCAwEAAQ==\n" +
            "-----END PUBLIC KEY-----";
        // 私钥
        let priK = "-----BEGIN PRIVATE KEY-----\n" +
            "MIIBVQIBADANBgkqhkiG9w0BAQEFAASCAT8wggE7AgEAAkEAwXgHhoOdXqP7JeKJ\n" +
            "cFgmMczywSBGJxBOxGd08qhx/g/I1Nx30PXTjrBEx21XlyKNPehXMFdBi6k35VeY\n" +
            "yIzswwIDAQABAkA+Zcj/kFlkGb05pcuwCS4gZ7pvoUoe9TqCS9/DF6LUTpFgsDlj\n" +
            "6AiXRng6BzlWqdn7//E/+BIInuh7Wn0q/j0hAiEA4xrWytU7EFCfilvy63oXzem2\n" +
            "um9fSqa4fksezyXtERECIQDaFZ0nIDdcACabh5JD7dEseqw85IMKUyfFNtLKaqog\n" +
            "kwIgKvg5C8eslTmr9hHPtJ41QtClskDAVu+UmNC905PpdwECIQCv4u60N49ua9C3\n" +
            "b0fP8WXacbWoBsSI9zgEHoszJYPAcQIhAIdENiYBXqHxVQByKZoRS4uG0UrRskxI\n" +
            "zMnAPlDWNOap\n" +
            "-----END PRIVATE KEY-----\n";
        // 明文
        let src = "{我是测试明文}";
        // 加密
        let pub = KEYUTIL.getKey(pk);
        let enc = KJUR.crypto.Cipher.encrypt(src, pub);
        console.log(`公钥加密结果:${enc}`);
 
        // 解密
        let prv = KEYUTIL.getKey(priK);
        let dec = KJUR.crypto.Cipher.decrypt(enc, prv);
        console.log(`私钥解密结果:${dec}`);
        
        // 签名
        let signature=new KJUR.crypto.Signature({alg:"SHA1withRSA",prvkeypem:priK});
        signature.updateString(src);
        // 签名返回结果是16进制字符串,注意转码
        let a = signature.sign();
        let sign = hextob64(a);
        console.log(`私钥签名:${sign}`);
 
        // 验签
        let signatureVf = new KJUR.crypto.Signature({alg:"SHA1withRSA",prvkeypem:pk});
        signatureVf.updateString(src);
        // 验签入参是16进制字符串,注意转码
        let b = signatureVf.verify(b64tohex(sign));
        console.log(`公钥验签:${b}`);

撒花
✿✿ヽ(°▽°)ノ✿✿✿ヽ(°▽°)ノ✿✿✿ヽ(°▽°)ノ✿✿✿ヽ(°▽°)ノ✿✿✿ヽ(°▽°)ノ✿
记得点个赞哈~~
对了如果文中有错误欢迎大佬指出~

  • 2
    点赞
  • 27
    收藏
    觉得还不错? 一键收藏
  • 6
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值