Ⅰ. はじめに
C#でpemファイルを作成する方法です。
その逆の、
「C#でpemファイルを読み込む方法」はy_yoda様がQiitaに投稿している記事の通りです。
http://qiita.com/y_yoda/items/f4bd3ec56ac7591c5804
Ⅱ. 環境
- C#
- .NET Core 1.1.0
Ⅲ. ソースコード
NuGetで BouncyCastle をインストールして下さい。
Install-Package Portable.BouncyCastle
Program.cs
public class Program { public static void Main(string[] args) { var rsa = RSA.Create(); var parameter = rsa.ExportParameters(true); var privateKey = RsaPemMaker.GetPrivatePemString(parameter); File.WriteAllText("private-key.pem", privateKey); Console.WriteLine(privateKey); var publicKey = RsaPemMaker.GetPublicPemString(parameter); File.WriteAllText("public-key.pem", privateKey); Console.WriteLine(publicKey); } }
RsaPemMaker.cs
using System; using System.IO; using System.Security.Cryptography; using System.Text; using Org.BouncyCastle.Crypto.Parameters; using Org.BouncyCastle.Math; public static class RsaPemMaker { public static string GetPrivatePemString(RSAParameters p) { 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 stream = new MemoryStream()) { using (var writer = new StreamWriter(stream, new UTF8Encoding())) { var pemWriter = new Org.BouncyCastle.OpenSsl.PemWriter(writer); pemWriter.WriteObject(key); } return new UTF8Encoding().GetString(stream.ToArray()).Replace("\r\n", "\n"); } } public static string GetPublicPemString(RSAParameters p) { var key = new RsaKeyParameters( false, new BigInteger(1, p.Modulus), new BigInteger(1, p.Exponent)); using (var stream = new MemoryStream()) { using (var writer = new StreamWriter(stream, new UTF8Encoding())) { var pemWriter = new Org.BouncyCastle.OpenSsl.PemWriter(writer); pemWriter.WriteObject(key); } return new UTF8Encoding().GetString(stream.ToArray()).Replace("\r\n", "\n"); } } }
Ⅲ. 実行結果
メモ(2020/03/23 追記)
.NET 5でPEMの読み書きAPIが追加されるようです。
https://github.com/dotnet/runtime/pull/32260