1. 程式人生 > >密碼學演算法之 SHA-3 keccak 演算法

密碼學演算法之 SHA-3 keccak 演算法

      Author: John
      sha3 雜湊加密演算法,不可逆
      Keccak演算法,sha家族最新演算法,採用的不同於 MD(如md5) 結構的海綿結構(sponge結構),使常用於攻擊 MD 結構的手段難以進行
      增強了演算法安全性
     任意 hash  均可
      FIPS 202 - SHA-3 Standard
      填充主要過程是:明文轉換成 16 進位制,再轉換成 2 進位制,因為 utf8 編碼明文後成 16 進位制形式後,明文位元數至少是 4 的倍數,所以填充明文首先加 16 進位制 06
      然後,末尾加 80 中間填充 0
,然後進行小端轉換,再進行 hash ; 壓縮主函式中每組明文,首輪加密前進行二維陣列矩陣轉置,之後進行 Round 函式加密,然後最後一輪加密後,再進行矩陣轉置,相當於每組明文加密轉置了兩次, 或者某種程度上可以說沒轉置; 全部加密完成後,再進行小端轉換得 sha3 hash 值。 注:1、最新 sha3 加密過程,並不包含 1 位元組中 高位在後,低位在前 的規則, 如果非要說有此規則,那麼就是 填充時,明文位元串先加字尾 01 再加 1 再加 若干 0 最後加 1,然後把填充的位元串按每位元組 高位在後,低位在前 轉換(即每位元組二進位制字串逆置) 2
、小端轉換是 8 位元組,類似於 C語言 long 型別轉換 3、假如填充完一組明文後(明文總共一組 r-8 bit 明文,那麼填充後明文後,需加 16 進位制 86 此處是重點*******

主要輪變換程式碼如下:

# sha3 輪函式
def Round(A, round_num):    # A 為引用引數,相當於 c++ 的引用引數,A 二維陣列實參值已改變

    B = [[0, 0, 0, 0, 0],
         [0, 0, 0, 0, 0],
         [0, 0, 0, 0, 0],
         [0, 0, 0, 0, 0],
         [0, 0, 0, 0
, 0]] C = [0, 0, 0, 0, 0] D = [0, 0, 0, 0, 0] # θ 變換 # 步驟一:將每列(y軸)壓縮為 1,(異或),好像只有 x軸(行軸)和z軸(道軸),其中座標軸為 x 朝右,y 朝上,z 朝裡 for x in range(5): C[x] = A[x][0] ^ A[x][1] ^ A[x][2] ^ A[x][3] ^ A[x][4] # 步驟二:將某H點臨近的兩列(已壓縮為兩點)異或為D點,在第三步,該H點異或D點(資料) for x in range(5): D[x] = C[(x - 1) % 5] ^ ROT(C[(x + 1) % 5], 1) # 步驟三:某H點異或D點 for x in range(5): for y in range(5): A[x][y] = A[x][y] ^ D[x] # ρ 變換 and π 變換 for x in range(5): for y in range(5): B[y][(2 * x + 3 * y) % 5] = ROT(A[x][y], P[x][y]) # χ 變換 for x in range(5): for y in range(5): A[x][y] = B[x][y] ^ ((~B[(x + 1) % 5][y]) & B[(x + 2) % 5][y]) # τ 變換 A[0][0] = A[0][0] ^ (RC[round_num]%(1<<W)) print('第'+str(round_num)+'輪輸出:') for x in range(5): for y in range(5): print('最終A:A[%d][%d]:%s\t' % (x, y, hex(A[x][y])),end='\t') print() return A