keccakアルゴリズムと実現

7794 ワード

前言
今の社会の中でhashアルゴリズムの応用はますます広範になって、hashアルゴリズムはファイルが改ざんされないことを保証するために使用することができて、メッセージが正しく有効であることを保証することができて、同時にデジタル署名をすることができて、httpプロトコルの開発の中で、あるファイルがブレークポイントの継続を実現するために修正されたかどうかを検証することができます.従来のhash関数が受ける攻撃もますます多くなり、攻撃方法もますます有効になり、古いアルゴリズムが安全ではなく、新しい基準を推進しなければならないが、keccakはSHA-3アルゴリズムの最終的な優勝者として、もちろん彼の優位性があるので、ここではkeccakアルゴリズムの原理を議論し、同時にファイルhash値を計算する関数をパッケージする.
keccakアルゴリズムの紹介
完全な記述keccakアルゴリズムは比較的複雑であり,ここではこのアルゴリズムの特徴のみを論じた.まず彼はスポンジの構造を採用して、何がスポンジの構造で、まずスポンジは水を吸うことができて、水を吸った後にまた水を押し出して押し出して、全体のスポンジの構造を維持することができます.したがって、スポンジ構造の動作原理は、まず計算する列を入力し、次に列を充填し、入力列を可逆的な充填規則で充填し、ブロック化し、ブロック化した後、吸水する段階を行い、すべての入力メッセージ構造を処理した後、スポンジ構造を押出状態に切り替え、押出後に出力されるブロック数をユーザーが任意に選択することができる.その後、スポンジ構造の過程で、全部で5つの計算ステップがあり、それぞれθ, ρ, π, χ, ι, 以下に疑似コードを貼り付けます.
Keccak-f[b](A) {
  for i in 0…n-1
    A = Round[b](A, RC[i])
  return A
}

Round[b](A,RC) {
  # θ step
  C[x] = A[x,0] xor A[x,1] xor A[x,2] xor A[x,3] xor A[x,4],   for x in 04
  D[x] = C[x-1] xor rot(C[x+1],1),                             for x in 04
  A[x,y] = A[x,y] xor D[x],                           for (x,y) in (04,04)

  # ρ and π steps
  B[y,2*x+3*y] = rot(A[x,y], r[x,y]),                 for (x,y) in (04,04)

  # χ step
  A[x,y] = B[x,y] xor ((not B[x+1,y]) and B[x+2,y]),  for (x,y) in (04,04)

  # ι step
  A[0,0] = A[0,0] xor RC

  return A
}

上はホイール関数で、合計24ホイールを計算します.次は呼び出しと出力です.
    Keccak[r,c](Mbytes || Mbits) {
    # Padding
    d = 2^|Mbits| + sum for i=0..|Mbits|-1 of 2^i*Mbits[i]
    P = Mbytes || d || 0x00 || … || 0x00
    P = P xor (0x00 || … || 0x00 || 0x80)

    # Initialization
    S[x,y] = 0,                               for (x,y) in (04,04)

    # Absorbing phase
    for each block Pi in P
      S[x,y] = S[x,y] xor Pi[x+5*y],          for (x,y) such that x+5*y < r/w
      S = Keccak-f[r+c](S)

    # Squeezing phase
    Z = empty string
    while output is requested
      Z = Z || S[x,y],                        for (x,y) such that x+5*y < r/w
      S = Keccak-f[r+c](S)

    return Z
    }

擬似コードがあれば関数全体の構築が完了します.ここではgithubのコードです.keccak
次に、hashを計算するファイルを選択し、出力hash値を計算します.
import Keccak

print("       :")
path = input()
keccak = Keccak.Keccak(1600)
mIn = ''
array = []
try:
    #       KeccakF   
    with open(path,"rb") as input:
        j = 0
        while True:
            j += 1
            second_array = []
            i = 0
            while True:
                tB = input.read(1)
                mIn += str(int("%X"%ord(tB),16))
                i += 8
                if len(tB) == 0 or i >= 64:
                    break
                else:
                    second_array.append(int("%X"%ord(tB),16))
            array.append(second_array)
            if j == 5:
                break
    keccak.KeccakF(array, True)
    # keccak.printState(array,'Final result')
    #       Keccak   
    mArray = []
    mArray.append(len(mIn))
    mArray.append(mIn)
    print("   hash  : 
"
+keccak.Keccak(mArray)) except IOError as err: print(" :" + str(err))

以上の部分はhash関数でpythonに基づく