2

DSA キーと openssl を使用してファイルに署名したいと考えています。DGST(1) のマニュアル ページには、次のように記載されています。

ファイル...

ダイジェストするファイル。ファイルが指定されていない場合は、標準入力が使用されます。

私にとって、これは、次の 2 つの端末コマンドが同じ結果をもたらすはずであることを意味しますが、そうではありません。od結果はバイナリなので、出力をパイプで渡しました。

  1. コマンドラインでファイルを指定する

    openssl dgst -dss1 -sign private_key.pem test_archive.zip | od -x
    0000000      2c30    1402    e30d    9073    0059    0de7    f03e    8fd2
    0000020      874b    5252    b025    8f44    1402    ed26    2f55    7fa4
    0000040      f474    0426    1d44    787c    ecd6    5059    921b        
    0000056
    
  2. ファイルを openssl コマンドにパイプする

    openssl dgst -dss1 -sign private_key.pem < test_archive.zip | od -x
    0000000      2c30    1402    2444    c3a5    f498    7bb8    3dfe    715d
    0000020      e179    c5ad    c0a5    2b16    1402    173b    692b    9d71
    0000040      3970    c497    9994    9cbc    4cfd    d642    62df        
    0000056
    

ご覧のとおり、両方の出力は同じではありませんが、署名する必要があるファイルはどちらの場合も同じです。

これはなぜですか?ここで明らかな何かが欠けていますか?

編集

FreeBSD で OpenSSL バージョン 0.9.8y 2013 年 2 月 5 日、Mac OS X 10.7.5 で 2011 年 2 月 8 日バージョン 0.9.8r を使用し、両方への影響を観察しています。

編集 2 - テスト用のキーを生成する方法

適切なキーを生成するための小さなシェル スクリプト

#!/bin/bash

openssl=/usr/bin/openssl
${openssl} dsaparam 1024 < /dev/urandom > dsaparam.pem
${openssl} gendsa dsaparam.pem -out private_key.pem
${openssl} dsa -in private_key.pem -pubout -out public_key.pem
rm dsaparam.pem

OpenSSL バージョン 1.0.0-fips を使用して CentOS 6 Linux システムでテストを実行したところ、同じ奇妙な動作が見られました。

編集 3 - テスト済みのより多くのバージョン

また、2013 年 2 月 11 日に新しくコンパイルされた OpenSSL バージョン 1.0.1e もこの動作を示します。

4

2 に答える 2

2

これを再現できません (OpenSSL 1.0.1 2012 年 3 月 14 日)。(私はRSAキーを使用していました)3つの可能性があると思います:

  1. OpenSSL のバグ [または別のデフォルト オプション] バグのある別のバージョンを使用している可能性があります。例: http://rt.openssl.org/Ticket/Display.html?id=2965
    (必ずしもこの特定のバグだとは思いませんが、似たようなものです。)

  2. キーが変わりました。

  3. zipファイルが変更されました


コマンドに -binary を追加してみてください。#1 を見ると、私のバージョンがデフォルトで --binary を実行していて、ダイジェスト タイプが除外されている可能性があります。

openssl dgst -sha1  </dev/null
(stdin)= da39a3ee5e6b4b0d3255bfef95601890afd80709

openssl dgst -sha1  /dev/null
SHA1(/dev/null)= da39a3ee5e6b4b0d3255bfef95601890afd80709

dsa キーを使用すると、openssl の複数のバージョン (1.0.1 および 0.9.8y) でこれを再現できます。

-hex オプションを使用して、プレフィックスが変更されていることも確認できました。

(1.0.1)

openssl dgst -hex -dss1 -sign private_key.pem config
DSA-DSA(config)= 302e021500ca417b14be6e1c08426d4f4cdb3beb51181e6055021500e6a768689cfe9c6f7538e9ec2f952c9465fea80b

openssl dgst -hex -dss1 -sign private_key.pem <config
(stdin)= 302c02142a59682765ae10e37fe114ca63a21cdf4127ff5302141c8b3ac5caf538a23dc43b20cc9c01b1278c0d8e

(0.9.8年)

apps/openssl dgst -hex -dss1 -sign private_key.pem config
DSA(config)= 302e0215008aef560f547425fb4360e24be343fa6db2dc4551021500eb594cea70455400838dc0a14dae7b86614c5218

apps/openssl dgst -hex -dss1 -sign private_key.pem <config    302c02146aa92d6cf2cc9a6fb1d340fed21c29d05f936fc002141fd9e781def4897cfc306b7a68a92b90e6861cb9

注: 4 つのコマンドはすべて、バイナリ出力が異なります。16 進ハッシュは同じですが、接頭辞が異なることを考えると、接頭辞の違いが出力の変化を引き起こしていると推測するのは合理的です。

于 2013-05-20T17:24:17.623 に答える
0

OpenSSL の動作はバグではありません。ファイルが stdin 経由でパイプされている場合、またはコマンド ラインで指定されている場合、作成される署名は異なりますが、次のコマンドでテストした場合、両方の出力が有効な署名です。

openssl dgst -dss1 -verify public_key.pem -signature file_with_archive_signature.sig test_archive.zip

したがって、アルゴリズムを見ないと、各ファイルに複数の有効な署名があると思いますが、署名は1つのファイルに対してのみ有効です(衝突を無視します)。

于 2013-05-21T17:01:58.047 に答える