BLAKE2b 中的偏移參數
在我的密碼學課程中,我們開始研究雜湊函式。作為家庭作業,我們必須選擇一個現代散列函式並在課堂上描述它。我選擇了BLAKE2b,文字解釋的時候我可以很好的理解,但是官方的實現提出了疑問。
static void G(int roundNum, int i, int a, int b, int c, int d) { int p = (roundNum << 4) + 2 * i; int p0 = ReplaceConstants[p]; int p1 = ReplaceConstants[p + 1]; string s = @"// G(r, i, a, b, c, d) a = a + b + m[" + p0 + @"]; d ^= a; d = " + RotateRight("d", 32) + @"; c = c + d; b ^= c; b = " + RotateRight("b", 24) + @"; a = a + b + m[" + p1 + @"]; d ^= a; d = " + RotateRight("d", 16) + @"; c = c + d; b ^= c; b = " + RotateRight("b", 63) + @";"; s = s.Replace("a", "v" + a); s = s.Replace("b", "v" + b); s = s.Replace("c", "v" + c); s = s.Replace("d", "v" + d); s = s.Replace("r", roundNum.ToString()); s = s.Replace("i", i.ToString()); s = s.Replace("\t", ""); Console.WriteLine(s); Console.WriteLine(); }
單核函式 G,她按預期呼叫了四次 RotateRight。
static string RotateRight(string name, int offset) { return "((" + name + " >>" + offset + ")|(" + name + " << (64-" + offset + ")))"; }
不明白為什麼Rotate在需要16、12、8、7的時候取32、24、16、63的offset參數,如下圖: 另外,關於這個方案,怎麼辦 $ Сsigma_r(2i+1) $ 和 $ Msigma_r(2i) $ 意思是?
我的消息來源:
$ G $ 功能
您引用的圖形似乎描述了 $ G $ BLAKE 的功能 - 而不是BLAKE2b 的功能。不僅要注意不同的旋轉,還要注意常數的添加 $ C_{\sigma_r(2i+1)} $ 這些不再出現在 BLAKE2 中。這兩個都符合定義 $ G $ BLAKE 的功能,根據官方文件。
至於 BLAKE2:請注意 BLAKE2 有兩個版本。BLAKE2s 適用於具有 8-32 位硬體的平台,BLAKE2b 適用於具有 64 位硬體的平台。
BLAKE2s 分別使用 16、12、8 和 7 位的旋轉 - 但沒有不斷添加 - 所以看起來與您的圖形非常相似(但不相等!)。
另一方面,BLAKE2b 分別使用 32、24、16 和 63 位的旋轉,這是引用的原始碼實現的。
有關 BLAKE2 的詳細資訊,請查看官方BLAKE2 文件的第 2.4 節(似乎側重於從 BLAKE 到 BLAKE2 的更改)或其提供完整描述的RFC 。
在您連結到的儲存庫中,它們僅提供 BLAKE2b 的 C# 參考實現。但是,您可以通過比較BLAKE2b和BLAKE2s的 C 參考實現來查看不同的實現:
BLAKE2s’ $ G() $ 功能
#define G(r,i,a,b,c,d) \ do { \ a = a + b + m[blake2s_sigma[r][2*i+0]]; \ d = rotr32(d ^ a, 16); \ c = c + d; \ b = rotr32(b ^ c, 12); \ a = a + b + m[blake2s_sigma[r][2*i+1]]; \ d = rotr32(d ^ a, 8); \ c = c + d; \ b = rotr32(b ^ c, 7); \ } while(0)
BLAKE2b $ G() $ 功能:
#define G(r,i,a,b,c,d) \ do { \ a = a + b + m[blake2b_sigma[r][2*i+0]]; \ d = rotr64(d ^ a, 32); \ c = c + d; \ b = rotr64(b ^ c, 24); \ a = a + b + m[blake2b_sigma[r][2*i+1]]; \ d = rotr64(d ^ a, 16); \ c = c + d; \ b = rotr64(b ^ c, 63); \ } while(0)
排列
這 $ \sigma $ 您詢問的是一系列排列,請參見例如 BLAKE2 RFC 的第 2.7 節。