1. ホーム
  2. c#

[解決済み] C# RSA暗号化/復号化と送信

2023-03-28 19:40:11

質問

System.Security.Cryptography.RSACryptoServiceProvider を使用した C# による暗号化/復号化のチュートリアルやサンプルをネットでたくさん見ましたが、私ができることを望んでいるのは、次のようなことです。

  • RSA 公開鍵/秘密鍵ペアを作成する。
  • 公開鍵を送信する(概念実証のため、文字列変数に移動させるだけでも可)
  • 新しいRSA暗号プロバイダーを作成し、公開鍵で文字列を暗号化する。
  • 暗号化された文字列(またはデータ)を元の暗号プロバイダーに送信し、文字列を復号化します。

どなたか、この件に関する有用なリソースを教えていただけませんか?

どのように解決するのですか?

これについては十分な例がありますが、とにかく、以下のとおりです。

using System;
using System.Security.Cryptography;

namespace RsaCryptoExample
{
  static class Program
  {
    static void Main()
    {
      //lets take a new CSP with a new 2048 bit rsa key pair
      var csp = new RSACryptoServiceProvider(2048);

      //how to get the private key
      var privKey = csp.ExportParameters(true);

      //and the public key ...
      var pubKey = csp.ExportParameters(false);

      //converting the public key into a string representation
      string pubKeyString;
      {
        //we need some buffer
        var sw = new System.IO.StringWriter();
        //we need a serializer
        var xs = new System.Xml.Serialization.XmlSerializer(typeof(RSAParameters));
        //serialize the key into the stream
        xs.Serialize(sw, pubKey);
        //get the string from the stream
        pubKeyString = sw.ToString();
      }

      //converting it back
      {
        //get a stream from the string
        var sr = new System.IO.StringReader(pubKeyString);
        //we need a deserializer
        var xs = new System.Xml.Serialization.XmlSerializer(typeof(RSAParameters));
        //get the object back from the stream
        pubKey = (RSAParameters)xs.Deserialize(sr);
      }

      //conversion for the private key is no black magic either ... omitted

      //we have a public key ... let's get a new csp and load that key
      csp = new RSACryptoServiceProvider();
      csp.ImportParameters(pubKey);

      //we need some data to encrypt
      var plainTextData = "foobar";

      //for encryption, always handle bytes...
      var bytesPlainTextData = System.Text.Encoding.Unicode.GetBytes(plainTextData);

      //apply pkcs#1.5 padding and encrypt our data 
      var bytesCypherText = csp.Encrypt(bytesPlainTextData, false);

      //we might want a string representation of our cypher text... base64 will do
      var cypherText = Convert.ToBase64String(bytesCypherText);


      /*
       * some transmission / storage / retrieval
       * 
       * and we want to decrypt our cypherText
       */

      //first, get our bytes back from the base64 string ...
      bytesCypherText = Convert.FromBase64String(cypherText);

      //we want to decrypt, therefore we need a csp and load our private key
      csp = new RSACryptoServiceProvider();
      csp.ImportParameters(privKey);

      //decrypt and strip pkcs#1.5 padding
      bytesPlainTextData = csp.Decrypt(bytesCypherText, false);

      //get our original plainText back...
      plainTextData = System.Text.Encoding.Unicode.GetString(bytesPlainTextData);
    }
  }
}

余談ですが、Encrypt() と Decrypt() の呼び出しには、OAEP と PKCS#1.5 パディングを切り替える bool パラメータがあります...あなたの状況で利用可能であれば、OAEP を選択したいかもしれません