web-dev-qa-db-ja.com

MD5、SHAとRSAの違いは何ですか?

MD5ツールは16進値を出力します。同様に、SHAとRSAは一緒に16進数(またはその他の)出力を生成しますか?

MD5、SHA、およびRSAアルゴリズムの違いは何ですか?

43
Kars

出力のタイプではありません。 16進数は、データのフォーマット方法にすぎません。それらはすべてバイナリデータを処理するため、16進数は非常に理にかなっています。

重要な部分は、彼らが何をするか、そしてどのようにそれを行うかです:

  • MD5とSHAはハッシュ関数です(SHAは実際にはハッシュ関数のファミリーです)-データの一部を取得し、それを圧縮して、別のオブジェクトでエミュレートするのが非常に難しい適切に一意の出力を作成しますデータの一部です。これらは何も暗号化しません。MD5またはSHA出力を取得して、「アンハッシュ」して開始点に戻すことはできません。2つの違いは、ハッシュを作成するために使用するアルゴリズムまた、衝突を簡単に生成する方法が発見されたため、MD5が壊れていることに注意してください。

  • RSAは非対称暗号化アルゴリズムです。 2つのキー(プライベートとパブリック)があり、1つのキー(暗号化または復号化)で機能を実行し、もう1つのキーでリバースすることができます。使用するキーは、デジタル署名を行うか暗号化を行うかによって異なります。

57
bethlakshmi

MD5は 暗号化ハッシュ関数です。 「SHA」はハッシュ関数のファミリーの名前です。最初に「SHA-0」に名前が変更された短期間の「SHA」、次に「SHA-1」が定義されました(ベストセラー)。その後、ファミリーの新しいメンバーが追加され、まとめて「SHA-2」として指定され、SHA-224、SHA-256、SHA-384、およびSHA-512で構成されました。最近、新しいSHA世代が設計され、「SHA-3」だけでなく「ケッカク」とも呼ばれました(これはオープンコンテストでした。ケッカクは、最終的に勝利した候補者の1人のコードネームです)。 。

暗号化ハッシュ関数は、完全に定義された確定的な関数であり、秘密鍵を使用しません。入力として任意の長さのメッセージ(ビットのストリーム、anyビット)を受け取り、固定サイズの出力を生成します。出力サイズは関数によって異なります。 MD5の場合は128ビット、SHA-1の場合は160ビット、SHA-256の場合は256ビットです。特定の入力に対して特定のハッシュ関数を計算できますが、すべて同じ結果になります。ハッシュ関数はdigestsとも呼ばれ、入力の「チェックサム」または「要約」のようなものを生成するためです。堅牢なハッシュ関数は、それらを「反転」する方法を知らない、または同じ出力を生成する2つの異なる入力を見つけることさえできないようなものでなければなりません。後者はcollisionと呼ばれ、衝突が存在することは数学的に必要です(関数は、異なる出力を生成するよりも多くの異なる入力を受け入れることができるため)が、 oneの衝突であっても見つけることは不可能です。

MD5は衝突に関して非常に壊れていることが判明し(PCで数秒の作業で衝突が発生する可能性があります)、SHA-0もその点で壊れています。 SHA-1は少し不安定です。 SHAファミリの残りの部分は、これまでに堅牢であるように見えます。ハッシュ関数が衝突耐性を実現する方法は、関数全体が完全に既知であり、秘密の値がないため、奇跡のビットです。最高の暗号技術者がプロセスを解明するにはデータが多すぎます。

RSAは2つのアルゴリズムです: 非対称暗号化 アルゴリズムと デジタル署名 アルゴリズム。両方のアルゴリズムは同じ種類の数学に基づいて構築されていますが、それらはまったく異なります(多くの人が署名を「秘密鍵による暗号化」と表現しています。これは欠陥のアナロジーであり、せいぜい混乱するだけなので、そうしないでください)。どちらのアルゴリズムもkeys、つまり秘密にしておく必要のあるデータを使用します。 RSA署名の場合、署名されるのは直接指定されたメッセージ(ビットのシーケンス)ではなく、メッセージのハッシュです:メッセージは最初に暗号で処理されますSHA-256のようなハッシュ関数であり、ハッシュ値が使用されます。これは、RSAの数学では適度なサイズ(せいぜい数百ビット)の値しか処理できないためです。暗号化ハッシュ関数は、ハッシュへの署名が元のデータへの署名と同じくらい良いものです。

このように、RSAと暗号化ハッシュ関数はしばしば一緒に使用されます。しかし、それらはまったく同じものではありません。

16進数は、ビットのシーケンスを文字のシーケンスに表現する方法です:16進数は数字を使用し、 「A」から「F」までの文字。各文字は正確に4ビットをエンコードします(「0」は「0000」をエンコードし、「7」は「0111」をエンコードし、「D」は「1101」をエンコードします...)。 ビットの任意のシーケンス(特にハッシュ関数の出力)は、16進数に変換して戻すことができます。人間の目と脳は文字を読むのが得意であり、ビットを読むのは得意ではないため、16進数が一般的です。そのため、ファイルの暗号化ハッシュ関数を計算するコマンドラインツールは、伝統的に16進文字を出力します。ただし、ハッシュ関数を16進数で本質的に結び付けるものはありません。何らかの方法でコンピューターに適合するものはすべてビットのシーケンスであり、16進数の影響を受けやすくなっています。ハッシュ関数の出力はビットのシーケンスであり、さまざまな方法でエンコードできます。16進数は単なる「従来の」方法です(ただし、特に Base64 も頻繁に発生しますが、特にデータベースを扱う場合)。

35
Thomas Pornin