備忘録

備忘録

C#でRSAの暗号化と復号を行う方法

Ⅰ. はじめに

タイトルの通り「C#RSAの暗号化と復号を行う方法」です。
サンプルプログラムとして扱うRSA暗号の詳細は以下の表の通りです。

アルゴリズム RSA
KeySize 1024bit
モード ECB
パディング OAEPWithSHA1AndMGF1Padding

Ⅱ. サンプルプログラム

.NET標準ライブラリを使う方法
private byte[] RSAEncrypt(byte[] modulus, byte[] exponent, byte[] bytes)
{
  // RSA/ECB/OAEPWithSHA1AndMGF1Padding
  using (var rsa = new RSACryptoServiceProvider())
  {
    rsa.ImportParameters(new RSAParameters
    {
      Modulus = modulus,
      Exponent = exponent
    });
    
    return rsa.Encrypt(bytes, true);

    // 復号する時
    // rsa.Decrypt(bytes, true);
  }
}
BouncyCastleを使う方法
Install-Package Portable.BouncyCastle
private byte[] RSAEncrypt(byte[] modulus, byte[] exponent, byte[] bytes)
{
  // RSA/ECB/OAEPWithSHA1AndMGF1Padding
  var key = new RsaKeyParameters(false, new BigInteger(1, modulus), new BigInteger(1, exponent));
  var cipher = new OaepEncoding(new RsaEngine(), new Sha1Digest());
  cipher.Init(true, key);

  // 復号する時
  // cipher.Init(false, key);
  
  int blockSize = cipher.GetInputBlockSize();
  var encryptedBytes = new List<byte>();
  for (int chunkPosition = 0; chunkPosition < bytes.Length; chunkPosition += blockSize)
  {
    var chunkLength = Math.Min(blockSize, bytes.Length - chunkPosition);
    encryptedBytes.AddRange(cipher.ProcessBlock(bytes, chunkPosition, chunkLength));
  }
  
  return encryptedBytes.ToArray();
}

Ⅲ. 鍵を読み込む方法

1. 秘密鍵、公開鍵を作成する
$ openssl genrsa -out private 2048
$ openssl rsa -in private -pubout -out public
$ cat public
-----BEGIN PUBLIC KEY-----
MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAvJQMzl0SEKfxmRmzvkxa
X8vA11xyUcK4cwwyp6+lrULF/kmRN/xwWGXSG5sIOvCXKo9DnC8uQpNf60nFFPMZ
WoSHahfvz+QbY2usWkRAoO5l18ET1U2+035V32W7NqIvDEi9klMybmP9qyOFAfHO
xGphOpM7qrjoTC00KY3WILyaj0Qj/b00sghxx89Ud/rq5D995CVOf6O88mtRUEZ6
TY8SSiuxevPj8str96lLQLParb0Eja8mIz2aEf1O1og0IUlj3+X7sTY8mhjNMKKe
xws7QlrcGHJenTzi2Y11P/oKFljRBMMVvXscItX+wc1WRKQxktMlqqNTzNbmWR4f
owIDAQAB
-----END PUBLIC KEY-----
2. サンプルプログラムを書く

Program.cs

var publicKey = File.ReadAllText("public");

var rsa = RSA.Create();
rsa.ImportFromPem(publicKey);
var parameters = rsa.ExportParameters(false);
Console.WriteLine(BitConverter.ToString(parameters.Modulus!).Replace("-", " "));
Console.WriteLine(BitConverter.ToString(parameters.Exponent!).Replace("-", " "));
実行結果
BC 94 0C CE 5D 12 10 A7 F1 99 19 B3 BE 4C 5A 5F CB C0 D7 5C 72 51 C2 B8 73 0C 32 A7 AF A5 AD 42 C5 FE 49 91 37 FC 70 58 65 D2 1B 9B 08 3A F0 97 2A 8F 43 9C 2F 2E 42 93 5F EB 49 C5 14 F3 19 5A 84 87 6A 17 EF CF E4 1B 63 6B AC 5A 44 40 A0 EE 65 D7 C1 13 D5 4D BE D3 7E 55 DF 65 BB 36 A2 2F 0C 48 BD 92 53 32 6E 63 FD AB 23 85 01 F1 CE C4 6A 61 3A 93 3B AA B8 E8 4C 2D 34 29 8D D6 20 BC 9A 8F 44 23 FD BD 34 B2 08 71 C7 CF 54 77 FA EA E4 3F 7D E4 25 4E 7F A3 BC F2 6B 51 50 46 7A 4D 8F 12 4A 2B B1 7A F3 E3 F2 CB 6B F7 A9 4B 40 B3 DA AD BD 04 8D AF 26 23 3D 9A 11 FD 4E D6 88 34 21 49 63 DF E5 FB B1 36 3C 9A 18 CD 30 A2 9E C7 0B 3B 42 5A DC 18 72 5E 9D 3C E2 D9 8D 75 3F FA 0A 16 58 D1 04 C3 15 BD 7B 1C 22 D5 FE C1 CD 56 44 A4 31 92 D3 25 AA A3 53 CC D6 E6 59 1E 1F A3
01 00 01