RSA加密是一种非对称加密。可以在不直接传递密钥的情况下,完成解密。这能够确保信息的安全性,避免了直接传递密钥所造成的被破解的风险。是由一对密钥来进行加解密的过程,分别称为公钥和私钥。两者之间有数学相关,该加密算法的原理就是对一极大整数做因数分解的困难性来保证安全性。通常个人保存私钥,公钥是公开的(可能同时多人持有)。
RSA的加密过程如下:防泄露 (1)A生成一对密钥(公钥和私钥),私钥不公开,A自己保留。公钥为公开的,任何人可以获取。 (2)A传递自己的公钥给B,B用A的公钥对消息进行加密。 (3)A接收到B加密的消息,利用A自己的私钥对消息进行解密。 在这个过程中,只有2次传递过程,第一次是A传递公钥给B,第二次是B传递加密消息给A,即使都被敌方截获,也没有危险性,因为只有A的私钥才能对消息进行解密,防止了消息内容的泄露。
RSA签名的过程如下: 防篡改 (1)A生成一对密钥(公钥和私钥),私钥不公开,A自己保留。公钥为公开的,任何人可以获取。 (2)A用自己的私钥对消息加签,形成签名,并将加签的消息和消息本身一起传递给B。 (3)B收到消息后,在获取A的公钥进行验签,如果验签出来的内容与消息本身一致,证明消息是A回复的。 在这个过程中,只有2次传递过程,第一次是A传递加签的消息和消息本身给B,第二次是B获取A的公钥,即使都被敌方截获,也没有危险性,因为只有A的私钥才能对消息进行签名,即使知道了消息内容,也无法伪造带签名的回复给B,防止了消息内容的篡改。 公钥加密、私钥解密、私钥签名、公钥验签。
使用jsencrypt.js加密解密
var rsa_public = "-----BEGIN PUBLIC KEY-----MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCUJTrYpMY005GcFXHBZxMB+XP4ESJ5i+4r1QQ+sSPZnlT6FKyjostifzhVxUeBBx1B9VPJgYsYNRZs0VFDEPxqrMYO0oUyk88OBkPLbhYWVchVHcq/7ngsAVeK8zV7TS+C9eV338khUocTlO9YUZJBjqGuudG4V9/3zIO7nG8K3QIDAQAB-----END PUBLIC KEY-----"; var encrypt = new JSEncrypt(); encrypt.setPublicKey(rsa_public); var password = encrypt.encrypt($scope.loginData.password);
使用jsrsasign加密、解密、加签、解签 blog.csdn.net/weixin_3434…
kjur.github.io/jsrsasign/ jsrsasign官网
// 公钥
let publicKey=`-----BEGIN PUBLIC KEY-----
MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCHFKp1w2yQd89R0Ff2pjrDnGDR
tVQSe3Tk5GJ7dCMC/pmesZ9uIwhFKvTRFIAcs0mkGnB623RZUG0/rahFYBlbyk5w
SR1i5MCG1UKnlx64HghgJqAuY/xPaJePiFTXb301OhIrAGOCT1SoIPsnTo6/TxYv
lxIvNfqJn1hBfrdRCwIDAQAB
-----END PUBLIC KEY-----`;
// 私钥
let privateKey = `-----BEGIN RSA PRIVATE KEY-----
MIICXAIBAAKBgQCHFKp1w2yQd89R0Ff2pjrDnGDRtVQSe3Tk5GJ7dCMC/pmesZ9u
IwhFKvTRFIAcs0mkGnB623RZUG0/rahFYBlbyk5wSR1i5MCG1UKnlx64HghgJqAu
Y/xPaJePiFTXb301OhIrAGOCT1SoIPsnTo6/TxYvlxIvNfqJn1hBfrdRCwIDAQAB
AoGAHAzNjODE5YcLlRine39vSnlpnYKC78eVMYa/cJVgQ9nsuoh169/4cqyF4/jW
1Z7hVuNqogh6M6XA2e1MuQNIoHlx2afRNHOXzWDkPTAlqlvU4ivMmTlNXFJRHlXI
+MSr9K6QooER9LjA73qqGdKfCduvz7k60Kh6VWKncAAW0NECQQCbBosqZTuW+qVe
aRUu8wFxTkrE45r5fxoqs9NrTNl/pq+DVa5CP+dqwCi4NOTDrn2X+d0q0erdXRST
FSCvxtPpAkEA3xB09K3grAfQaIq239SvGnKGr9g1ea1th9PiNSj55jFt+7Xm79RN
K8SEm9Ea0ZbnPTiWWVEkgyWm6pMtAcBo0wJAcYVmLUJ6U4HxzOPYbkvmt4kkeW9O
kftANxr966oX70Epb1wzwjG3jdVvPA0HpD/Hmp2PFocnnLhHk7k5+V342QJBAKhJ
PyM1ZvICdy3XsP4O9Afs7UYOxNFGkQLPTLK0dkw/cG1dH5xCO/JQMYdoa2ZCBbS/
U1aRDA3RQytn26WdprcCQGZs6wTsurboFt86cSm8t3p7LBcYW2KiYUyVJuhUT6wW
zx4XH8qXJSBG3w5bsKiovJRFZIMMboWU9PUeRNsUlE8=
-----END RSA PRIVATE KEY-----`
let str = "测试加密字符串";
// 加密
let pub = KEYUTIL.getKey(publicKey);
let enc = KJUR.crypto.Cipher.encrypt(str, pub);
console.log(enc)
// 解密
let prv = KEYUTIL.getKey(privateKey);
let dec_str = KJUR.crypto.Cipher.decrypt(enc, prv);
console.log("解密结果: "+dec_str);
//加签
let key = KEYUTIL.getKey(privateKey);
let signature=new KJUR.crypto.Signature({alg:"SHA1withRSA"});
signature.init(key);
signature.updateString(str);
let a = signature.sign();
let sign = hextob64(a);
// 验签
let signatureVf = new KJUR.crypto.Signature({alg:"SHA1withRSA",prvkeypem:publicKey});
signatureVf.updateString(str);
let result = signatureVf.verify(b64tohex(sign));
console.log("验签结果: "+result);