備忘録

備忘録

C# で RSA暗号鍵(.pem)作成する

Ⅰ. はじめに

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");
    }
  }
}

Ⅲ. 実行結果

f:id:kagasu:20170202132705p:plain

メモ(2020/03/23 追記)

.NET 5でPEMの読み書きAPIが追加されるようです。
https://github.com/dotnet/runtime/pull/32260