2

PIV 準拠のスマートカードでアクティブ カード認証を実行しようとしています。詳細については、このドキュメントの付録 A.2 を参照してください。

関連する 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?
4

2 に答える 2

2

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

その後、 RSAPKCS1SignatureFormatterを使用してデータをパディングし、スマートカードを呼び出すことができます。

于 2011-01-14T18:49:08.613 に答える
2

セクション 9.2 -このドキュメントの EMSA-PKCS1-v1_5では、エンコード方法について説明しています。

これを行うために .NET ライブラリによって公開されているものを見つけることができなかったので、非常に簡単なので手動で行いました。

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

  1. ハッシュ化されたデータを DigestInfo 型の ASN.1 値にエンコードします。引用されたドキュメントは実際にこれに必要なバイト配列を提供するため、理解する必要はありません。私は SHA1 を使用したので、次のバイト配列をインデックス 0 のハッシュ データ バイト配列に挿入する必要がありました: (0x)30 21 30 09 06 05 2b 0e 03 02 1a 05 00 04 14

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

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

于 2011-01-14T17:32:43.820 に答える