0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Windows C# , BouncyCastle で 公開鍵暗号方式(RSA)にチャレンジ (1) 鍵生成

Last updated at Posted at 2025-08-27

シリーズもの第1回
第2回: https://qiita.com/macchan/items/b50c5be3991b77d2b31f

1. はじめに

やってみた系自分用メモ。まずは公開鍵暗号方式について少し復習します。

役割と手順はこうです。

Bさん:平文を持っている
Aさん:文を受け取りたい

1.Aさんが公開鍵、秘密鍵ペアをつくる。
2.AさんがBさんに公開鍵を渡す。
3.Bさんが公開鍵で平文を暗号化、暗号文にする
4.BさんがAさんに暗号文を渡す。
5.Aさんは暗号文を秘密鍵で復号し、Bさんの平文を得る。

ここで以下のことから文の秘密が保たれる
・秘密鍵はAさんしか知らない
・公開鍵では暗号文を復号できない

秘密鍵も作っているので「公開鍵-秘密鍵暗号方式」と呼ぶべきだ、と思っているんですが、自分だけですかね?

2. なぜ BouncyCastleなのか

2-1. PEM形式対応

通信する相手がWindowsとは限らないので、「鍵のやりとりはPEM形式で行う」ことが業界標準になっているようです。鍵の生成だけなら標準で RSACryptoServiceProvider が使えますが、PEM形式への出力に対応していません(こうすればできる、というのがありましたら教えてください)。

2-2. そこそこレガシーなプラットフォームでも対応

.NET Framework 4.x 系でも何とかなります。これは(個人的に)大きなポイントです。

3. 秘密鍵、公開鍵の生成

3-1. 参考までに RSACryptoServiceProvider(xml形式)

sample.cs
using System;
using System.Security.Cryptography;

class Program
{
    static void Main()
    {
        // 2048ビットのRSA鍵を生成
        using (var rsa = new RSACryptoServiceProvider(2048))
        {
            // 公開鍵(XML形式)
            string publicKeyXml = rsa.ToXmlString(false);
            // 秘密鍵(XML形式)
            string privateKeyXml = rsa.ToXmlString(true);

            Console.WriteLine("公開鍵:");
            Console.WriteLine(publicKeyXml);
            Console.WriteLine();
            Console.WriteLine("秘密鍵:");
            Console.WriteLine(privateKeyXml);
        }
    }
}

3-2.BouncyCastle(PEM形式)

sample.cs
using System;
using System.IO;
using Org.BouncyCastle.Crypto;
using Org.BouncyCastle.Crypto.Generators;
using Org.BouncyCastle.Crypto.Parameters;
using Org.BouncyCastle.Security;
using Org.BouncyCastle.OpenSsl;

class Program
{
    static void Main()
    {
        // RSA鍵ペア生成(2048ビット)
        var keyGen = new RsaKeyPairGenerator();
        keyGen.Init(new KeyGenerationParameters(new SecureRandom(), 2048));
        AsymmetricCipherKeyPair keyPair = keyGen.GenerateKeyPair();

        // 公開鍵をPEM形式で保存
        using (var writer = new StringWriter())
        {
            var pemWriter = new PemWriter(writer);
            pemWriter.WriteObject(keyPair.Public);
            pemWriter.Writer.Flush();
            Console.WriteLine("公開鍵:");
            Console.WriteLine(writer.ToString());
        }

        // 秘密鍵をPEM形式で保存
        using (var writer = new StringWriter())
        {
            var pemWriter = new PemWriter(writer);
            pemWriter.WriteObject(keyPair.Private);
            pemWriter.Writer.Flush();
            Console.WriteLine("秘密鍵:");
            Console.WriteLine(writer.ToString());
        }
    }
}

4. 続く

鍵生成だけで疲れたのでまた次回。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?