web-dev-qa-db-ja.com

SHA、RSAおよびそれらの関係

SHAはハッシュメカニズムです。ただし、RSAは暗号化アルゴリズムです。

それで、RSAアルゴリズムはSHAハッシュメカニズムを使用してハッシュキーを生成し、それがメッセージの暗号化に使用されますか?

さらに、RSA自体が2つの鍵を提供します。 1つはパブリックに、もう1つはプライベートにできます。現在、これらのキーを使用して、暗号化と復号化を行うことができます。参照: [〜#〜] rsa [〜#〜] 。次に、RSAでのSHAの使用は何ですか?

HTTPSセキュリティを提供するサイトによって提供される証明書には、SHAとMD5キーが存在します。これらはどのように生成され、ブラウザーに転送されるデータの暗号化または復号化に使用されますか?

36
whitehat

[〜#〜] rsa [〜#〜] は、実際には2つのアルゴリズムであり、1つは非対称暗号化用で、もう1つはデジタル署名用です(署名アルゴリズムは伝統的に-が誤っています-"encryption with秘密鍵」、そしてこれは混乱の無限の原因です)。

非対称暗号化は鍵を使用します。キーはアルゴリズムのパラメーターです。アルゴリズム自体は誰にとっても同じですが(ソフトウェア用語では実行可能ファイルです)、ユーザー間でキーは異なります。keyペアでは、public keyは、encryptデータ(データの一部を変換する)に使用されるキーです、つまり、バイトシーケンスを、誰にとっても計り知れない別のバイトシーケンスに変換する)private keyは、decryptデータ(つまり、暗号化を逆にします)。

対称暗号化では、暗号化キーと復号化キーは同じですが、but非対称暗号化では、暗号化キーと復号化キー互いに区別されている(したがって名前です)。それらは数学的に相互にリンクされていますが、暗号化キーから復号化キーを復元することは不可能です(つまり、単なるコンピューターの束で行うのは困難です)。これが、復号化キーを秘密にしたまま暗号化キーを公開できる理由です。公開キーを公開しても、秘密キーは公開されません。

非対称暗号化が達成することは、些細なことではありません。秘密鍵についてあまり言わずに公開鍵を明らかにする可能性はありますが、両方の鍵が連携して機能します(公開鍵で暗号化されたものは、対応する秘密鍵で復号化できますが、それ以外は不可)。数学! RSAは数学でいっぱいです。このコントラストは、ビットを混合することによってデータの大規模な混乱を作成する「正しい」方法である対称暗号化アルゴリズムを使用しています。

非対称暗号化は、大規模な集団の任意の2人のユーザー間の機密送信を許可する場合に使用する自然なツールです。 1000人のユーザーがいて、2人のユーザーのいずれかが他のユーザー(他の998人のユーザーを含む)をスパイすることを許可せずに互いにデータを交換できるようにしたい場合、従来の解決策は対称暗号化のキーを配布することですすべてのpairユーザーに。アリスとボブは既知の共通鍵を持っています。アリスとチャーリーにも共有キーがあります(同じではありません)。ボブとチャーリーもそうでした。等々。各ユーザーは、他の999人の他のすべてのユーザーとの「共有キー」を覚えておく必要があり、合計で499500個のキーがあります。 1001番目のユーザーを追加するには、1000の対称鍵を作成し、1000の既存ユーザーのそれぞれに1つずつ割り当てます。鍵の配布全体がすぐに使用不可能/実行不可能な悪夢に変わります。非対称暗号化を使用すると、鍵の配布という点ではるかに簡単になります。すべてのユーザーは自分の秘密鍵を覚えるだけで済みます。公開鍵(公開されている)は、なんらかのブロードキャスト(ディレクトリなど)を通じて配布できます。

RSAには運用上の制約があります。最もよく使用されるバリアント( PKCS#1 v1.5 として知られているもの)で、RSA鍵のサイズが「1024ビット」の場合(鍵ペアの中心的な数学コンポーネントが1024ビット整数)の場合、RSAは長さが最大117バイトのメッセージを暗号化し、長さが128バイトの暗号化されたメッセージを生成できます。この制限されたサイズ、および暗号化時にサイズが増加することは、RSA暗号化プロセスの数学的構造の避けられない結果です。これらの制約により、通常、RSAを使用してデータdirectlyを暗号化しません。代わりに、ランダムなバイトの小さなシーケンスを選択します。これをsession keyと呼びます。 RSAを使用してセッションキーを暗号化します。次に、セッションキーをsymmetric暗号化アルゴリズムと共に使用して、メッセージ全体を処理します。これは ハイブリッド暗号化 と呼ばれます。


[〜#〜] sha [〜#〜]暗号化ハッシュ関数 のファミリの一般名です。その家族の最初のメンバーは「SHA」という名前で説明されていましたが、深刻な弱点が見つかったため、すぐに廃止されました。修正バージョンはSHA-1という名前で公開されました(弱いバージョンは口語的にSHA-0として知られています)。 4つのSHAのような新しい関数が後でファミリに追加されました(SHA-224SHA-256SHA-384SHA-512:これらは総称して 'SHA-2'と呼ばれます)。

ハッシュ関数にはキーがありません。ハッシュ関数は、純粋なコードである実行可能なアルゴリズムです。oneSHA-1があり、誰もが同じものを使用しています。

ハッシュ関数は、「ただ」、入力データの大きな混乱を引き起こしますが、これは解明されることを意図していません。実際には、それは解明に弾力性があることを意味します。ハッシュ関数について知っておくべきことは誰もが知っていますが(キーはなく、コードだけであり、秘密は何もありません)、一致する入力メッセージを再計算するのは「難しい」ことがわかります。ハッシュ関数の出力。ハッシュ関数に渡されたときに同じ出力を生成する2つの異なる入力メッセージを見つけることは不可能です。must存在するメッセージのペア-collisionsと呼ばれる-ハッシュ関数の出力は小さいサイズに固定されているため、受け入れられる入力は大きくなる可能性があるため、したがって、可能な出力よりも可能な入力が多くなります。すべてのハッシュ関数に衝突が存在することは数学的確実性ですが、実際にそれを見つけることは別の問題です。

ハッシュ関数自体は、すぐに高い値を生成することはありませんが、他のアルゴリズムにとっては非常に重要なビルディングブロックです。たとえば、それらは デジタル署名 で使用されます。デジタル署名は、指定された署名者のデータに対する意識的なアクションを「証明」します。非対称暗号化のように、これには鍵のペアと数学、および署名されたデータに対する関連する制約が含まれます。ハッシュ関数hは、h(m)への署名がm自体への署名と同じくらい良いものです。同じ値にハッシュする2つの異なるメッセージを見つけることができない場合、ハッシュ出力の承認で十分です。重要なのは、ハッシュ関数のoutputは、メッセージ自体が大きい場合でも、署名アルゴリズムに隠された数学で使用できるほど十分に小さいことです(SHA-1はギガバイトのデータを処理できます) 、20バイトの出力が生成されます)。

RSA-the-encryption-algorithm(PKCS#1 v2.0からの「OAEPパディング」を使用)の一部の最近のバリアントは、内部的にハッシュ関数を使用していることに注意してください。ハッシュ関数は優れた「ランダマイザー」であり(ハッシュ関数の出力は認識可能な構造を示しません)、これにより、優れたセキュリティ機能を備えたより複雑な暗号アルゴリズムを構築するのに適しています。


SSL/TLS (HTTPSは単にHTTP-within-a-SSL/TLS-tunnelです)では、ハッシュ関数がいくつかの目的で使用されます。

  • 非対称暗号化および/またはデジタル署名の一部として;
  • [〜#〜] hmac [〜#〜] の一部として、交換されたデータが転送中に変更されていないことをクライアントとサーバーが確認できるようにします。
  • Key Derivation Function のビルディングブリックとして、指定されたセッションキーを、トンネルの双方向の対称暗号化と整合性チェックに使用されるいくつかの対称キーに「拡張」します。

KDFは、ハッシュ関数の「ランダム化」と非可逆性に依存しています。 SSL/TLSからTLS 1.1までの場合、KDFはtwoハッシュ関数、MD5およびSHA-1上に構築され、後でMD5またはMD5で弱点が見つかった場合でも堅牢にするSHA-1。bothに弱点が見つかったことが判明しましたが、SSL/TLSで使用されているように、KDFでのブレークは許可されませんでした。それにもかかわらず、TLS 1.2は、単一の構成可能なハッシュ関数(通常はSHA-256)を使用する別のKDFに切り替えましたが、その弱点は現在知られていません。

51
Thomas Pornin

SHAはRSAでは使用されません。

ただし、SSL、SSHなどの暗号化プロトコルは、SHAおよびRSAなどの異なるアルゴリズムを使用します。SSLは、RSA(暗号化)またはDH(RSA、DSAまたはECDSA署名付き)をキーに使用します。 PGPプロトコル/ファイル形式では、RSA、DSA、ElGamalが署名と暗号化に使用されます。

4
chris

お気づきのように、これらは2つの異なるものです。ハッシュ(SHA)はデータの整合性を保証するためのものであり、暗号化(RSA)はデータの機密性を確保するためのものです。これらは、データが改ざんされておらず、適切な当事者のみがデータを読み取ることができることを確認するために組み合わせて使用​​されます。

HTTPSはPKIの形式であり、整合性、機密性、認証を提供します。 SHAまたはMD5は、https接続の整合性を確保するために使用される2つの異なるハッシュアルゴリズムです。

0
breakingigloo

もちろん、SHAを使用してPRNG(疑似乱数ジェネレータ)を作成し、RSAキーを生成することもできます。しかし、他の暗号プリミティブを使用することも可能です。 (例:AES)また、このPRNGには特別な仕様があります(NIS SP 800-90、ANSI X9.31)。 "純粋な" RSAドンキーがどのように生成されるかは問題ではありませんが、実際のアプリケーションにRSAを適用するには、生成されたキーが真の(または生成されたように見える)ランダムプロセスによって生成される必要があります。それ以外の場合、攻撃者にとっては簡単です。キーが何であるかを推測します(キーがランダムでない場合、攻撃者も計算できます)。

0
user536

RSAは非対称暗号化アルゴリズムです。これらは、自分自身で再度暗号化解除することなく、特定の関係者に情報を送信するために使用されます。しかし、それでも他の人が解読することができます。これらのアルゴリズムは非常に遅いため、少量のデータでのみ使用する必要があります。

SHAは暗号化ハッシュアルゴリズムのスイートです。これは、大きなデータブロックの小さな表現です。暗号化の目的で、特定のハッシュに一致するようなデータのセットを見つけることが不可能であるという要件を満たすためにこれを実現します。つまり、ハッシュからそのハッシュを生成するデータ(同じデータかどうかに関係なく)に移動することはできません。

最後に、AESのようなアルゴリズムがあります。これらは対称暗号で使用され、両側で同じキーを持ち、同じキーで暗号化と復号化を行うことができます。

基本的に、これらのさまざまなものをさまざまな方法でまとめます。つまり、RSAを使用して、対称(AES)鍵のセット(1つのセッションのみ)を送信して同意します。対称鍵を取得できなかったため、すべてのデータに対して低速非対称暗号化を行っているのではなく、比較的小さな対称暗号化鍵を使用しているためです。

ハッシュは通常、このようなシステムで次のように使用されます。データが他人からのものであることを確認したいので、彼は自分の秘密鍵でプレーンテキストを復号化します。この暗号テキストを暗号化すると、データを戻す必要があります(基本的に、暗号化は復号化の逆であると考えており、これは突然意味を成します!)ただし、前述したように、非対称暗号化は低速です。だから、データをハッシュして、この方法でハッシュに署名しないと、誰かが一致しているように見えるデータを作成できなくても、データの整合性を検証できます。

0
ewanm89