2

SHA-1 でハッシュし、ハッシュを RSA 秘密鍵で暗号化することによって署名されたファイルを検証しようとしています。

明らかに、RSA 公開鍵を使用して検証しています。キーは DER 形式です。

署名の検証は、Java の署名クラスを使用して正しく機能します。

私が試しているopensslコマンド(および結果)は次のとおりです。

       ~/Downloads/openssl-1.0.0-beta3/apps/openssl pkeyutl -in encryptedZip.bin 
-keyform DER -verify -sigfile savedDigitalSignature.txt -pubin -inkey public.der
    WARNING: can't open config file: /usr/local/ssl/openssl.cnf
    Signature Verification Failure

適用される openssl 構成ファイルには何も表示されないため、警告は重要ではないと思います。

savedDigitalSignature.txt ファイルには、署名バイトが含まれています。

私の理論では、openssl は特定のファイル形式であるデジタル署名を探しているということですが、それがどうあるべきかを示すドキュメントには何も見つかりませんでした。

考え?

4

3 に答える 3

2

このコマンドは非常に低レベルです。それが機能するためには、すべてが正しい形式であることを確認する必要があります。

  1. 入力署名 (-sigfile) は、バイナリ署名である必要があります。RSA の場合、パディングは PKCS#1 でなければなりません。
  2. 入力データはバイナリ ダイジェストでなければなりません。SHA1 で署名する場合、このファイルには 20 バイトしか含めることができません。
  3. 公開鍵は、DER または PEM 形式の X.509 でエンコードされた SubjectPublicKeyInfo である必要があります。
于 2009-10-08T11:58:20.013 に答える
0

Javaは、RSA署名がPKCS#1に従うことを期待しています。ダイジェストアルゴリズムとダイジェストのシーケンスであり、署名されます(RSA秘密鍵で暗号化されます)。

pkeyutlASN.1構造ではなく、ダイジェストのみを期待している可能性がありますが、相互運用性を無視することは驚くべきことです。いずれの場合も、データが「署名」されると、「署名」出力は同様に表示されます…オクテットのランダムな文字列だけです。

によって生成されたサンプル署名pkeyutlと、それを検証する公開鍵、および検証対象のファイルを投稿してください。

于 2009-10-08T05:15:09.833 に答える
0

私はまだ OpenSSL-1.0.0-beta3 を使用していないので、 についてはよくわかりませんpkeyutlが、このdgstコマンドはデジタル署名の生成と検証も行い、署名がプレーンで完全に飾り気のないバイナリであることを期待しています。

たとえば、RSA 署名の場合、単一の BigNum を表すバイナリ blob が必要です。pkeyutl のマニュアルページを見ると、同じように動作するようです。簡単なテストは、pkeyutl を使用して何かに署名し、出力を検査することです (ビット単位のサイズが RSA キーの長さと同じ場合、それは単純な BigNum です。それよりも大きい場合は、dumpasn1 を使用して、DER 形式かどうかを確認してください)。 )。

于 2009-10-08T04:52:10.403 に答える