2011-01-14 7 views
2

PIV準拠のスマートカードでアクティブカード認証を実行しようとしています。詳細については、this documentの付録A.2を参照してください。.NETでPKCS#1 v1.5でデータをエンコードする方法

私は関連するX.509証明書から公開鍵を持っています。カードに秘密鍵で署名するランダムなデータを送る必要があります。公開鍵で署名を検証する必要があります。

私が提出した文書の例は、署名するために送信するデータが「PKCS#1 v1.5署名パディングスキームに従ってコード化されている」ことに注意しています。どのようにランダムなデータをエンコードするのですか?データの埋め込みはRSA署名プロセスの一部であると私は考えました。

// Generate random data 
byte[] randomData = new byte[128]; 
Random random = new Random(); 
random.NextBytes(randomData); 

// Hash the random data 
SHA1Managed sha1 = new SHA1Managed(); 
byte[] hash = sha1.ComputeHash(randomData); 

// Send the hash to the Smart Card and get back signed data 
byte[] signature = SendToSmartCardForSignature(hash); 

// Verify the data and the signature match using the public key 
RSACryptoServiceProvider rsa = smartCardCertificate.PublicKey; 
bool verified = rsa.VerifyData(randomData, CryptoConfig.MapNameToOID("SHA1"), signature); 

// verified is false...why? 

答えて

2

.NETの暗号化機能を使用してこれを行う「正しい」方法は、独自の実装であるSystem.Security.Cryptography.RSAを実装することです。 DecryptValueメソッドは、スマートカードの「生の」RSA秘密鍵暗号化メソッドを呼び出す必要があります。また、KeySizeプロパティを無効にすることを忘れないでください。

次に、RSAPKCS1SignatureFormatterを使用してデータを埋め込み、スマートカードを呼び出すことができます。

+0

恐ろしい。私はそれが働いているが、それは混乱のビットです。私はそれを掃除するためにこれを実装しようとします。ありがとう。 – Ben

1

セクション9.2からthis documentのEMSA-PKCS1-v1_5のエンコーディング方法を説明します。

.NETライブラリで公開されているものが見つかりませんでしたので、手動でやりました。

元のコード例のようにデータをハッシュします。

  1. エンコードタイプDigestInfoのASN.1値にデータをハッシュ化された - 土地を選定文書が実際にあなたがそれを把握する必要はありませんので、このために必要なバイト配列を提供します。私はSHA1を使用したので、インデックス0のハッシュデータバイト配列に次のバイト配列を挿入するだけでした:(0x)30 21 30 09 06 05 2b 0e 03 02 05 05 04 04

  2. PKCS# 1 v1.5のエンコードされたバイト配列は{0x00、0x01、PS、0x00、T}です.Tは最初のステップのDigestInfoバイト配列で、PSは0xFFのバイト配列です。配列PSの長さはあなた次第です。私の場合、この配列はRSA-2048秘密鍵で署名されるため、配列は長さ0x100にする必要があったので、私はPSをその目標に達するのに十分長くしました。

符号化されたバイト配列をスマートカードに送信して署名します。スマートカードは秘密鍵で実際のRSA操作を実行し、結果を返します。 .NET VerifyData関数はtrueを返します。

+0

申し訳ありませんが、あなたは私を助けることができますか?あなたは2048ビットのrsaキーを持っていると言ったので、配列の長さは0x100にする必要がありました。私が1024ビットの鍵を持っていれば、どんなサイズにする必要がありますか? – GregaMohorko

+1

私は分かりませんが、おそらく半分ですか? 0x100は256ですので、128または0x80を試してください。 – Ben

関連する問題