用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}`);
撒花
✿✿ヽ(°▽°)ノ✿✿✿ヽ(°▽°)ノ✿✿✿ヽ(°▽°)ノ✿✿✿ヽ(°▽°)ノ✿✿✿ヽ(°▽°)ノ✿
记得点个赞哈~~
对了如果文中有错误欢迎大佬指出~