2017-02-11 28 views
1

私はCrypto ++で作成されたDERコード化RSA鍵ペアと暗号を持っています。それらはBase64Encoded文字列です。私はまず、Base64からバイト配列にデータをデコードしますが、私はそれらをRSACryptoServiceProviderにロードする方法がわかりません。C#でASN.1/DERでコード化されたRSA鍵ペアをロード

static void Main() 
{ 
    string pbkeystr = "mypublickey"; 
    string pvkeystr = "myprivatekey"; 
    string cipherstr = "mycipher"; 

    byte[] pbkey = Convert.FromBase64String(pbkeystr); 
    byte[] pvkey = Convert.FromBase64String(pvkeystr); 
    byte[] cipher = Convert.FromBase64String(cipherstr); 

    RSACryptoServiceProvider rsa = new RSACryptoServiceProvider(); 

    //Set keys here.. 

    //Decrypt the cipher using private key 
    rsa.Decrypt(pvkey, false); 
} 

キーを設定する機能はありません。私が見つけたのはImportParametersメソッドで、RSAParametersクラスのものがpqn、モジュラス、指数などで構成されていました。私はこれらにアクセスできません。

文字列としてキーをロードする方法はありますか?キーをRSACryptoServiceProviderにロードするにはどうすればよいですか?

+1

Base64でエンコードされた文字列の内容は何ですか? DER/PEM ASN.1キー、または他の何か? – yaakov

+0

それはCryptoからのDERです。++ – Kyojin

答えて

1

文字列としてキーをロードする方法はありますか? RSACryptoServiceProviderにキーをロードするにはどうしたらいいですか?

あなたの他の暗号++の質問、How to load Base64 RSA keys in Crypto++から、あなたはDEREncodeBERDecodeを使用しているため、あなたがだけ公開鍵と秘密鍵を持っているように、それが見えます。つまり、主公開鍵情報と秘密鍵情報ではなく、RSAパラメータがあります。あなたのキーには、OID識別子とバージョン番号がありません。そんなことはうまくいく。

Code ProjectのCryptographic Interoperability: Keysから、Base64のデコード後にASN.1/DERを解析するC#クラスが必要です。 CodeProjectの記事は、AsnKeyParserと呼ばれるC#クラスを提供し、ASN.1/DERを読み取り、RSAParametersを返してCSPにロードします。

AsnKeyParserクラスのコードは約800行で、それを実現するための5つのサポートファイルがありますので、ここに配置するのは適切ではありません。自分でダウンロードしてください。対象となるファイルはCSInteropKeys.zipとなります。

AsnKeyParserクラスを配線したら、RSA公開キーの場合は次のように簡単になります。秘密鍵は似ており、コードはCodeProjectサイトで提供されます。

他のサイトのファイルへのリンクは嫌になりますが、そうでない場合は情報を提供する方法がわかりません。答えに入れるにはあまりにも多くのソースコードが必要です。


は完全を期すため、.NETはないメイク相互運用簡単に行います。彼らはASN.1/DERまたはPEMを受け入れません。むしろ.NetはキーのXML表現を受け入れます。私はあなたがRFC 3275, XML-Signature Syntax and Processingでそれを見つけることができると信じています。 Microsoft does not state that for you。コードプロジェクトの記事を書いたとき、私はそれをまとめました。

おそらく、ASN.1/DERとPEMに加えてXMLを逆流させるために、Crypto ++にクラスを追加する必要があります。

+0

さて、私はBase64の文字列を読んで、それをバイトデータに変換しました(元のDEREncodedバイトに変換してBase64に戻しました)。 "rsa-private.der"というファイルに書き込んで、あなたの例のようにAsnKeyParserに渡しましたが、例外が発生します:CryptographicException:パラメータが無効です。 http://pastebin.com/hLwErEfpどうしたのですか? – Kyojin

+0

@Kyojin - PasteBinに関するあなたのメモから、例外は 'var data = rsp.Decrypt(cipherArr、false)'で例外が発生したように見えます。あれは正しいですか?もしそうなら、私はそれが秘密鍵が期待どおりに読み込まれたことを意味します。私は問題を推測している "csp.KeyNumber = AT_KEYEXCHANGE"またはあなたのRSAパディングです。 「Decrypt Method(Byte []、RSAEncryptionPadding)」](https://msdn.microsoft.com/en-us/library/mt132683(v=vs.110).aspx)を試してみてください。パディング以上のものなら、おそらく新しい質問をするべきです。スタックオーバーフローは、質問と回答の範囲を狭くするのが好きです。 – jww

+0

はい、私はrsa.ToXmlString()を行い、すべてが正しいことを確認し、ファイルのbase64文字列と同じです。それでなぜ暗号を解読しなかったのですか?今はそれが焦点だと思います。 – Kyojin

関連する問題