認証の目的でRSAアルゴリズムを使用する1980年代後半のシステムに関する記事を書いています。ただし、秘密鍵を使用してメッセージのハッシュを暗号化する通常の方法ではなく、この場合、メッセージ全体が次の方法で暗号化されます。
Modulus: n = 0x35... # length 51 bytes / 406 bits
Public exponent: e = 3 # to maximize performance
Private exponent: d = ... # such that d⋅e ≡ 1 (mod φ(n))
メッセージ(通常は長さ250バイト)は、それぞれ50バイトの複数のブロックに分割されます。次に、最初にプレフィックスを追加することにより、各ブロックを個別に暗号化します(:
は連結を表します)。
plaintext = 0x15 : block
ciphertext = (plaintext ^ d) mod n
暗号文が読み取られると、各ブロックは復号化することによって回復されます。
plaintext = (ciphertext ^ 3) mod n
assert plaintext[0] == 0x15
block = plaintext[1..]
認証に関して、プレーンテキストの最初のバイトが0x15
であることを確認することは特に有用ではありません。ランダムな暗号文を復号化すると、約2%の時間、そのチェックに合格します。
代わりに、このシステムは、メッセージが正しい秘密鍵を使用して暗号化されていない場合、復号化後にメッセージ自体が無効になるという事実に依存しています。
認証に公開鍵暗号を使用する(従来とは異なる)名前はありますか?それはデジタル署名の一種と考えることができますか?
このシステムを説明するとき、上記のように、プライベート指数の使用を「暗号化」、パブリック指数の使用を「復号化」と呼ぶことは正しいですか?暗号文は「暗号化された」、「署名された」、またはこれらのどちらとも記述できませんか?
セキュリティの目的は機密性ではなく認証を保証することであるため、秘密鍵の使用は合理的に「暗号化」と呼ぶことはできません。それを元に戻すためのすべての情報は公開されているため、暗号化を実行することはできません。あなたが説明するのは署名スキーム、具体的にはリカバリー付き署名スキーム同一のエンコードされたメッセージには、真正性を検証するために必要な情報と必要な情報の両方が含まれているためですメッセージを再構築します。最新の署名スキームとの主な違い( PKCS#1 v1.5 、 [〜#〜] pss [〜#〜] )は、このスキームがいくつかの方法で壊れていることです。
最新のRSA署名スキームは、デコードの一部に固定された「パディング文字列」を含めることにより、偽造された署名の形成を防ぎます。どちらのPKCS#1メソッドでも、少なくとも8バイトのパディングが必要です。あなたが説明するスキームは、このようなものはなく(先頭のバイトを除いて、ご注意の通り、影響はごくわずかです)、プレーンテキストの妥当性に依存する必要があります。
先頭の0x15
は、先頭のnullバイトが大量にある有効なメッセージを偽造する機能を少なくとも防ぎます。ラップしない場合、公開指数演算は簡単に元に戻せます:if[〜#〜] m [〜#〜]がenの根、次にe[〜#〜] m [〜#〜]のルート(整数として)は有効な署名になります。高いビットセットを強制すると、そのようなすべての[〜#〜] m [〜#〜]が無効になります。先頭の0x15
も、有効な署名付きメッセージを乗算することによって有効な署名を生成することを困難にします(ただし、結果で先頭の0x15
がランダムに取得される可能性が〜2%に達しない場合のみ)。
メッセージを分割すると、署名付きメッセージのブロックを並べ替える簡単な攻撃が可能になります。最新の署名スキームでは、ハッシュを使用して非対称操作がサポートする長さにメッセージを圧縮し、特定の署名が署名付きハッシュを持つ1つのメッセージに対してのみ有効であることを保証します。