当下最流行的RSA加密算法,只有公钥和私钥同时拥有才能破解加密信息,RSA加密算法的出现有利于数据安全性传输
1.C#中自带RSACryptoServiceProvider类可以让你很好的生成XML格式的公钥和私钥,两句代码就搞定
2.但是生成的XML格式前端不能很好的利用和读懂,所以在生成的XML格式里需要转换成PEM格式,这样才能直接Copy到验证工具里加密解密,非常方便
首先,我们先导入一个第三方库,因为下面涉及到的转换代码都是需要依赖这个库来实现,导入操作如下
控制台里输入
PM > Install-Package BouncyCastle
导入到引用里面
3.好了,下面就是纯代码实现了,目的就是将XML格式转换为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格式公钥转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格式私钥转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到验证工具里面直接加密/解密数据用的
人说,如果你很想要一样东西,就放它走 。如果它回来找你,那么它永远都是你的。要是它没有回来,那么不用再等了,因为它根本就不是你的。 ——伊恩·麦克尤恩
以上就是少见的C# RSA算法的详细内容,更多关于C# RSA算法的资料请关注小牛知识库其它相关文章!
问题内容: 我想为我的应用程序提供基于RSA算法的简单许可机制。 有免费的RSA库吗? 问题答案: 只需使用和软件包即可。它在Java标准平台中。 官方文档链接: 包装文件 包装文件
RSA算法是一种公钥加密技术,被认为是最安全的加密方式。 它是由Rivest,Shamir和Adleman于1978年发明的,因此命名为RSA算法。 算法 (Algorithm) RSA算法具有以下功能 - RSA算法是包含素数的整数在有限域中的流行取幂。 该方法使用的整数足够大,难以求解。 该算法有两组密钥:私钥和公钥。 您将不得不通过以下步骤来处理RSA算法 - 步骤1:生成RSA模数 初
本文向大家介绍C#常见算法面试题小结,包括了C#常见算法面试题小结的使用技巧和注意事项,需要的朋友参考一下 本文实例汇总了C#面试常见的算法题及其解答。具有不错的学习借鉴价值。分享给大家供大家参考。具体如下: 1.写出冒泡,选择,插入排序算法。 2.有一列数1,1,2,3,5,........求第30个数. 3. 程序设计: 猫大叫一声,所有的老鼠都开始逃跑,主人被惊醒。 4.有一个字符串 "I
本文向大家介绍什么是RSA算法?相关面试题,主要包含被问及什么是RSA算法?时的应答技巧和注意事项,需要的朋友参考一下 回答:RSA(Rivest-Shamir-Adelman)算法是用于签名数据和加密的第一个算法。它最广泛用于保护敏感数据。它也被称为非对称密码算法,它对两个不同的密钥(即公共密钥和私有密钥)起作用。公开密钥可以与任何人共享,并且私有密钥必须保密。
null
我在C#中有一个传递公钥字符串的方法。 我传递的公钥字符串是 我得到一个错误组织。BouncyCastle。安全InvalidKeyException:“不是RSA密钥”。我传递给该方法的公钥格式是否不正确?