Keccak
32位平台下的shake-128
我在 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 倍(只是交錯,而不是雜湊),所以速度更快方法來做到這一點。
我還發現,當您吸收或提取時,在開發/測試期間交錯/去交錯整個狀態會更容易,因為您可以查看狀態工作變數的中間值並與參考實現進行比較。