密碼學演算法之 SHA-3 keccak 演算法
阿新 • • 發佈:2018-12-13
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