1

http://www-archive.mozilla.org/projects/security/pki/nss/tech-notes/tn7.htmlから、次のように述べています

低レベルの署名には、PK11_Sign() を使用します。これらの関数は両方とも、データの PKCS #1 ラッピングを行います。PK11_Sign は、ハッシュの BER エンコードを行いません (SGN_ 関数で行われるように)。

コード API から

/*
 * sign a hash. The algorithm is determined by the key.
 */
SECStatus
PK11_Sign(SECKEYPrivateKey *key, SECItem *sig, const SECItem *hash)

Q1) 私の PK11_Sign 関数は無効な署名をもたらします。hash->data の入力は、「Hello SHA-256」からの SHA-256 の a7cd893b31b0ea44ed1aa7cafcda658744cc5a02ef26feccceaae9a8becb83a0 ハッシュです。data->len は 64 です。次に、コードは 16 進数から 2 進数への変換を実行します。次に、これらの情報を PK11_Sign に渡します。手順を見逃しましたか?

Q2) ハッシュの BER 符号化とはどういう意味ですか? ハッシュの文字列が 16 進数である場合、それをバイナリのハッシュに変換します。これが BER ですか? または、文は、DER のみをサポートすることを意味しますか?

Q3) 上記の操作に似た PK11_Sign のサンプルはありますか?

4

2 に答える 2

1

Q1: はい、SHA-256 の OID の ASN.1 / DER エンコーディングとハッシュ値自体のタグと長さをハッシュ値の先頭に追加する必要があります。

Q2: BER は ASN.1 の基本的なエンコード規則です。これは、ASN.1 定義に従って構造化されたデータのバイナリ タグ長値 (TLV) エンコードです。DER は、BERの正規のサブセットです。ここでは必ず DER を使用する必要があります。

Q3: いいえ。しかし、ASN.1 を作成すること、または ASN.1 について学習することはかなり時間がかかるため、作業をスピードアップできると思います。OID (ハッシュ アルゴリズムの識別子) とハッシュの長さが静的であるため、DER エンコーディングも静的です。したがって、選択したハッシュに次の 16 進数をプレフィックスとして付けることができます。


RSA PKCS#1 2.1 (および 2.2) セクション 9.2 注 1:

  1. 付録 B.1 で言及されている 6 つのハッシュ関数の場合、DigestInfo 値の T をエンコードする DER は次のようになります。
  MD2:     (0x)30 20 30 0c 06 08 2a 86 48 86 f7 0d 02 02 05 00 04
               10 || H.
  MD5:     (0x)30 20 30 0c 06 08 2a 86 48 86 f7 0d 02 05 05 00 04
               10 || H.
  SHA-1:   (0x)30 21 30 09 06 05 2b 0e 03 02 1a 05 00 04 14 || H.
  SHA-256: (0x)30 31 30 0d 06 09 60 86 48 01 65 03 04 02 01 05 00
               04 20 || H.
  SHA-384: (0x)30 41 30 0d 06 09 60 86 48 01 65 03 04 02 02 05 00
               04 30 || H.
  SHA-512: (0x)30 51 30 0d 06 09 60 86 48 01 65 03 04 02 03 05 00
                  04 40 || H.

すべてを正しく行うと、実行時にすべてをバイナリとして直接処理できることに注意してください。最初にハッシュの出力をバイナリにエンコードしてから、再度戻す必要はありません。

于 2015-07-04T07:54:38.783 に答える
0

NSS API に詳しくないので、Q1 にはお答えできませんが、Q2 は簡単に答えられると思います。

PKCS#1 ( RFC3447 )で定義された RSASSA-PKCS1-v1_5 署名方式に従って署名を作成する場合、最初にハッシュ値を計算し、それを DigestInfo 構造に入れる必要があります。

DigestInfo ::= SEQUENCE {
    digestAlgorithm AlgorithmIdentifier,
    digest OCTET STRING
}

次に、DigestInfo を BER でエンコードし、秘密鍵で暗号化する必要があります。したがって、生のハッシュ値だけを暗号化するのではなく、生のハッシュ値とハッシュ アルゴリズム OID を含む BER エンコードされた DigestInfo 構造を暗号化します。

于 2015-07-04T06:08:48.183 に答える