SSLについて読みました(バージョン3.0
)およびPreMasterSecret
(pms)がPKCS#1-1.5でエンコードされてから、クライアントが特定のRSA公開鍵で暗号化し、サーバーに送信します。
したがって、pmsは次のようになります。
[2 byte SSL version number || 46 random bytes]
したがって、PKCSでエンコードされたpmsは次のようになります。
0x00 0x02 [random bytes, not containing 0x00] 0x00 [pms]
エンコードされたpmsの長さは、バイト単位のRSA係数と等しくなければなりません。
私も this 質問を見つけましたが、これはRSA暗号化を使用しないPKCSエンコーディングに関するものです。
SSLのRSAでPKCSが使用される理由を見つけたと思います。
まず、(Textbook-)RSA暗号化は確定的であるということを知っておくことが重要です。つまり、メッセージは同じ公開鍵m
を使用して同じ暗号文に毎回暗号化されますe
c
理由:c = m^e mod N
。
m^e
が係数N
よりも小さい場合、e
のc
のルートを計算するだけでよいため、特に短いメッセージは攻撃者が簡単に計算できます(なぜなら係数演算はm^e
)に適用されませんでした。 m
自体はN
より小さい必要があるため、m < N
およびm^e > N
では、なぜPKCSエンコーディングが必要なのでしょうか。 pmsを暗号化する前に、よりランダムさをもたらすために?
上で述べたように:(Textbook-)RSAは決定論的暗号化であり、ランダム化されていないため、攻撃者は、多数の異なるpms値を試行して、被害者から送信されたものと同じ暗号テキストが得られるまで続けることができます。
そのため、pmsがすでにランダムな値である場合でも、PKCSエンコーディングはランダム性を追加するため、攻撃者が複数の異なる値をテストすることによってpmsを推測することが困難になります。
エンコードされたpmsの長さがRSAモジュラスの長さ(バイト単位)に等しくなければならないのはなぜですか?
プレーンテキストが長いほど、ブルートフォース攻撃が成功するためにテストする必要がある値が多くなります。ただし、上記のように、メッセージの長さm
は係数N
よりも小さい必要がありますが、m^e
はN
よりも大きい必要があります。
そのため、PKCSエンコーディングは、pmsの長さを最大(モジュラスN
と同じバイト長)まで増やしますが、PKCSエンコーディングは0x00
で始まるため、N
よりも小さくなります。ただし、その最大長のため、m^e
がN
よりも大きいことが確認されています。
また、PKCSエンコーディングがブライチェンバッハ攻撃が可能であった理由のようです。それでは、PKCSを使用することにはどのような利点がありますか?
Bleichenbacher攻撃が可能だったのは、サーバーのエラーメッセージが、攻撃者がpmsの可能な値を1つの値だけになるまで絞り込むのに役立つためです。
これらのエラーメッセージを非アクティブ化すると、問題が解決しました。
PKCS#1-2.0では、ブライチェンバッハー攻撃が修正されました。