SHAアルゴリズムの説明と実装

    SHAアルゴリズムの原理と実装

チャプターディレクトリ

  1. はじめに
  2. アルゴリズムの説明
    2.1データの準備
    2.1.1 <データのパディング
    2.1.2データブロック
    2.1.3初期ハッシュ値の設定
    2.2ハッシュ計算
    2.2.1 SHA-1
    2.2.2 SHA-256
    2.2.3 SHA-512
  3. 達成する

<b>作成者の能力は限られています。読み取りプロセス中にエラーを見つけた場合は、私に連絡してエラーを指摘し、後で読者が間違った知識を学べないようにしてください。ありがとうございます</ b>

はじめに

SHAアルゴリズム(英語:セキュアハッシュアルゴリズム、略してSHA)は、暗号化ハッシュ関数のファミリーであり、FIPSによって認定されたセキュアハッシュアルゴリズムです。デジタルメッセージに対応する固定長文字列(メッセージダイジェストとも呼ばれます)を計算できるアルゴリズム。また、入力メッセージが異なる場合、異なる文字列に対応する確率が非常に高くなります。

本文我们将介绍以下 SHA 算法: SHA-1, SHA-224, SHA-256, SHA-384, SHA-512, SHA-512/224, SHA-512/256.

その中でも、SHA-224とSHA-256は同じアルゴリズムを使用しますが、初期ハッシュ値が異なり、最終的な結果はアルゴリズムによって出力されるデータの最初の224/256ビットのみを使用します。SHA
-384、SHA-512、SHA-512 / 224、 SHA-512 / 256は同じアルゴリズムを使用しますが、初期ハッシュ値が異なり、最終結果はアルゴリズムによって出力されるデータの最初の384/512/224/256ビットのみを使用するという違いがあります。SHA
-2*およびSHA-384、SHA-5 *アルゴリズムも非常に似ており、使用される単語の長さが異なり、SHA-2は32ビットの単語を使用し、他のアルゴリズムは64ビットの単語を使用します。アルゴリズムの反復回数も異なります。

アルゴリズムの説明

この記事で紹介したSHAアルゴリズムの計算手順は、大きく2つの手順に分けられます。<b>データの準備</ b>と<b>ハッシュの計算</ b>です。

データの準備

データ準備段階では、MD5の場合と同様に、データを特定の長さに入力し、同時に元のデータ長を入力してから、データをブロックに分割する必要があります。これは、アルゴリズムがブロックに基づいているためです。SHAファミリの詳細アルゴリズムの実装は基本的に同じですが、パディング長のビット数がわずかに異なる点が異なります。

データ準備フェーズでは、データの充填、データの分割、初期ハッシュ値の設定の3つの操作を実行する必要があります。

データのパディング

私たちは、使用しMその長さ使用し、データを表すデータをl表現します。

アルゴリズム<b> SHA-1 </ b>、<b> SHA-224 </ b>、<b> SHA-256 </ b>の場合、データの埋め込み方法は次のとおりです。
最初に「1」の1ビットをデータに埋め込みます最後に、k '0'sを入力します。ここで、kは負でない最小の数で、を満たすl + 1 + k \ equiv448mod512必要があります。つまり、元のデータ長を<b> 64ビットの差が512の整数倍</ b>になるように入力する必要があります。
操作が完了した後、l得られたビット列のデータの後に示す手順は、我々は、512個のデータの長さの整数倍を得るため、64ビットに充填されています。

例:
データデータが「abc」で、長さが24(ビット)であるとします。kは423(448-1-24)であると計算しました。入力後のデータ
\ underbrace {01100001} _ {a} \ quad \ underbrace {01100010} _ {b} \ quad \ underbrace {01100011} _ {c} \ quad 1 \ quad \ overbrace {00 ... 00} ^ {423} \クワッド\ overbrace {00 ... 0 \ underbrace {11000} _ {t = 24}} ^ {64}
次のようになります:入力が完了しましたその後の長さは512(ビット)です。

アルゴリズム<b> SHA-384 </ b>、<b> SHA-512 </ b>、<b> SHA-512 / 224 </ b>、<b> SHA-512 / 256 </ b>、データを埋める方法は次のとおりです。
最初に「1」の1ビットをデータの最後まで埋め、次にkの「0」を埋めます。ここで、kは最小の非負数を必要とし、を満たしますl + 1 + k \ equiv896mod1024。つまり、元のデータ長を< B> 128 </ B> 1024の差の整数倍の
操作が完了した後、lビットを埋めるために、上記工程で得られた128ビットのデータの配列として表現された後、我々が1024個のデータの長さの整数倍を得る。この時。

