【绝迹篇】C#RSA算法实现
生活随笔
收集整理的這篇文章主要介紹了
【绝迹篇】C#RSA算法实现
小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
當(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è)第三方庫,因?yàn)橄旅嫔婕暗降霓D(zhuǎn)換代碼都是需要依賴這個(gè)庫來實(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ù)用的
轉(zhuǎn)載于:https://www.cnblogs.com/ButterflyEffect/p/9494061.html
總結(jié)
以上是生活随笔為你收集整理的【绝迹篇】C#RSA算法实现的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: django中的中间件执行顺序
- 下一篇: js前台页面显示中文,后台存对应的val