这篇文章主要介绍了非常少见的C# RSA算法,文章简单易懂,实例代码帮助大家更好的学习,感兴趣的朋友可以了解下
当下最流行的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算法的资料请关注得得之家其它相关文章!
本文标题为:少见的C# RSA算法


- Oracle中for循环的使用方法 2023-07-04
- 在C# 8中如何使用默认接口方法详解 2023-03-29
- Unity3D实现渐变颜色效果 2023-01-16
- c# 模拟线性回归的示例 2023-03-14
- WPF使用DrawingContext实现绘制刻度条 2023-07-04
- C# 使用Aspose.Cells 导出Excel的步骤及问题记录 2023-05-16
- Unity Shader实现模糊效果 2023-04-27
- .NET CORE DI 依赖注入 2023-09-27
- 如何使用C# 捕获进程输出 2023-03-10
- user32.dll 函数说明小结 2022-12-26