1

C++/CLI でNET フレームワーク コンポーネント ( RSACryptoServiceProvider )を使用して XMLDSIG の XML 要素の署名を返すメソッドを作成しようとしています。XMLDSIG 仕様 ( http://www.w3.org/TR/2002/REC-xmldsig-core-20020212/ ) からのこの抜粋を簡単な言葉で説明してください。プログラミングと数学のバックグラウンドがほとんどないため、これを理解できない - または、これが実装されている例として、実際のコードの抜粋を提供しますか?

RSA 署名の SignatureValue コンテンツは、RFC 2437 [PKCS1、セクション 8.1.1: RSASSA-PKCS1-v1_5 署名方式の署名生成] に従って計算されたオクテット文字列の base64 [MIME] エンコードです。EMSA-PKCS1-V1_5-ENCODE 関数 RFC 2437 [PKCS1、セクション 9.2.1] で指定されているように、署名関数への値の入力には、ハッシュ関数の前に保留されたアルゴリズム オブジェクト識別子が含まれている必要がありますが、ASN の可用性.1 パーサーと OID の認識は、署名検証者には必要ありません。PKCS#1 v1.5 表現は次のようになります。 CRYPT (PAD (ASN.1 (OID, DIGEST (data)))) パディングされた ASN.1 は次の形式になることに注意してください。FF* | 00 | プレフィックス | ハッシュ "|" 連結、「01」、「FF」、「00」対応する 16 進数値の固定オクテット、「ハッシュ」はデータの SHA1 ダイジェスト、「プレフィックス」は PKCS1 [RFC 2437] で必要な ASN.1 BER SHA1 アルゴリズム指定子プレフィックス、つまり 16 進数の 30 21 30 09 です。 06 05 2B 0E 03 02 1A 05 00 04 14 このプレフィックスは、標準の暗号化ライブラリを使いやすくするために含まれています。FF オクテットは、CRYPTed される量の値が RSA モジュラスよりも 1 オクテット短くなるように、最大​​回数繰り返さなければなりません。

つまり、特定の XML 要素のハッシュ値を持っている場合(base64 でエンコードされていませんよね?)、それをSignHash ( RSACryptoServiceProvider 内) 関数に送信する前にどうすればよいでしょうか? テキストに書いてあることは知っているが、理解に苦しむ。「CRYPT (PAD (ASN.1 (OID, DIGEST (data))))」は、部分的にはわかるものの、まったくわかりません... OID を取得してから ASN を取得する方法がわかりません。そして、それをどのように埋めるか...

4

1 に答える 1

0

コンポーネントについて説明してみましょう。

  • DIGEST(data) は、すでに計算したハッシュ値です
  • OID は、使用されるハッシュ アルゴリズムを表すグローバルに一意の識別子です。SHA1 の場合、これは 1.3.14.3.2.26 です。
  • ANS.1 は、ASN.1 シーケンスとしての OID とハッシュ値の ANS.1 エンコードを意味します。これは、リファレンスにリストされている 16 進数値の後に実際のハッシュが続くことを意味します。
  • PAD は、01 FF* 01 を ASN.1 でエンコードされたプレフィックスおよびハッシュと連結して、目的の長さを取得することを意味します (FF* は、FF を適切な回数繰り返すことを意味し、詳細は RFC に記載されています)。
  • CRYPT は RSA 暗号化機能です。

ただし、signHash関数がこれをすべて実行すると思います。OID とハッシュ値を指定するだけです。

于 2015-02-21T12:11:05.503 に答える