RSA の署名と検証

背景

同社は最近いくつかのテクノロジー共有を組織したため、一部の学生は共有プロセス中にいくつかの非対称暗号化アルゴリズムについて言及し、公開キーと秘密キーの機能の導入はやや不適切でした。たとえば、次のとおりです

秘密鍵暗号化、公開鍵復号化

また、インターネット上の関連コンテンツを検索したところ、国内の大手メーカーや一部の海外の技術記事も含めて、多くのネチズンが RSA 署名プロセスで秘密鍵暗号化 (暗号化) と公開鍵復号化を使用していることがわかりました。デジタル署名の詳細をいくつか説明しますが、暗号化と署名の 2 つの異なる概念について混乱が生じる可能性があります。以下では、RSA と、署名と暗号化の関係を紹介します。以下の内容の大部分は、参考コンテンツの翻訳です。これらの参考文献記事の最後にはコンテンツへのリンクも貼ってありますので、興味のある方はぜひご覧ください。

RSAアルゴリズム

このセクションでは最初に RSA アルゴリズムを紹介しますが、数学的な詳細に立ち入らないように、いくつかの計算方法を抽象化しています。

1977 年に、Rivest、Shamir、Adelman は、RSA アルゴリズムと呼ばれる、暗号化に使用できるアルゴリズムを発見しました。

R(x,k,n) = x^k (mod n)

パラメータ x、k、n はすべて整数であり、その値は非常に大きくなる可能性があります。このうち、n は以下の説明では重要ではないので、便宜上無視し、R(x, k) と略します。

RSA アルゴリズムに加えて、Rivest、Shamir、Adelman は、次のように計算できる 2 つのキー K と k を選択する方法も発見しました。

R(R(x,K),k) = x
R(R(x,k),K) = x

このアルゴリズムは、RSA アルゴリズムがキー K を使用して x を X に処理できること、また別のキー k を使用して X を x に復元できること、およびその逆もできることを意味します。以上が RSA の簡単な紹介ですが、k と K がどのように生成されるかについては、議論の焦点では​​ないため、当面は詳しく紹介しません。

RSA暗号化

上記の RSA アルゴリズムによれば、公開キー K を使用して暗号化スキームを確立し、秘密キー k を使用して復号化できます。

    Enc(m; K) = R(m,K)
    Dec(c; k) = R(c,k)

これは、プレーン テキスト メッセージ m を暗号化し、公開キーを使用して RSA アルゴリズムを使用して暗号化し、次に秘密キーを使用して復号化します。

上記は教科書で紹介されている RSA 暗号化アルゴリズムですが、このバージョンの RSA アルゴリズムを使用した暗号化は安全ではなく、多くの攻撃を受ける可能性があるため、実際にはこれが内容のすべてではありません。

  • ユーザー A が 2 つのメッセージ m1 と m2 を送信し、公開鍵 K_A を使用して暗号化するとします。
    c1 = Enc(m1; K) = R(m1,K) = m1^K (mod n)
    c2 = Enc(m2; K) = R(m2,K) = m2^K (mod n)
  • では、m1 と m2 が同じ平文メッセージである場合はどうなるでしょうか?
    c1 = m^K mod n = c2(两条密文是一致的)

したがって、従来の Dolev-Yao 攻撃モデルでは、ネットワーク上の平文 m1 および m2 の内容とその暗号文を観測することができ、ある暗号文が既知のコンテンツの暗号文と一致することが判明した場合、それは復号に相当します。安全な暗号化スキームはこのようなものであってはなりません。

暗号化スキームの詳細については、次の 2 冊の本を参照してください。

  • [D. ボーン、A. ジュー、P. グエン。教科書 ElGamal と RSA 暗号化が安全でない理由。プロセスで。アジアクリプト、2000年。]
  • [J. カッツとY.リンデル。最新の暗号化の概要、セクション 10.4。チャップマン&ホール/CRC、2008年。]。

この教科書版の RSA 暗号化をより安全にするために、RSA アルゴリズムを使用する前に平文情報を前処理し、それに対応して、RSA アルゴリズムを使用した後にいくつかの後処理を行います。

    Enc(m; K) = R(pre(m),K)
    Dec(c; k) = post(R(c,k))

通常、パディング スキームと呼ばれる前処理スキームと後処理スキームがいくつかあります (パディングが内部で行われるだけでなく、この命名も少し不適切です) RSA には、最適非最適パディングと呼ばれる一般的に使用されるパディング スキームがあります。最適な非対称暗号化パディング (OAEP) は、1994 年に Bellare と Rogaway によって発明されました。このスキームでは、OAEP の前処理は、排他的論理和 (XOR) を通じて予測不可能な一時データ (ノンス) の暗号化ハッシュを実行します。私たちが発見した上記の攻撃を防ぐためです。

OAEP の一般的な内容を詳しく見てみましょう。

OAEP 前処理関数:

    OAEP-pre(m):
    r = random nonce
    X = (m || 00...0) XOR H(r) // 对 m 填充 0
    Y = r XOR H(X)
    output X || Y

