SHA-2
擬似コード[編集]
SHA-256アルゴリズムのPseudocodeが続きます。 < code>< code>< / code>< / code>単語はSHA-1と比較して。
h0:= 0x6a09e667 h1:= 0xbb67ae85 h2:= 0x3c6ef372 h3:= 0xa54ff53a h4:= 0x510e527f h5:= 0x9b05688c h6:= 0x1f83d9ab h7:= 0x5be0cd19 k[ 0..63] := 0x428a2f98、0x71374491、0xb5c0fbcf、0xe9b5dba5、0x3956c25b、0x59f111f1、0x923f82a4、0xab1c5ed5、 0xd807aa98,0x12835b01,0x243185be、0x550c7dc3,0x72be5d74,0x80deb1fe、0x9bdc06a7,0xc19bf174、 0xe49b69c1,0xefbe4786,0x0fc19dc6,0x240ca1cc、0x2de92c6f、0x4a7484aa、0x5cb0a9dc、0x76f988da、 0x983e5152、0xa831c66d、0xb00327c8、0xbf597fc7、0xc6e00bf3、0xd5a79147、0x06ca6351、0x14292967、 0x27b70a85、0x2e1b2138、0x4d2c6dfc、0x53380d13、0x650a7354、0x766a0abb、0x81c2c92e、0x92722c85、 0xa2bfe8a1、0xa81a664b、0xc24b8b70、0xc76c51a3、0xd192e819、0xd6990624、0xf40e3585、0x106aa070、 0x19a4c116,0x1e376c08,0x2748774c、0x34b0bcb5,0x391c0cb3,0x4ed8aa4a、0x5b9cca4f、0x682e6ff3、 0x748f82ee、0x78a5636f、0x84c87814、0x8cc70208、0x90befffa、0xa4506ceb、0xbef9a3f7、0xc67178f2
長さLビットの元のメッセージで始まる
単一の「1」ビットを付加する
L + 1 + K + 64が512の倍数となるように、K '0'ビットを付加する。ここで、Kは最小数> = 0である。
Lを64ビットのビッグエンディアン整数として追加して、後処理された合計の長さを512ビットの倍数にする
メッセージを512ビットのチャンクに分割する
各チャンク
64エントリのメッセージスケジュール配列を作成します(0..63] 32ビットワードの
チャンクをメッセージスケジュール配列の最初の16ワードw [0..15]にコピーする
〜16まで
s0:=(右回転 ) xor '(右回転' '18' 'i-15]' ' 'xor' (w i-15] 'rightshift' 3)
s1:=(右回転 '17)' xor '(右回転' '19) 'xor' (w[ i-2] 'rightshift' 10)
w[ i] := w-i-16] ' - 7' - ] s1
a:= h0
b:= h1
c:= h2
d:= h3
e:= h4
f:= h5
g:= h6
h:= h7
から0まで63 S1:=(e 'rightrotate' '6' xor '(e' rightrotate xor '(e' rightrotate '25) ch:=(e 'と' f 'xor' (( e 'と' g) temp1:= h '+' S1 '+' "ch" + 'k[ i] '私は] S0:=(a 'rightrotate' '2' xor rightrotate 'xor' (a rightrotate '22) maj:=(a と 'b' xor 'と' c 'xor' (b 'と' c) temp2:= S0 '+' maj h:= g g:= f f:= e e:= d + 'temp1 d:= c c:= b b:= a := temp1 '+' temp2 h0:= h0 + 'a h1:= h1 '+' 'b h2:= h2 '+' c h3:= h3 '+' d h4:= h4 '+' e h5:= h5 '+' f h6:= h6 '+' 'g h7:= h7 '+' h
'append' 'h3' append 'h4' append 'h5' append ' 'h6' append 'h7を追加する
< code> ch< / code> < code> maj< / code>値は SHA-1について説明したと同様に最適化できます。
SHA-224はSHA-256と同じですが、次の点が異なります。
- 初期ハッシュ値< code> h0< / code> < code> h7< / code>異なる
- 出力は、< code> h7< / code>を省略して構成されています。
h[ 0..7] := 0xc1059ed8、0x367cd507、0x3070dd17、0xf70e5939、0xffc00b31、0x68581511、0x64f98fa7、0xbefa4fa4
SHA-512の構造はSHA-256と同じですが、
- メッセージは1024ビットのチャンクに分割され、
- 初期ハッシュ値とラウンド定数は64ビットに拡張され、
- 64の代わりに80回のラウンドがあり、
- メッセージスケジュール配列wは64個の32ビットワードの代わりに80個の64ビットワードを有し、
- メッセージスケジュール配列wを拡張するために、ループは16から63ではなく16から79になり、
- 定数は最初の80個の素数に基づいています2.409、
- 計算に使用されるワードサイズは64ビットですが、
- (前処理の前に)メッセージの付加された長さは、 'bits'で128ビットのビッグエンディアン整数であり、
- 使用されるシフト量と回転量は異なります。
h[ 0..7] := 0x6a09e667f3bcc908,0xbb67ae8584caa73b、0x3c6ef372fe94f82b、0xa54ff53a5f1d36f1、 0x510e527fade682d1,0x9b05688c2b3e6c1f、0x1f83d9abfb41bd6b、0x5be0cd19137e2179 k[ 0..79] := [0x428a2f98d728ae22、0x7137449123ef65cd、0xb5c0fbcfec4d3b2f、0xe9b5dba58189dbbc、0x3956c25bf348b538、 0x59f111f1b605d019,0x923f82a4af194f9b、0xab1c5ed5da6d8118,0xd807aa98a3030242,0x12835b0145706fbe、 0x243185be4ee4b28c、0x550c7dc3d5ffb4e2,0x72be5d74f27b896f、0x80deb1fe3b1696b1,0x9bdc06a725c71235、 0xc19bf174cf692694、0xe49b69c19ef14ad2、0xefbe4786384f25e3,0x0fc19dc68b8cd5b5,0x240ca1cc77ac9c65、 0x2de92c6f592b0275,0x4a7484aa6ea6e483,0x5cb0a9dcbd41fbd4,0x76f988da831153b5,0x983e5152ee66dfab、 0xa831c66d2db43210,0xb00327c898fb213f、0xbf597fc7beef0ee4、0xc6e00bf33da88fc2,0xd5a79147930aa725、 0x06ca6351e003826f、0x142929670a0e6e70,0x27b70a8546d22ffc、0x2e1b21385c26c926,0x4d2c6dfc5ac42aed、 0x53380d139d95b3df、0x650a73548baf63de、0x766a0abb3c77b2a8、0x81c2c92e47edaee6、0x92722c851482353b、 0xa2bfe8a14cf10364,0xa81a664bbc423001,0xc24b8b70d0f89791,0xc76c51a30654be30,0xd192e819d6ef5218、 0xd69906245565a910,0xf40e35855771202a、0x106aa07032bbd1b8,0x19a4c116b8d2d0c8,0x1e376c085141ab53、 0x2748774cdf8eeb99,0x34b0bcb5e19b48a8,0x391c0cb3c5c95a63,0x4ed8aa4ae3418acb、0x5b9cca4f7763e373、 0x682e6ff3d6b2b8a3,0x748f82ee5defb2fc、0x78a5636f43172f60,0x84c87814a1f0ab72,0x8cc702081a6439ec、 0x90befffa23631e28,0xa4506cebde82bde9,0xbef9a3f7b2c67915,0xc67178f2e372532b、0xca273eceea26619c、 0xd186b8c721c0c207,0xeada7dd6cde0eb1e、0xf57d4f7fee6ed178,0x06f067aa72176fba、0x0a637dc5a2c898a6、 0x113f9804bef90dae、0x1b710b35131c471b、0x28db77f523047d84、0x32caab7b40c72493、0x3c9ebe0a15c9bebc、 0x431d67c49c100d4c、0x4cc5d4becb3e42b6,0x597f299cfc657e2a、0x5fcb6fab3ad6faec、0x6c44198c4a475817]
S0:=(a 'rightrotate' 28) xor '(a' rightrotate 34 'xor' (a 'rightrotate' 39) S1:=(e 'rightrotate' '14' xor e 'rightrotate' xor '(e' rightrotate '41) s0:=(右回転 ) 'xor' (右回転 8 i-15] 'xor' (w i-15] 'rightshift' 7) s1:=(右回転 19) 'xor' (右回転 61) 'xor' (w[ i-2] 'rightshift' 6)
SHA-384はSHA-512と同じですが、
- 初期ハッシュ値< code> h0< / code> < code> h7< / code> (9番目から16番目の素数をとって)、
- 出力は、< code> h6< / code> < code> h7< / code>
h[ 0..7] := 0xcbbb9d5dc1059ed8,0x629a292a367cd507,0x9159015a3070dd17,0x152fecd8f70e5939、 0x67332667ffc00b31,0x8eb44a8768581511,0xdb0c2e0d64f98fa7,0x47b5481dbefa4fa4
SHA-512 / tは、次の点を除いてSHA-512と同じです。
- 初期ハッシュ値< code> h0< / code> < code> h7< / code> SHA-512 / t IV生成関数 によって与えられ、
- 出力は、< code> h0< / code>の連結を切り捨てて構成されます。 < code> h7< / code> t ビットで、
- t は384と同じではなく、SHA-384を指定どおりに使用する必要があります。
- t 値224と256は特に承認されたものとして言及されています。
SHA-512 / t IV生成関数は、ASCII文字列 "SHA-512 / t" '上の "' SHA-512 を10進表現 t で置き換えて評価します。 。 SHA-512は初期値 h0 </ code>を除いてSHA-512と同じです。 &lt; code&gt; h7&lt; / code&gt;それぞれが16進定数<code> 0xa5a5a5a5a5a5a5a5 </ code>でXORされされています。
SHA-2ファミリのハッシュ関数のサンプルC実装は、RFC 6234にあります。
SHA関数の比較[編集]
以下の表で、「内部状態」は、データブロックの各圧縮後の「内部ハッシュサム」を意味します。
bitwise operation欄には、[Bitwise operation#Rotate no carry | rotate no carry]を表し、Shrは右論理シフトを表します。これらのアルゴリズムはすべて、SHA-3を除いて modular additionを採用しています。
現代のプロセッサー・アーキテクチャーに関するより詳細なパフォーマンス測定値は、以下の表に示されています。
CPUアーキテクチャ | 周波数 | アルゴリズム | ワードサイズ(ビット) | サイクル数/バイトx86 | MiB / s x86 | サイクル数/バイトx86-64 | MiB / s x86-64 |
---|---|---|---|---|---|---|---|
Intel Ivy Bridge | 3.5&nbsp; GHz | SHA-256 | 32ビット | 16.80 | 199 | 13.05 | 256 |
SHA-512 | 64ビット | 43.66 | 76 | 8.48 | 394 | ||
AMD Piledriver APU | 3.8&nbsp; GHz | SHA-256 | 32ビット | 22.87 | 158 | 18.47 | 196 |
SHA-512 | 64ビット | 88.36 | 41 | 12.43 | 292 |
「x86」というラベルのパフォーマンス番号は、64ビットプロセッサで32ビットコードを使用して実行されていましたが、「x86-64」はネイティブの64ビットコードです。 SHA-256は32ビット計算用に設計されていますが、x86アーキテクチャ上の64ビットプロセッサ向けに最適化されたコードの利点があります。 SHA-512の32ビットの実装は、64ビットの実装よりも大幅に遅いです。異なる出力サイズを持つ両方のアルゴリズムのバリアントは、メッセージの展開と圧縮の機能が同じで、最初のハッシュ値と出力サイズだけが異なるため、同様に機能します。最新のプロセッサでは、MD5とSHA-1の最善の実装では、バイトあたり4.5〜6サイクルが実行されます。
テストは、Intel社のXeon E3-1275 V2を搭載したhydra8システムで3.5 [GHz]のクロック速度で、[AE]システムでAMD A10-5800K APUを実行している[イリノイ大学シカゴで]クロック速度は3.8GHzです。上記の1バイトあたりの速度で参照されるサイクルは、SUPERCOP暗号ベンチマーキングソフトウェアを使用して4,096バイトのメッセージを消化するアルゴリズムの中央性能です。 MiB / sの性能は、単一コアのCPUクロック速度から外挿されます。実際のパフォーマンスは、さまざまな要因によって変化します。
関連項目[編集]
- 暗号ハッシュ関数の比較
- ハッシュベースのメッセージ認証コード
- Hashcash
- [[暗号研究のための国際協会](IACR)
- [ta] sha1sum&lt; / tt&gt; (sha224sum </ tt>、sha256sum </ tt>、sha384sum </ tt>、およびsha512sum)コマンド
- 信頼できるタイムスタンプ