上記の例を例にとる
と、データデータが「abc」で、長さが24(ビット)であるとします。kは871(896-1-24)であると計算しました。入力後のデータは次のようになります。 :
\ underbrace {01100001} _ {a} \ quad \ underbrace {01100010} _ {b} \ quad \ underbrace {01100011} _ {c} \ quad 1 \ quad \ overbrace {00 ... 00} ^ {871} \クワッド\ overbrace {00 ... 0 \ underbrace {11000} _ {t = 24}} ^ {128}
充填後の長さは1024(ビット)です。

データチャンク

入力されたデータはブロックに分割する必要があります。

アルゴリズムの<B> SHA-1 </ B>、<B> SHA-224が</ B>、<B> SHA-256 </ B>、
我々はにデータを分割しN、521ビットのブロックは、以下のように示されています
M ^ {(1)}、M ^ {(2)}、...、M ^ {(N)}
512ビットブロックは、16ビットワード(32ビットワード)に分割でき、それぞれ次のように表されます。
M ^ {(i)} _ {0}、M ^ {(i)} _ {1}、...、M ^ {(i)} _ {15}

アルゴリズム<B>のためのSHA-384 </ B>、<B> SHA-512 </ B>、<B> SHA-224分の512 </ B>、<B> SHA-256分の512 </ B>
米国データは、に分割されているNように、それぞれ、1024ビットのブロックの
M ^ {(1)}、M ^ {(2)}、...、M ^ {(N)}
順番に1024ビットのブロックは、16ワード(64ビット・ワード)に分割することができる、と表記します
M ^ {(i)} _ {0}、M ^ {(i)} _ {1}、...、M ^ {(i)} _ {15}

初期ハッシュ値を設定する

特定のSHAアルゴリズムにはそれぞれ対応する初期ハッシュ値があります。ハッシュを計算する前に、初期値を準備する必要があります。

記事の長さを短縮するために、ここでは、ハッシュ計算プロセスで使用されるこれらの初期値と定数をリストしていません。K対応するデータは、背後のアルゴリズム実装で提供されます。

ハッシュ計算

SHA-1

SHA-1アルゴリズムでは、入力データの2 ^ 64長さが0 以下でなければならず、最小長は0です。

擬似コードは次のとおりです。

ROTL ^ n(x)=(x << n)\ cup(x >> w-n)

f_t(x、y、z) = \ begin {cases} Ch(x、y、z)=(x \ cap y)\ bigoplus(¬x\ cap z)、\ qquad 0 \ leq t \ leq19 \\ \ quad \\ Parity(x、y、 z)= x \ bigoplus y \ bigoplus z、\ qquad 20 \ leq t \ leq39 \\ \ quad \\ Maj(x、y、z)=(x \ cap y)\ bigoplus(x \ cap z)\ bigoplus (y \ cap z)、\ qquad 40 \ leq t \ leq59 \\ \ quad \\ Parity(x、y、z)= x \ bigoplus y \ bigoplus z、\ qquad 60 \ leq t \ leq79 \\ \ quad \\ \ end {cases}

i = 1からNの場合:
{
    // 1。计算W_t
\ quad W_t=\ begin {cases} M ^ {(0)} _ t、\ qquad 0 \ leq t \ leq15 \\ \ quad \\ ROTL ^ 1(W_ {t-3} \ bigoplus W_ {t-8} \ bigoplus W_ { t-14} \ bigoplus W_ {t-16})、\ qquad 16 \ leq t \ leq79 \\ \ end {cases}

    // 2.作業変数a、b、c、d、eを初期化します。これらは、i-1番目の反復でハッシュ値を格納するために使用され
    ます。上記の値。
\ quad a = H ^ {i-1} _0 \\ \ quad b = H ^ {i-1} _1 \\ \ quad c = H ^ {i-1} _2 \\ \ quad d = H ^ {i -1} _3 \\ \ quad e = H ^ {i-1} _4 \\

    // 3
    t = 0から79の場合:
    {
\ qquad T = ROTL ^ 5(a)+ f_t(b、c、d)+ e + K_t + W_t \\ \ qquad e = d \\ \ qquad d = c \\ \ qquad c = ROTL ^ 30(b )\\ \ qquad b = a \\ \ qquad a = T \\
    }

    // 4.計算私^ {番目}の中間ハッシュ値H ^ i
\ quad H ^ {(i)} _ 0 = a + H ^ {(i-1)} _ 0 \\ \ quad H ^ {(i)} _ 1 = b + H ^ {(i-1)} _ 1 \\ \ quad H ^ {(i)} _ 2 = c + H ^ {(i-1)} _ 2 \\ \ quad H ^ {(i)} _ 3 = d + H ^ {(i-1)} _ 3 \\ \ quad H ^ {(i)} _ 4 = e + H ^ {(i-1)} _ 4 \\
}

