3

私は、「公開鍵」を使用して RSA アルゴリズムを使用してメッセージを暗号化する必要があるプロジェクトに取り組んでいます。証明書が提供されました。最初に考えたのは、その証明書の公開鍵を使用することでした。調査の結果RSACryptoServiceProvider、暗号化に使用する必要があることがわかりました。

私はmsdnをチェックしましたが、使用すべきだと思った唯一の方法はRSACryptoServiceProvider.ImportCspBlob(byte[] keyBlob). 証明書からエクスポートされた公開鍵を使用しようとすると、証明書のヘッダー データが無効であるというエラーが表示されました。

キャストできることはわかっX509certificate2.PublicKey.KeyRSACryptoServiceProviderいますが、クライアントから理解したところによると、今後は証明書ではなく公開鍵のみが提供されるということです。このキーは、.xml 構成ファイルに保存する必要があります。

RSACryptoServiceProvider要約すると、特定の証明書の公開鍵のみを生成する方法はありますか?

4

2 に答える 2

1

この例を見てみることができます: C# での RSA 公開鍵暗号化

var publicKey = "<RSAKeyValue><Modulus>21wEnTU+mcD2w0Lfo1Gv4rtcSWsQJQTNa6gio05AOkV/Er9w3Y13Ddo5wGtjJ19402S71HUeN0vbKILLJdRSES5MHSdJPSVrOqdrll/vLXxDxWs/U0UT1c8u6k/Ogx9hTtZxYwoeYqdhDblof3E75d9n2F0Zvf6iTb4cI7j6fMs=</Modulus><Exponent>AQAB</Exponent></RSAKeyValue>";

var testData = Encoding.UTF8.GetBytes("testing");

using ( var rsa = new RSACryptoServiceProvider(1024))
{
    try
    {
        // client encrypting data with public key issued by server
        //
        rsa.FromXmlString(publicKey);
        var encryptedData = rsa.Encrypt(testData, true);

        var base64Encrypted = Convert.ToBase64String(encryptedData);

    }
    finally
    {
        rsa.PersistKeyInCsp = false;
    }
}
于 2015-11-09T22:15:42.020 に答える
0

あなたは大丈夫で、良い典型的なパターンに従っています。データの送信者は秘密鍵を必要としません。

以下は、すでに把握しているコードの一部を確認する場合があります。省略したレシーバー/デコーダーの秘密鍵を設定する 1 行。これは、ビルドデプロイのものにあるテストケースから取得しました。

 byte[] certBytAr;  // This is the certificate as bianry in a .cer file (no  private key in it - public only) 

 X509Certificate2 cert2 = new X509Certificate2(certBytAr);


 string strToEncrypt = "Public To Private Test StackOverFlow PsudeoCode. Surfs Up at Secret Beach.";
 byte[] bytArToEncrypt = Encoding.UTF8.GetBytes(strToEncrypt);

 RSACryptoServiceProvider rsaEncryptor = (RSACryptoServiceProvider)cert2.PublicKey.Key; 

 byte[] dataNowEncryptedArray = rsaEncryptor.Encrypt(bytArToEncrypt, true);

 // done - you now have encrypted bytes 
 // 

  // somewhere elxe ...
 // this should decrpyt it - simulate the destination which will decrypt the data with the private key 

 RSACryptoServiceProvider pk =   // how this is set is complicated 

 // set the private key in the x509 oobject we created way above 
 cert2.PrivateKey = pk; 

 RSACryptoServiceProvider rsaDecryptor = (RSACryptoServiceProvider)cert2.PrivateKey;
 byte[] dataDecrypted = rsaDecryptor.Decrypt(dataNowEncryptedArray, true);

 Console.WriteLine(" encrypt 1 Way Intermediate " + BitConverter.ToString(dataDecrypted));

 string strDecodedFinal = Encoding.UTF8.GetString(dataDecrypted);

 if (strDecodedFinal == strToEncrypt)
 {

 }
 else
 {
     Console.WriteLine(" FAILURE OF  ENCRYPTION ROUND TRIP IN SIMPLE TEST (Direction: Public to Private). No Surfing For You ");
  }
于 2015-11-10T00:29:03.143 に答える