RIPEMD-160

提供: tezos-wiki
RIPEMD160から転送)
移動先: 案内検索

RIPEMD-160は、Merkle-Damgård構築に基づく暗号ハッシュ関数です。 Bitcoin標準で使用されています。 RIPEMD-160アルゴリズムが160ビット出力を生成する間、128ビットのハッシュダイジェストを生成するRIPEMDアルゴリズムの強化バージョンです。圧縮機能は、それぞれ16回実行される5つのブロックで構成される80段階で構成されています。このパターンは2回実行され、モジュロ32の加算を使用して結果が最下部で結合されます。

パディング[編集]

圧縮機能は、32個の32ビット符号なしワードに作用する。これには、メッセージを512ビットの倍数にパディングし、バイトストリーム入力を32ビットワードにパディングする必要があります。パディングスキームは、Merkle-Damgård強化を使用して長さ拡張攻撃を防ぐMD4と同じです。これは、メッセージの末尾に追加されるものと、ブロックの最後に追加されるメッセージの長さ(ビット単位)とで構成されます。バイトは最初にローエンドにプッシュされます。さまざまなメッセージ長の可能なパターンを示すために、単語に埋め込まれたメッセージの4つの例を以下に示します。

メッセージの長さは最後の2番目の要素に追加する必要があります(長さは最後の2単語に64ビットの値が保存されますが、メッセージが長くなることはありません; Bitcoinでは32ビットで十分です)ソフトウェア。)


圧縮関数[編集]

thumb | upright = 1.2 | alt =サブブロック|圧縮関数のサブブロック] thumb | upright = 1.2 | alt =圧縮機能|完全圧縮機能。

圧縮機能は、メッセージブロックが16回通過する可変サブブロックで構成されています。合計80回の実行で5つの異なるバリエーションがあります。このプロセスは、データ会議が最後に2回行われ、次のブロック(存在する場合)に移動されるか、ハッシュレジスタに追加されます。サブブロックは、非線形関数の設計、メッセージブロックが1ラウンドで読み取られる順序、左回転量、およびk定数によって変更することができる。サブブロックの設計と圧縮機能の全体レイアウトが右側に示されています。

プロセスの擬似コード:

for(i:= 0〜ブロック-1){
    aLeft:= h0
    bLeft:= h1
    cLeft:= h2
    dLeft:= h3
    eLeft:= h4

    aRight:= h0
    b右:= h1
    cRight:= h2
    dRight:= h3
    eRight:= h4

    for(int j:= 0〜79){
        t:= rotleft(s [j])(aLeft + f(bLeft、cLeft、dLeft)+ X [r [i]])+ eLeft
        aLeft:= eLeft;
        eLeft:= dLeft
        dLeft:= rotleft(10)(c)
        cLeft:= bLeft
        bLeft:= t

        右にも同じことをする
    }

    t:= h1 + cLeft + dRight
    h1:= h2 + dLeft + eRight
    h2:= h3 + eLeft + aRight
    h3:= h4 + aLeft + bRight
    h4:= h0 + bLeft + cRight
    h0:= t
}

非線形関数は、左右の線の上下に逆の方向に適用されます。関数の設計は、上から下へ、下から上へ(Java構文の演算)です。

#x ^ y ^ z #(x&y)| (〜x&z) #(x |〜y)^ z #(x&z)| (y&z) #z ^(y |〜z)

右から上へのk値は以下の通りです。

#0x50A28BE6 #0x5C4DD124 #0x6D703EF3 #0x7A6D76E9 #0x00000000

左側のブロック配列Xから単語を選択する順番は、(2D配列内の各サブ配列はラウンドを表します。上の配列は上のラウンドを表し、下の配列は一番下のラウンド):

{{0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15}、// Round 1
{7、4、13、1、10、6、15、3、12、0、9、5、2、14、11、8}、// Round 2
{3、10、14、4、9、15、8、1、2、7、0、6、13、11、5、12}
{1、9、11、10、0、8、12、4、13、3、7、15、14、5、6}
{4、0、5、9、7、12、2、10、14、1、3、8、11、6、15、13}} // Round 5

右側の配列Xから単語を選択する順序は、(上記と同じパターンに従って)

{{5、14、7、0、9、2、11、4、13、6、15、8、1、10、3、12}、// Round 1
{6、11、3、7、0、13、5、10、14、15、8、12、4、9、
{3、5、1、3、7、14、6、9、11、8、12、2、10、0、4、13}
{8、6、4、1、3、11、15、0、5、12、2、13、9、7、10、14}
{12、15、10、4、1、5、8、7、6、2、13、14、0、3、9、11}} // Round 5

左側の左の順番は次のとおりです。

{{11、14、15、12、5、8、7、9、11、13、14、15、6、7、9、8}、// Round 1
{7、6、8、13、11、9、7、15、7、12、15、9、11、7、13、12}、// Round 2
{11、13、6、7、14、9、13、15、14、8、13、6、5、12、7、5} // Round 3
{11,12,14,15,14,15,9,8,9,14,5,6,8,6、5,12}、//第4ラウンド
{9、15、5、11、6、8、13、12、5、12、13、14、11、8、5}

右側の左回転順は次のとおりです。

{{8,9,9,11,13,15,15,5,7,7,8,11,14,14,12,6}、// Round 1
{9、13、15、7、12、8、9、11、7、7、12、7、6、15、13、11}、// Round 2
{9、7、15、11、8、6、6、14、12、13、5、14、13、13、7、5} // Round 3
{15,5,8,11,14,14,6,14,6,9,12,9,12,5,15,8}、//第4ラウンド
{8、5、12、9、12、5、14、6、8、13、6、5、15、13、11、11}}; // Round 5