N回の反復の後に、最終的な結果はH ^ {(N)} _ 0、H ^ {(N)} _ 1、H ^ {(N)} _ 2、H ^ {(N)} _ 3、H ^ {(N)} _ 4バイトを順次そのバイトのアレイに接続されています。

SHA-256

SHA-256アルゴリズムでは、入力データの2 ^ 64長さが0 以下でなければならず、最小長は0です。

SHA-224アルゴリズムの計算プロセスはSHA-256と同じですが、使用される初期ハッシュ値が異なり、SHA-224アルゴリズムの最終結果はSHA-256アルゴリズム結果の最初の224ビットを取得することです。

擬似コードは次のとおりです。

SHR ^ n(x)= x >> n
ROTR ^ n(x)=(x >> n)\ cup(x << w-n)
\ Sigma ^ {\ {256 \}} _ 0(x)= ROTR ^ 2(x)\ bigoplus ROTR ^ {13}(x)\ bigoplus ROTR ^ {22}(x)
\ Sigma ^ {\ {256 \}} _ 1(x)= ROTR ^ 6(x)\ bigoplus ROTR ^ {11}(x)\ bigoplus ROTR ^ {25}(x)
\ sigma ^ {\ {256 \}} _ 0(x)= ROTR ^ 7(x)\ bigoplus ROTR ^ {18}(x)\ bigoplus SHR ^ 3(x)
\ sigma ^ {\ {256 \}} _ 1(x)= ROTR ^ {17}(x)\ bigoplus ROTR ^ {19}(x)\ bigoplus SHR ^ {10}(x)

i = 1からNの場合:
{
    // 1。计算W_t
\ quad W_t=\ begin {cases} M ^ {(0)} _ t、\ qquad 0 \ leq t \ leq15 \\ \ quad \\ \ sigma ^ {\ {256 \}} _ 1(W_ {t-2})+ W_ { t-7} + \ sigma ^ {\ {256 \}} _ 0(W_ {t-15})+ W_ {t-16}、\ qquad 16 \ leq t \ leq63 \\ \ end {cases}

    // 2.作業変数a、b、c、d、e、f、g、hを初期化します。これらは、i-1番目の反復でハッシュ値を格納するために使用されます
    //初期値は、 「ハッシュ値」セクションに記載されている値。
\ quad a = H ^ {i-1} _0 \\ \ quad b = H ^ {i-1} _1 \\ \ quad c = H ^ {i-1} _2 \\ \ quad d = H ^ {i -1} _3 \\ \ quad e = H ^ {i-1} _4 \\ \ quad f = H ^ {i-1} _5 \\ \ quad g = H ^ {i-1} _6 \\ \ quad h = H ^ {i-1} _7 \\

    // 3
    t = 0から63の場合:
    {
\ qquad T_1 = h + \ Sigma ^ {\ {256 \}} _ 1(e)+ Ch(e、f、g)+ K ^ {\ {256 \} _ t} + W_t \\ \ qquad T_2 = \ Sigma ^ {\ {256 \}} _ 0(a)+ Maj(a、b、c)\\ \ qquad h = g \\ \ qquad g = f \\ \ qquad f = e \\ \ qquad e = d + T_1 \\ \ qquad d = c \\ \ qquad c = b \\ \ qquad b = a \\ \ qquad a = T_1 + T_2 \\
    }

    // 4.計算私^ {番目}の中間ハッシュ値H ^ i
\ quad H ^ {(i)} _ 0 = a + H ^ {(i-1)} _ 0 \\ \ quad H ^ {(i)} _ 1 = b + H ^ {(i-1)} _ 1 \\ \ quad H ^ {(i)} _ 2 = c + H ^ {(i-1)} _ 2 \\ \ quad H ^ {(i)} _ 3 = d + H ^ {(i-1)} _ 3 \\ \ quad H ^ {(i)} _ 4 = e + H ^ {(i-1)} _ 4 \\ \ quad H ^ {(i)} _ 5 = b + H ^ {(i-1)} _ 5 \\ \ quad H ^ {(i)} _ 6 = c + H ^ {(i-1)} _ 6 \\ \ quad H ^ {(i)} _ 7 = d + H ^ {(i-1)} _ 7 \\
}

N回の反復の後に、最終的な結果はH ^ {(N)} _ 0、H ^ {(N)} _ 1、H ^ {(N)} _ 2、H ^ {(N)} _ 3、H ^ {(N)} _ 4、H ^ {(N )} _ 5、H ^ {(N)} _ 6、H ^ {(N)} _ 7バイトを順次そのバイトのアレイに接続されています。

SHA-512

SHA-512アルゴリズムでは、入力データの2 ^ 128長さが0 以下でなければならず、最小長は0です。

SHA-384アルゴリズムの計算プロセスはSHA-512と同じですが、使用される初期ハッシュ値が異なり、SHA-384アルゴリズムの最終結果はSHA-512アルゴリズム結果の最初の384ビットを取得することです。

