RSA加密
非對稱加密算法,兩個且不同的Key,一個公開,一個私密,公開加密,私密解密。
特點:
原文短,加密后密文長
生成相對較慢
安全性超強
生成公鑰、私鑰
我們使用.net進行生成公鑰、私鑰。
使用RSA.ToXmlString(Boolean) 方法生成公鑰以及私鑰,方法中接收一個參數(shù),true
?表示同時包含 RSA 公鑰和私鑰;false
?表示僅包含公鑰,需要注意的是這里生成的是XML格式。
RSACryptoServiceProvider rSA = new();
string pubKey = rSA.ToXmlString(false);//公鑰
string priKey = rSA.ToXmlString(true);//私鑰
后端使用?
在后端加密解密需要引入RSACryptoServiceProvider 類,該類提供了對RSA算法的實現(xiàn)執(zhí)行非對稱加密和解密,同時,該類是不可被繼承的。
RSACryptoServiceProvider rsa = new RSACryptoServiceProvider();
RSA加密
加密調(diào)用Encrypt(Byte[], Boolean)方法,第一個參數(shù)為需要加密的數(shù)據(jù),是一個byte[]格式,返回同樣為一個byte[]格式。
byte[] cipherbytes;
rsa.FromXmlString(pubKey);
cipherbytes = rsa.Encrypt(Encoding.UTF8.GetBytes(source), false);
var b = Convert.ToBase64String(cipherbytes);
RSA解密
解密調(diào)用Decrypt(Byte[], Boolean)方法,第一個參數(shù)為要解密的數(shù)據(jù),是一個byte[]格式,返回同樣為一個byte[]格式。
rsa.FromXmlString(priKey);
byte[] cipherbytex;
cipherbytex = rsa.Decrypt(Convert.FromBase64String(b), false);
var c = Encoding.UTF8.GetString(cipherbytex);
前端vue使用后端傳遞的公鑰加密
我這里使用的加密庫為JSEncrypt庫,安裝JSEncrypt庫。
npm install jsencrypt -D
?在頁面中對其引用。
import {JSEncrypt} from 'jsencrypt'
需要注意?:.net生成的公鑰與私鑰是XML格式,而前端JSEncrypt庫使用時需要Pkcs8格式,我們這里需要在后端處理一下公鑰再傳遞給前端,不然前端返回密文的時候為falae。
后端將XML格式轉(zhuǎn)換為Pkcs8格式
我們需要在程序包管理控制臺中安裝XC.RSAUtil包
NuGet\Install-Package XC.RSAUtil -Version 1.3.6
這個包包含了幾種轉(zhuǎn)換的格式:
XML轉(zhuǎn)Pkcs1
RsaKeyConvert.PrivateKeyXmlToPkcs1()私鑰
RsaKeyConvert.PublicKeyXmlToPem()公鑰
XML轉(zhuǎn)Pkcs8
RsaKeyConvert.PrivateKeyXmlToPkcs8()私鑰
RsaKeyConvert.PublicKeyXmlToPem()公鑰
Pkcs1轉(zhuǎn)XML?
RsaKeyConvert.PrivateKeyPkcs1ToXml()私鑰
RsaKeyConvert.PublicKeyPemToXml()公鑰
Pkcs8轉(zhuǎn)XML?
RsaKeyConvert.PrivateKeyPkcs8ToXml()私鑰
RsaKeyConvert.PublicKeyPemToXml()公鑰
我這里使用RsaKeyConvert.PublicKeyXmlToPem() ,再將轉(zhuǎn)換的值傳遞給前端,前端就能使用JSEncrypt進行RSA加密了。
string pubKey = rSA.ToXmlString(false);//公鑰
string priKey = rSA.ToXmlString(true);//私鑰
var keyList = RsaKeyConvert.PublicKeyXmlToPem(pubKey);//將xml格式轉(zhuǎn)換為Pkcs8
return new { keyList };
?前端加密
雖然我們前端是可以解密的,但是處于安全考慮,我們只用將公鑰傳遞給前端就可以了,私鑰是不傳遞的,私鑰是用于解碼使用公鑰加密的密文。
我們使用JSEncrypt庫主要使用其中的幾個方法:
setPublicKey('獲取的公鑰')設置公鑰
setPrivateKey('獲取的私鑰')設置私鑰
encrypt('加密內(nèi)容')加密
decrypt('解密內(nèi)容')解密
?這里我們使用公鑰對對456進行加密。
postFdd().then(res => {
console.log(res)
var encryptor = new JSEncrypt()
encryptor.setPublicKey(res.keyList)
var rsaPassWord = encryptor.encrypt('456')
// encryptor.setPrivateKey(res.priKey) //設置秘鑰
// var uncrypted = decrypt.decrypt(encryptor) //解密之前拿公鑰加密的內(nèi)容
console.log(rsaPassWord)
})
我們打印出來可以看到?keyList是為Pkcs8格式,priKey是為XML格式,而下面那一段字段就是我們加密出來的密文。
XML的格式以及Pkcs8格式
XML開頭為<RSAKeyValue><Modulus>文章來源:http://www.zghlxwxcb.cn/news/detail-811046.html
Pkcs8格式開頭為-----BEGIN PUBLIC KEY-----文章來源地址http://www.zghlxwxcb.cn/news/detail-811046.html
到了這里,關于RSA加密,公鑰、私鑰的生成,前端使用公鑰加密,JSEncrypt返回值為false的原因以及解決方法,XML轉(zhuǎn)換Pkcs1、8的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網(wǎng)!