Hash

BLAKE2b 中的偏移參數

  • May 1, 2022

在我的密碼學課程中,我們開始研究雜湊函式。作為家庭作業,我們必須選擇一個現代散列函式並在課堂上描述它。我選擇了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參數,如下圖: blake2b,算法說明 另外,關於這個方案,怎麼辦 $ Сsigma_r(2i+1) $ 和 $ Msigma_r(2i) $ 意思是?

我的消息來源:

來自維基百科的插圖

官方 C# 實現

$ 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# 參考實現。但是,您可以通過比較BLAKE2bBLAKE2s的 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 節。

引用自:https://crypto.stackexchange.com/questions/99871