web-dev-qa-db-ja.com

rsa暗号化ハッシュ== rsa署名

$ echo -n "1327943823" > test_ok.txt
$ openssl dgst -sha1 -binary -out test_ok.sha1 test_ok.txt

$ echo "GURbsl4CFPCG83RCZxsEpoRleXicXQhH1OC4Fk77b7EMj2g8aHUhD/L+sm
oGSVpuEwup1fmkZBADXwBel8UKsmxgTLRX+vlGgyTr1XPqqHFNjtL33fd5
7NuKBqaJjwSp7D5xVMeVdQtQQbsKuKx5AvOPPyZfdtdyoJw/all1tl4=" > test_ok.sig.64
$ base64 -D -i test_ok.sig.64 -o test_ok.sig

$ openssl rsautl -verify -inkey test.pub -pkcs -pubin -in test_ok.sig -out 
test_ok.sha1.calc

$ hexdump test_ok.sha1
0000000 08 a8 55 9c d4 43 f9 cb ec 9f 04 f4 f2 dc aa 1f
0000010 7f e9 e1 11                                    
0000014

$ hexdump test_ok.sha1.calc
0000000 30 21 30 09 06 05 2b 0e 03 02 1a 05 00 04 14 08
0000010 a8 55 9c d4 43 f9 cb ec 9f 04 f4 f2 dc aa 1f 7f
0000020 e9 e1 11                                       
0000023

test_ok.sha1.calcは、test_ok.sha1のハッシュと一致するsha1ハッシュを含む、ASN.1でエンコードされたオブジェクトです。

それはすべて問題なく素晴らしいですが...

$ openssl dgst -sha1 -verify test.pub -signature test_ok.sig test_ok.txt

それも一致します。

私の質問は...暗号化されたハッシュと署名が一致する頻度はどれくらいですか?

4
terrafrost

[〜#〜] rsa [〜#〜] シグネチャは次のように機能します。

  • signするために、署名者は入力メッセージをハッシュし、ハッシュ値をASN.1構造に入れます(つまり、固定ヘッダーをハッシュ値に追加します)。 。結果のバイトシーケンスはpadded(パディングの詳細はRSA標準にあります)になるため、全長はRSAモジュラス(公開鍵の要素)の全長と一致します。次に、パディングされた構造はビッグエンディアンの規則でビッグ整数として解釈され、RSAのモジュラ指数がプライベート指数とともに適用されます。結果は署名です。

  • verifyに、検証者はRSAのモジュラ指数をpublic指数で適用し、最後の指数を元に戻します署名生成のステップ。これにより、適切にパディングされたASN.1構造が生成され、その構造内に含まれるハッシュ値が入力メッセージのハッシュ値と一致する場合、検証者は自身でコンテンツを宣言します。

RSAは署名アルゴリズムとリカバリーであることに注意する必要があります。署名を検証すると、検証者はブール結果(「有効」または「無効」)を取得するだけでなく、入力メッセージ自体のハッシュ。

5
Thomas Pornin

RSA署名は、文字通り、RSAキーで「暗号化」されたデータのハッシュです。実際には暗号化されていないため、「暗号化された」と言いますが、署名を生成する方法で処理されます。どちらにしても、常に一致するはずです。

3
Polynomial

これがアルゴリズムです、これについて見てください source

RSAキーペアの生成

入力:セキュリティパラメータl。出力:RSA公開鍵(n、e)および秘密鍵d。

   1. Randomly select two primes p and q of the same bitlength l/2.
   2. Compute n = pq and φ = ( p − 1)(q − 1).
   3. Select an arbitrary integer e with 1 < e < φ and gcd(e, φ) = 1.
   4. Compute the integer d satisfying 1 < d < φ and ed ≡ 1 (mod φ).
   5. Return(n, e, d).

基本的なRSA署名の生成

入力:RSA公開鍵(n、e)、RSA秘密鍵d、メッセージm。出力:署名。

   1. Compute h = H (m) where H is a hash function.
   2. Compute s = h^d mod n.
   3. Return(s).

基本的なRSA署名の検証

入力:RSA公開鍵(n、e)、メッセージm、署名s。出力:署名の受け入れまたは拒否。

   1. Compute h = H (m).
   2. Compute h` = s^e mod n.
   3. If h = h` then return(“Accept the signature”);
       Else return(“Reject the signature”).

基本的なRSA暗号化

入力:RSA公開鍵(n、e)、平文m∈[0、n − 1]。出力:暗号文c。

   1. Compute c = m^e mod n.
   2. Return(c)

最初に署名するとハッシュが生成され、秘密鍵を使用してそれに署名するとどうなりますか。これが公開鍵を必要としていることを確認します。したがって、これは暗号化ではありません(公開鍵が必要です)。ハッシュを暗号化すると、次のようになります。それで、これはh ^ d mod n = h ^ e mod nが起こるのでしょうか?これはすべてが有限のフィールドで発生するために発生する可能性がありますが、それを保証することはできません。私がこれを理論的に話していると考えてください。

1
user827918