为C# .NET创建用于公钥RSA加密的.pem文件

7
我想要为使用该方法生成的公钥创建一个 .pem 文件。
public static Tuple<string, string> CreateKeyPair()
{
    CspParameters cspParams = 
        new CspParameters { 
            ProviderType = 1 /* PROV_RSA_FULL */ 
        };

    RSACryptoServiceProvider rsaProvider = 
        new RSACryptoServiceProvider(1024, cspParams);

    string publicKey = Convert.ToBase64String(rsaProvider.ExportCspBlob(false));
    string privateKey = Convert.ToBase64String(rsaProvider.ExportCspBlob(true));

    return new Tuple<string, string>(privateKey, publicKey);
}

因为我正在为移动应用程序生成此密钥,而它们无法读取它,所以他们要求使用.pem文件代替字符串形式的公钥。

请给予建议,

2个回答

12

最近我需要将我的C#应用程序中生成的PublicKeyPrivateKey保存到文件中,并在以后使用它。为此,我使用了CSharp-easy-RSA-PEM这样的库。

这是一个非常简单和快速的解决方案,所以我会推荐给其他人使用这个库。

我使用以下代码将PublicKey作为string获取(并以Base64格式将其保存到pem文件中):

string publicKeyStr = Crypto.ExportPublicKeyToX509PEM(_cryptoServiceProvider);

它返回类似于这样的东西:

-----BEGIN PUBLIC KEY-----
MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCxnBvS8cdsnAev2sRDRYWxznm1
QxZzaypfNXLvK7CDGk8TR7K+Pzsa+tpJfoyN/Z4B6xdlpsERo2Cu6AzolvrDLx5w
ZoI0kgdfaBMbUkdOB1m97zFYjKWoPeTskFzWZ3GHcQ3EXT0NJXXFXAskY45vEpbc
5qFgEhcPy3BMqHRibwIDAQAB
-----END PUBLIC KEY-----

我使用以下代码获取PrivateKey作为string:

string privateKeyStr = Crypto.ExportPrivateKeyToRSAPEM(_cryptoServiceProvider);

它会返回类似这样的内容:

-----BEGIN RSA PRIVATE KEY-----
MIICWwIBAAKBgQCxnBvS8cdsnAev2sRDRYWxznm1QxZzaypfNXLvK7CDGk8TR7K+
Pzsa+tpJfoyN/Z4B6xdlpsERo2Cu6AzolvrDLx5wZoI0kgdfaBMbUkdOB1m97zFY
jKWoPeTskFzWZ3GHcQ3EXT0NJXXFXAskY45vEpbc5qFgEhcPy3BMqHRibwIDAQAB
AoGAAdwpqm7fxh0S3jOYpJULeQ45gL11dGX7Pp4CWHYzq1vQ14SDtFxYfnLWwGLz
499zvSoSHP1pvjPgz6lxy9Rw8dUxCgvh8VQydMQzaug2XD1tkmtcSWInwFKBAfQ7
rceleyD0aK8JHJiuzM1p+yIJ/ImGK0Zk2U/svqrdJrNR4EkCQQDo3d5iWcjd3OLD
38k1GALEuN17KNpJqLvJcIEJl0pcHtOiNnyy2MR/XUghDpuxwhrhudB/TvX4tuI0
MUeVo5fjAkEAw0D6m9jkwE5uuEYN/l/84rbQ79p2I7r5Sk6zbMyBOvgl6CDlJyxY
434DDm6XW7c55ALrnlratEW5HPiPxuHZBQJANnE4vtGy7nvn4Fd/mRQmAYwe695f
On1iefP9lxpx3huu6uvGN6IKPqS2alQZ/nMdCc0Be+IgC6fmNsGWtNtsdQJAJvB4
ikgxJqD9t8ZQ2CAwgM5Q0OTSlsGdIdKcOeB3DVmbxbV5vdw8RfJFjcVEbkgWRYDH
mKcp4rXc+wgfNFyqOQJATZ1I5ER8AZAn5JMMH9zK+6oFvhLUgKyWO18W+dbcFrBd
AzlTB+HHYEIyTmaDtXWAwgBvJNIHk4BbM1meCH4QnA==
-----END RSA PRIVATE KEY-----

然后您可以使用

RSACryptoServiceProvider publicX509key = Crypto.DecodeX509PublicKey(publicKeyStr);
RSACryptoServiceProvider privateRSAkey = Crypto.DecodeRsaPrivateKey(privateKeyStr);

将已保存的密钥恢复到 RSACryptoServiceProvider

因此,如果有人需要解决类似问题,您可以下载库,在您的Visual Studio中转到Solution Explorer ->(右键单击您的项目) ->添加 ->参考 ->概述,并在需要时添加using CSharp_easy_RSA_PEM;即可 :)


看起来是个不错的解决方案。 - President James K. Polk
6
如果它有一份自由的许可证,我会为它点赞,但遗憾的是,它是GPL许可证。 - Jared Thirsk

10
首先,所谓的.pem文件并不是一个固定的规范或格式。通常被描述为“PEM”文件的是几种不同的文件格式。当SSLeay(现在的OpenSSL)项目需要生成包含密钥信息的base64编码输出文件时,他们从旧的Privacy-Enhanced Mail RFCs 1421-1424中借鉴了格式化概念,并将扩展名.pem添加到这些文件的末尾。但这样的文件可能包含公钥、私钥、证书请求、证书、证书列表等不同内容。每个都是不同的。因此,如果你只被告知要生成一个.pem文件,你就必须猜测实际需要什么。
编写这样的文件最简单的方法是使用Bouncycastle C#库。包Org.BouncyCastle.OpenSsl包含许多工具,包括一个PemWriter类,应该能帮助你。

1
不要使用Org.BouncyCastle.OpenSsl,因为它没有C#的示例和非常糟糕的文档!我曾经遇到同样的问题,而这个库真的帮了我很大忙:https://github.com/jrnker/CSharp-easy-RSA-PEM。它有很好的示例,你可以只用一行代码就解决你的问题(而不是实现BouncyCastle中的一些接口)! - V. Panchenko
@V.Panchenko:感谢您的评论。请考虑编写一个包含一行代码示例的答案来回答这个问题。 - President James K. Polk
7
CSharp-easy-RSA-PEM 是遵循 GPL3 许可证的,因此除非您的项目也采用 GPL 许可证,否则您不能使用它。而另一方面,BouncyCastle 则是采用 MIT 许可证。 - l3dx

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接