RSA加密解密和签名验签过程理解

RSA加密解密和签名验签过程理解,第1张

加密是为了防止信息被泄露

签名是为了防止信息被篡改

第一个场景:战场上,B要给A传递一条消息,内容为某一指令。

RSA的加密过程如下:

(1)A生成一对密钥(公钥和私钥),私钥不公开,A自己保留。公钥为公开的,任何人可以获取。

(2)A传递自己的公钥给B,B用A的公钥对消息进行加密。

(3)A接收到B加密的消息,利用A自己的私钥对消息进行解密。

在这个过程中,只有2次传递过程,第一次是A传递公钥给B,第二次是B传递加密消息给A,即使都被敌方截获,也没有危险性,因为只有A的私钥才能对消息进行解密,防止了消息内容的泄露。

第二个场景:A收到B发的消息后,需要进行回复“收到”。

RSA签名的过程如下:

(1)A生成一对密钥(公钥和私钥),私钥不公开,A自己保留。公钥为公开的,任何人可以获取。

(2)A给B发送消息,A先计算出消息的消息摘要,然后使用自己的私钥加密消息摘要,被加密的消息摘要就是签名.并将签名和消息本身(签名原文)一起传递给B.(A用自己的私钥给消息摘要加密成为签名)

(3)B收到消息后,也会使用和A相同的方法提取消息摘要,然后用A的公钥解密签名,并与自己计算出来的消息摘要进行比较-->如果相同则说明消息是A发送给B的,同时,A也无法否认自己发送消息给B的事实.(B使用A的公钥解密签名文件的过程,叫做"验签")

在这个过程中,只有2次传递过程,第一次是A传递加签的消息和消息本身给B,第二次是B获取A的公钥,即使都被敌方截获,也没有危险性,因为只有A的私钥才能对消息进行签名,即使知道了消息内容,也无法伪造带签名的回复给B,防止了消息内容的篡改。

但是,综合两个场景你会发现,第一个场景虽然被截获的消息没有泄露,但是可以利用截获的公钥,将假指令进行加密,然后传递给A。第二个场景虽然截获的消息不能被篡改,但是消息的内容可以利用公钥验签来获得,并不能防止泄露。所以在实际应用中,要根据情况使用,也可以同时使用加密和签名,比如A和B都有一套自己的公钥和私钥,当A要给B发送消息时,先用B的公钥对消息加密,再对加密的消息使用A的私钥加签名,达到既不泄露也不被篡改,更能保证消息的安全性。

总结:公钥加密、私钥解密、私钥签名、公钥验签。

npm install  wxapp_rsa

var RSA = require('/wxapp_rsa.js')

// RSA加签

    var sign_rsa = new RSA.RSAKey()

//privateKey_pkcs1需要是-----BEGIN PRIVATE KEY-----开头的私钥

    sign_rsa = RSA.KEYUTIL.getKey(privateKey_pkcs1)

    console.log('签名RSA:')

    console.log(sign_rsa)

    var hashAlg = 'MD5withRSA'

    var hSig = sign_rsa.signString("12345678901234567890", hashAlg)

    hSig = RSA.hex2b64(hSig)// hex 转 b64

    console.log("签名结果:" + hSig)

    // RSA 验签

    var verify_rsa = new RSA.RSAKey()

    verify_rsa = RSA.KEYUTIL.getKey(publicKey_pkcs1)

    console.log('验签RSA:')

    console.log(verify_rsa)

    hSig = RSA.b64tohex(hSig)

    var ver = verify_rsa.verifyString("12345678901234567890", hSig)

    console.log('验签结果:' + ver)

//  RSA加密 【加密字段长度不大于117】

    var encrypt_rsa = new RSA.RSAKey()

    encrypt_rsa = RSA.KEYUTIL.getKey(rsa_public_key)

    console.log('加密RSA:')

    console.log(encrypt_rsa)

    var encStr = encrypt_rsa.encrypt('1234567890')

    console.log(encStr)

    encStr = RSA.hex2b64(encStr)

    console.log("加密结果:" + encStr)

    // RSA 解密

    var decrypt_rsa = new RSA.RSAKey()

    decrypt_rsa = RSA.KEYUTIL.getKey(rsa_public_key_private)

    console.log('解密RSA:')

    console.log(decrypt_rsa)

    encStr = RSA.b64tohex(encStr)

    var decStr = decrypt_rsa.decrypt(encStr)

    console.log("解密结果:" + decStr)


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/11116239.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-13
下一篇 2023-05-13

发表评论

登录后才能评论

评论列表(0条)

保存