rsa を使用して、公開鍵 e (対応する秘密鍵 d) を使用して小さなメッセージを暗号化しました。しかし、別の秘密鍵 d' で復号化すると、bad padding exception
.
間違ったキーを使用したことをどのように知ることができますか?
3 に答える
パディング スキームを使用すると、解読者は、間違ったキーを使用しているか、破損したデータを扱っているかを判断できます。
パディング スキームには、平文の最終バイトの明確に定義されたセットがあります。間違ったキーで復号化している場合、結果の「平文」は基本的にランダムなガベージであるため、有効なパディング シーケンスで終了する可能性はほとんどありません。
ほとんどの RSA ライブラリは、公開鍵の暗号化にデフォルトでPKCS#1 ブロック タイプ 2パディングを使用します。その場合、データはモジュラス サイズより少なくとも 11 バイト小さくなければならず、平文は次のようにパディングされます。
00 02 r 1 r 2 r 3 r 4 ... r M ... 00 [あなたの平文バイト]
ここで、M >= 8 および r iはランダムな正のバイトです。これらはすべてゼロではありません。
これは、法を法として e乗した実際の値です。したがって、復号化すると、復号化者は結果が次のようになることを確認できます。
- 上位バイトは0
- 上位バイトの次は 2
- 少なくとも次の 8 バイトは非ゼロ
- この後どこかでゼロバイトが発生
メカニズムは実際にはシンプルであると同時に巧妙です。
正確に 8 バイトのブロックを暗号化するブロック暗号を想像してください。各平文メッセージを 8 バイトのグループに分割し、各グループを単一のブロックとして暗号化します。最後のブロックに関しては、次の 2 つの可能性があります。
ブロックは 8 バイトより短く、正確に 8 バイトになるまでパディングする必要があります。この場合、いくつかのバイト数nをブロックに追加する必要があります。これらの各バイトには、同じバイナリ値nがあります。したがって、最後のブロックは次のいずれかのようになります。ここで、
d
は 1 バイトのデータです。dddddddd 1
dddddd 2 2 dddddd
3 3 3
. . .
日 7 7 7 7 7 7 7ブロックの長さは正確に 8 バイトです。この場合、ブロック全体がメッセージに追加されるため、最後の 2 つのブロックは次のようになります。
8 8 8 8 8 8 8 8
これで、メッセージが復号化されると、デクリプターは削除するパディングのバイト数を明確に判断できます。n
そして、最後のブロックがバイナリ値の文字で終わらない場合n
、メッセージが破損しているか、間違ったキーで復号化されていることがわかります。
このパディングを、メッセージの先頭を変更するために使用される初期化ベクトル (IV) と混同しないでください。パディングの目的は、メッセージに完全なブロックのみが含まれるようにし、復号化プログラムがキーを検証できるようにすることです。IV はランダムなバイト シーケンスであり、同じ平文を同じキーで何度も暗号化できるようにしますが、毎回異なる暗号文を生成します。