SHA-512 / 224アルゴリズムの計算プロセスはSHA-512と同じですが、使用される初期ハッシュ値が異なり、SHA-512 / 224アルゴリズムの最終結果はSHA-512アルゴリズム結果の最初の224ビットを取得することです。

SHA-512 / 256アルゴリズムの計算プロセスはSHA-512と同じですが、使用される初期ハッシュ値が異なり、SHA-512 / 256アルゴリズムの最終結果はSHA-512アルゴリズム結果の最初の256ビットを取得することです。

擬似コードは次のとおりです。

\ Sigma ^ {\ {512 \}} _ 0(x)= ROTR ^ {28}(x)\ bigoplus ROTR ^ {34}(x)\ bigoplus ROTR ^ {39}(x)
\ Sigma ^ {\ {512 \}} _ 1(x)= ROTR ^ {14}(x)\ bigoplus ROTR ^ {18}(x)\ bigoplus ROTR ^ {41}(x)
\ sigma ^ {\ {512 \}} _ 0(x)= ROTR ^ 1(x)\ bigoplus ROTR ^ 8(x)\ bigoplus SHR ^ 7(x)
\ sigma ^ {\ {512 \}} _ 1(x)= ROTR ^ {19}(x)\ bigoplus ROTR ^ {61}(x)\ bigoplus SHR ^ 6(x)

i = 1からNの場合:
{
    // 1。计算W_t
\ quad W_t=\ begin {cases} M ^ {(0)} _ t、\ qquad 0 \ leq t \ leq15 \\ \ quad \\ \ sigma ^ {\ {512 \}} _ 1(W_ {t-2})+ W_ { t-7} + \ sigma ^ {\ {512 \}} _ 0(W_ {t-15})+ W_ {t-16}、\ qquad 16 \ leq t \ leq79 \\ \ end {cases}

    // 2.作業変数a、b、c、d、e、f、g、hを初期化します。これらは、i-1番目の反復でハッシュ値を格納するために使用されます
    //初期値は、 「ハッシュ値」セクションに記載されている値。
\ quad a = H ^ {i-1} _0 \\ \ quad b = H ^ {i-1} _1 \\ \ quad c = H ^ {i-1} _2 \\ \ quad d = H ^ {i -1} _3 \\ \ quad e = H ^ {i-1} _4 \\ \ quad f = H ^ {i-1} _5 \\ \ quad g = H ^ {i-1} _6 \\ \ quad h = H ^ {i-1} _7 \\

    // 3
    t = 0から79の場合:
    {
\ qquad T_1 = h + \ Sigma ^ {\ {512 \}} _ 1(e)+ Ch(e、f、g)+ K ^ {\ {512 \} _ t} + W_t \\ \ qquad T_2 = \ Sigma ^ {\ {512 \}} _ 0(a)+ Maj(a、b、c)\\ \ qquad h = g \\ \ qquad g = f \\ \ qquad f = e \\ \ qquad e = d + T_1 \\ \ qquad d = c \\ \ qquad c = b \\ \ qquad b = a \\ \ qquad a = T_1 + T_2 \\
    }

    // 4.計算私^ {番目}の中間ハッシュ値H ^ i
\ quad H ^ {(i)} _ 0 = a + H ^ {(i-1)} _ 0 \\ \ quad H ^ {(i)} _ 1 = b + H ^ {(i-1)} _ 1 \\ \ quad H ^ {(i)} _ 2 = c + H ^ {(i-1)} _ 2 \\ \ quad H ^ {(i)} _ 3 = d + H ^ {(i-1)} _ 3 \\ \ quad H ^ {(i)} _ 4 = e + H ^ {(i-1)} _ 4 \\ \ quad H ^ {(i)} _ 5 = b + H ^ {(i-1)} _ 5 \\ \ quad H ^ {(i)} _ 6 = c + H ^ {(i-1)} _ 6 \\ \ quad H ^ {(i)} _ 7 = d + H ^ {(i-1)} _ 7 \\
}

N回の反復の後に、最終的な結果はH ^ {(N)} _ 0、H ^ {(N)} _ 1、H ^ {(N)} _ 2、H ^ {(N)} _ 3、H ^ {(N)} _ 4、H ^ {(N )} _ 5、H ^ {(N)} _ 6、H ^ {(N)} _ 7バイトを順次そのバイトのアレイに接続されています。

アルゴリズムの実装

go language.githubを使用してアルゴリズムを実装しました:https : //github.com/UselezzProgrammer/mycrypto

終わり!

元の記事を27件公開 賞賛された31件 40,000回以上の閲覧

おすすめ

転載: blog.csdn.net/zhaoruixiang1111/article/details/102805652