質問のタイトルはそれをすべて言います。私はSHA-1を研究してきましたが、ほとんどの場所で40桁の16進文字であり、私にとっては640ビットです。160ビット=20バイトの16進文字を10文字だけで表現することはできませんか。そして、1つの16進文字は2バイトを表すことができますか?なぜ必要な長さの2倍なのですか?私の理解には何が欠けていますか。
また、Base32またはBase36を使用している場合、SHA-1を5文字以下にすることはできませんか?
1つの16進文字は、16の異なる値、つまり4ビットのみを表すことができます。(16 = 2 4)
40×4=160。
いいえ、base-36には5文字以上が必要です。
合計2160の異なるSHA-1ハッシュがあります。
2 160 = 16 40なので、これが40桁の16進数が必要なもう1つの理由です。
ただし、2 160 = 36 160 log 36 2 = 36 30.9482 ...であるため、base-36を使用すると31文字が必要になります。
OPの混乱は、SHA1ハッシュを表す文字列が40バイト(少なくともASCIIを使用している場合)かかることに起因すると思います。これは、320ビット(640ビットではない)に相当します。
その理由は、ハッシュがバイナリであり、16進文字列がそのエンコーディングにすぎないためです。したがって、より効率的なエンコーディングを使用する場合(またはエンコーディングをまったく使用しない場合)、160ビットのスペース(20バイト)しか使用できませんが、その問題はバイナリセーフではないことです。
ただし、base64を使用することもできます。その場合、40ではなく約27〜28バイト(または文字)が必要になります(このページを参照)。
16進文字ごとに2バイトではなく、8ビットバイトごとに2つの16進文字があります。
(SHA-1定義のように)8ビットバイトを使用している場合、16進文字は1バイト内の単一の上位または下位4ビットニブルをエンコードします。したがって、1バイトにそのような文字が2つ必要です。
2つの16進文字は、0〜255の範囲、つまり0x00==0および0xFF==255を構成します。したがって、2つの16進文字は8ビットであり、SHAダイジェスト用に160ビットになります。
私の答えは、OPの混乱の正確な起源に関する私の理論と、解明のために提供する赤ちゃんのステップにおいて、以前の答えとのみ異なります。
文字は、使用されるエンコーディングに応じて異なるバイト数を使用します(ここを参照)。最近、Javaでプログラミングする場合など、1文字あたり2バイトを使用する場合、いくつかのコンテキストがあります(理由は次のとおりです)。したがって、40個のJava文字はOPの計算である80バイト= 640ビットに等しく、10個のJava文字は実際にSHA-1ハッシュの適切な量の情報をカプセル化します。
ただし、数千の可能なJava文字とは異なり、16の異なる16進文字、つまり0、1、2、3、4、5、6、7、8、9、A、B、C、D、E、およびFしかありません。 。ただし、これらはJava文字と同じではなく、Java文字0〜9およびA〜Fのエンコーディングよりもはるかに少ないスペースで済みます。これらは、4ビットで表されるすべての可能な値を示す記号です。
0 0000 4 0100 8 1000 C 1100
1 0001 5 0101 9 1001 D 1101
2 0010 6 0110 A 1010 E 1110
3 0011 7 0111 B 1011 F 1111
したがって、各16進文字はわずか0.5バイトであり、40の16進文字は20バイト=160ビット(SHA-1ハッシュの長さ)になります。
SHA-1は160ビットです
これは、20バイト= 40の16進文字(1バイトあたり2つの16進文字)に変換されます