シリーズもの第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. 続く
鍵生成だけで疲れたのでまた次回。