Keccak

32位平台下的shake-128

  • August 27, 2018

我在 32 位微控制器中實現抖動,所以我想使用位交錯。我檢查了程式碼:https ://github.com/floodyberry/supercop/blob/master/crypto_hash/keccak/simple32bi/Keccak-simple32BI.c但我不明白如何在此程式碼中完成位交錯轉換。任何人都可以提供理解這一點的見解。

此外,我比較了先前連結和 64 位實現(https://github.com/floodyberry/supercop/blob/master/crypto_hash/keccak/simple/Keccak-simple.c)的函式 KeccakF 的結果和結果不一樣。它們應該是相同的還是不是?

謝謝

位交織程式碼如下所示:

{
   const UINT32 * pI = (const UINT32 *)in;
   UINT32 * pS = state;
   UINT32 t, x0, x1;
   int i;
   for (i = laneCount-1; i >= 0; --i)
   {
       x0 = *(pI++);
       t = (x0 ^ (x0 >>  1)) & 0x22222222UL;  x0 = x0 ^ t ^ (t <<  1);
       t = (x0 ^ (x0 >>  2)) & 0x0C0C0C0CUL;  x0 = x0 ^ t ^ (t <<  2);
       t = (x0 ^ (x0 >>  4)) & 0x00F000F0UL;  x0 = x0 ^ t ^ (t <<  4);
       t = (x0 ^ (x0 >>  8)) & 0x0000FF00UL;  x0 = x0 ^ t ^ (t <<  8);
       x1 = *(pI++);
       t = (x1 ^ (x1 >>  1)) & 0x22222222UL;  x1 = x1 ^ t ^ (t <<  1);
       t = (x1 ^ (x1 >>  2)) & 0x0C0C0C0CUL;  x1 = x1 ^ t ^ (t <<  2);
       t = (x1 ^ (x1 >>  4)) & 0x00F000F0UL;  x1 = x1 ^ t ^ (t <<  4);
       t = (x1 ^ (x1 >>  8)) & 0x0000FF00UL;  x1 = x1 ^ t ^ (t <<  8);
       *(pS++) ^= (x0 & 0x0000FFFF) | (x1 << 16);
       *(pS++) ^= (x0 >> 16) | (x1 & 0xFFFF0000);
   }
}

提取函式中也有匹配的去交錯程式碼。

我還使用該程式碼(或類似的程式碼)作為基礎編寫了一個 Keccak/SHA3 類。無論出於何種原因,我不喜歡它的外觀,並最終編寫了自己的程式碼,與我的交錯程式碼實現相比,編譯後的速度提高了 1.45 倍(只是交錯,而不是雜湊),所以速度更快方法來做到這一點。

我還發現,當您吸收或提取時,在開發/測試期間交錯/去交錯整個狀態會更容易,因為您可以查看狀態工作變數的中間值並與參考實現進行比較。

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