OAEP 後処理関数。前処理されたデータを復元するために使用されます。

    OAEP-post(m'):
    split m' into X || Y
    r = Y XOR H(X)
    (m || 00...0) = X XOR H(r)
    output m
  • || 記号はバイナリ連結を表し、H は暗号化ハッシュ関数を表し、XOR は排他的 OR 演算を表します。

これらをまとめると、RSA-OAEP 暗号化スキームが得られます。

    Enc(m; K) = R(OAEP-pre(m),K)
    Dec(c; k) = OAEP-post(R(c,k))

RSA-OAEP は、広く受け入れられている暗号化方式のセキュリティ定義に対して安全です。もちろん、上記の「教科書」RSA は、この定義では安全ではありません。

RSAデジタル署名

RSA 関数を使用して、署名の検証に公開鍵 K を使用し、署名に秘密鍵 K を使用するデジタル署名スキームの確立を試みることができます。

    Sign(m; k) = R(m,k)
    Ver(m; s; K) = R(s,K) == m

メッセージ m に署名するには、RSA 関数を使用して秘密鍵 k に基づいて署名 s を生成するだけです。検証は公開鍵と署名を用いてRSA関数で結果を生成し、その結果がメッセージ内容と同じかどうかを比較します。

この単純な解決策の主な問題は、RSA 関数は秘密キーよりも長いパラメータに対応できないことです。簡単に言うと、メッセージが特に長い場合、メッセージを RSA 関数に直接渡すことができません。暗号化スキームでは、この問題はブロック暗号化によって達成されますが、署名スキームでは、暗号化ハッシュ関数によってこの問題が達成されます。

    Sign(m; k) = R(H(m),k)
    Ver(m; s; K) = R(s,K) == H(m)

以上が教科書的な RSA 署名の説明ですが、おおよそこんな感じで、R 関数による処理の前後で暗号ハッシュ関数 H が等しいと考えて署名が検証できると考えてください。署名内で RSA 関数を呼び出すプロセスは、多くのフォーラムや記事で「暗号化」および「復号化」と呼ばれています。これら 2 つの単語に引用符を追加すると誰でも理解しやすくなりますが、引用符を削除すると混乱が生じる可能性があります。 , RSA を使用する場合、クライアントからサーバーへの送信は公開キーの暗号化と秘密キーの復号化であり、サーバーからクライアントへの送信は秘密キーの暗号化と公開キーの復号化であると考える人もいますが、この理解は間違っています。

署名検証方式には、実はPSS(確率的署名方式)と呼ばれるもう少し複雑な前後処理方式があり、安全なアルゴリズムと考えられますが、上記のような単純な方式では聞いたことがありません。効果的な攻撃方法については、興味があれば詳細をご覧ください。

RSA暗号化とRSAデジタル署名

上記の内容を繰り返しますが、「教科書」における RSA 署名スキームの内容は次のとおりです。

    Enc(m; K) = R(m,K)
    Dec(c; k) = R(c,k)
    Sign(m; k) = R(m,k)
    Ver(m; s; K) = R(s,K) == m

同じアルゴリズムで、これらは実際の実装です

    Enc(m; K) = R(OAEP-pre(m),K)
    Dec(c; k) = OAEP-post(R(c,k))
    Sign(m; k) = R(H(m),k)
    Ver(m; s; K) = R(s,K) == H(m)

上記を踏まえて、RAS 署名と RSA 復号化について考えてみましょう。署名アルゴリズムと復号アルゴリズムは同じですか? 実際のアプリケーションでは明らかに異なり、署名にはハッシュ関数 H が導入され、復号化には後処理関数 OAEP-post が導入されます。署名ではメッセージ内容 m に直接 H を適用し、RSA 関数を実行します。復号化プロセスでは、この RSA 関数が最初に実行され、次に OAEP-post 後処理関数が実行されます。同様に、RSA 署名検証は RSA 暗号化とは明らかに異なります。

ただし、RSA 署名と RSA の類似点を別の方法で比較すると、どちらも RSA 関数と秘密鍵 k がパラメータとして導入され、同じ RSA 署名検証と RSA 暗号化でも RSA 関数と公開鍵 K がパラメータとして導入されます。このようにして、教科書に記載されているアルゴリズムがわかります。

要約する

教科書の抽象的な世界では、RSA 署名と RSA 復号化はまったく同じことを行います。しかし、実際の実装プロセスでは、これらは同じではありません。したがって、RSA 署名を計算するために実際の RSA 復号化を決して使用しないでください。最良の場合、この実装はあなたが気付くことができる形で壊れます。最悪の場合、攻撃者が悪用できる脆弱性が発生します。

記事の冒頭で述べた記述の問題もありますが、多くの非対称暗号化アルゴリズムでは、秘密鍵を「暗号化」し、公開鍵を「復号化」することが不可能です。ただし、RSA アルゴリズムの特殊性により、数学的定義から、秘密キーを「暗号化」し、公開キーを「復号化」することが可能です。したがって、誤って RSA を一般化して、非対称暗号化アルゴリズムをデジタル署名アルゴリズムとして使用できると結論付けることはできません。この特性を持つ RSA 暗号化アルゴリズムに加えて、ElGamal 暗号化アルゴリズムにもこの特性がありますが、これは一般的な現象ではありません。暗号化の目的から言えば、暗号化はデータが他者に発見されないようにすることであり、RSA の公開鍵は誰でも利用できます。つまり、秘密鍵で暗号化されたコンテンツは誰でも復号化できます。これ自体が原則に違反します。暗号化の効果。したがって、秘密キーは署名のみに使用でき、公開キーは署名の検証に使用できます。

参考リンク:

https://www.cs.cornell.edu/courses/cs5430/2015sp/notes/rsa_sign_vs_dec.php
https://crypto.stackexchange.com/questions/66770/ Understanding
-public-key-and-private-key https: //crypto.stackexchange.com/questions/2123/rsa-encryption-with-private-key-and-decryption-with-a-public-key
https://blog.csdn.net/taolinke/article/details/6432228
https://copyfuture.com/blogs-details/20200401195558268g4s20sqvd2skzqp

おすすめ

転載: blog.csdn.net/ID314846818/article/details/128159413