少見的C# RSA算法
當(dāng)下最流行的RSA加密算法,只有公鑰和私鑰同時(shí)擁有才能破解加密信息,RSA加密算法的出現(xiàn)有利于數(shù)據(jù)安全性傳輸
1.C#中自帶RSACryptoServiceProvider類可以讓你很好的生成XML格式的公鑰和私鑰,兩句代碼就搞定
2.但是生成的XML格式前端不能很好的利用和讀懂,所以在生成的XML格式里需要轉(zhuǎn)換成PEM格式,這樣才能直接Copy到驗(yàn)證工具里加密解密,非常方便
首先,我們先導(dǎo)入一個(gè)第三方庫(kù),因?yàn)橄旅嫔婕暗降霓D(zhuǎn)換代碼都是需要依賴這個(gè)庫(kù)來實(shí)現(xiàn),導(dǎo)入操作如下
控制臺(tái)里輸入
PM > Install-Package BouncyCastle
導(dǎo)入到引用里面
3.好了,下面就是純代碼實(shí)現(xiàn)了,目的就是將XML格式轉(zhuǎn)換為PEM格式,無論公鑰還是私鑰,不羅嗦直接代碼走起
static void Main(string[] args) { RSACryptoServiceProvider rsa = new RSACryptoServiceProvider(); string xmlPrivateKey = rsa.ToXmlString(true);//XML密鑰 string pemPrivateKey = Xml2PemPrivate(xmlPrivateKey, "F:/privatePEM.txt");//PEM密鑰 string xmlPublicKey = rsa.ToXmlString(false);//XML公鑰 string pemPublicKey = Xml2PemPublic(xmlPublicKey, "F:/publicPEM.txt");//PEM密鑰 } /// <summary> /// XML格式公鑰轉(zhuǎn)PEM格式公鑰 /// </summary> /// <param name="xml">XML格式的公鑰</param> /// <param name="saveFile">保存文件的物理路徑</param> public static string Xml2PemPublic(string xml, string saveFile) { var rsa = new RSACryptoServiceProvider(); rsa.FromXmlString(xml); var p = rsa.ExportParameters(false); RsaKeyParameters key = new RsaKeyParameters(false, new BigInteger(1, p.Modulus), new BigInteger(1, p.Exponent)); using (var sw = new StreamWriter(saveFile)) { var pemWriter = new Org.BouncyCastle.OpenSsl.PemWriter(sw); pemWriter.WriteObject(key); } SubjectPublicKeyInfo publicKeyInfo = SubjectPublicKeyInfoFactory.CreateSubjectPublicKeyInfo(key); byte[] serializedPublicBytes = publicKeyInfo.ToAsn1Object().GetDerEncoded(); string publicKey = Convert.ToBase64String(serializedPublicBytes); return Format(publicKey, 1); } /// <summary> /// XML格式私鑰轉(zhuǎn)PEM /// </summary> /// <param name="xml">XML格式私鑰</param> /// <param name="saveFile">保存文件的物理路徑</param> public static string Xml2PemPrivate(string xml, string saveFile) { var rsa = new RSACryptoServiceProvider(); rsa.FromXmlString(xml); var p = rsa.ExportParameters(true); var key = new RsaPrivateCrtKeyParameters( new BigInteger(1, p.Modulus), new BigInteger(1, p.Exponent), new BigInteger(1, p.D), new BigInteger(1, p.P), new BigInteger(1, p.Q), new BigInteger(1, p.DP), new BigInteger(1, p.DQ), new BigInteger(1, p.InverseQ)); using (var sw = new StreamWriter(saveFile)) { var pemWriter = new Org.BouncyCastle.OpenSsl.PemWriter(sw); pemWriter.WriteObject(key); } PrivateKeyInfo privateKeyInfo = PrivateKeyInfoFactory.CreatePrivateKeyInfo(key); byte[] serializedPrivateBytes = privateKeyInfo.ToAsn1Object().GetEncoded(); string privateKey = Convert.ToBase64String(serializedPrivateBytes); return Format(privateKey, 2); } /// <summary> /// 格式化公鑰/私鑰 /// </summary> /// <param name="key">生成的公鑰/私鑰</param> /// <param name="type">1:公鑰 2:私鑰</param> /// <returns>PEM格式的公鑰/私鑰</returns> public static string Format(string key, int type) { string result = string.Empty; int length = key.Length / 64; for (int i = 0; i < length; i++) { int start = i * 64; result = result + key.Substring(start, 64) + "\r\n"; } result = result + key.Substring(length * 64); if (type == 1) { result = result.Insert(0, "-----BEGIN PUBLIC KEY-----\r\n"); result += "\r\n-----END PUBLIC KEY-----"; } if (type == 2) { result = result.Insert(0, "-----BEGIN PRIVATE KEY-----\r\n"); result += "\r\n-----END PRIVATE KEY-----"; } return result; }
4.最后輸出在F盤的TXT文件里面就是可以直接用來Copy到驗(yàn)證工具里面直接加密/解密數(shù)據(jù)用的
人說,如果你很想要一樣?xùn)|西,就放它走 。如果它回來找你,那么它永遠(yuǎn)都是你的。要是它沒有回來,那么不用再等了,因?yàn)樗揪筒皇悄愕摹?——伊恩·麥克尤恩
以上就是少見的C# RSA算法的詳細(xì)內(nèi)容,更多關(guān)于C# RSA算法的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
C# WinForm控件對(duì)透明圖片重疊時(shí)出現(xiàn)圖片不透明的簡(jiǎn)單解決方法
這篇文章主要介紹了C# WinForm控件對(duì)透明圖片重疊時(shí)出現(xiàn)圖片不透明的簡(jiǎn)單解決方法,結(jié)合實(shí)例形式分析了WinForm圖片重疊后造成圖片不透明的原因與相應(yīng)的解決方法,需要的朋友可以參考下2016-06-06C#實(shí)現(xiàn)學(xué)生管理系統(tǒng)
這篇文章主要為大家詳細(xì)介紹了C#實(shí)現(xiàn)學(xué)生管理系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-08-08C#過濾DataTable中空數(shù)據(jù)和重復(fù)數(shù)據(jù)的示例代碼
這篇文章主要給大家介紹了關(guān)于C#過濾DataTable中空數(shù)據(jù)和重復(fù)數(shù)據(jù)的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2021-01-01秒表計(jì)時(shí)器以及STOPWATCH(實(shí)例講解)
下面小編就為大家分享一篇秒表計(jì)時(shí)器以及STOPWATCH(實(shí)例講解),具有很好的參考價(jià)值,希望對(duì)大家有所幫助2017-11-11C#實(shí)現(xiàn)網(wǎng)絡(luò)通信共享庫(kù)NetShare的使用示例
本文主要介紹了C#實(shí)現(xiàn)網(wǎng)絡(luò)通信共享庫(kù)NetShare,網(wǎng)絡(luò)通信共享庫(kù)NetShare用于保證客戶端與服務(wù)器通信數(shù)據(jù)包的規(guī)范和統(tǒng)一,感興趣的可以了解一下2023-11-11使用C#的正則表達(dá)式驗(yàn)證中文字符(實(shí)例代碼)
本文通過實(shí)例代碼給大家介紹了使用C#的正則表達(dá)式驗(yàn)證中文字符的方法,需要的的朋友參考下吧2017-07-07C#開發(fā)Winform實(shí)現(xiàn)文件操作案例
這篇文章介紹了C#開發(fā)Winform實(shí)現(xiàn)文件操作的案例,文中通過示例代碼介紹的非常詳細(xì)。對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-04-04