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 はランダムなバイト シーケンスであり、同じ平文を同じキーで何度も暗号化できるようにしますが、毎回異なる暗号文を生成します。