蛇塊密碼:S0 到 S7 功能不清楚
我目前正在按照規範在 C++ 中實現蛇形分組密碼。值得一提的是,我正在以位片模式實現密碼。您將需要Serpent 的完整送出包,其中包含算法規範以及 C 和 Java 的原始碼。
讓我們從論文第 6 頁和第 7 頁的關鍵調度算法開始。你會看到的 $ {k_0 , k_1 , k_2 , k_3} = S3(w_0 , w_1 , w_2 , w_3) $ 以及 k 的以下等式。 $ S_i $ 是一個 S-Box $ i = 0,\ldots, 7 $ . 請注意,這些 S-Box 將 4 個 32 位整數作為輸入參數並返回 4 個 32 位整數。這讓我很困惑,因為在第 3 頁,他們寫道,這些 S-Box 將 4 位整數作為輸入參數並返回一個 4 位整數。
如果有人可以幫助我理解那些 S-Box,將不勝感激。我需要知道如何使用第 21 頁(A.5)中提到的那些來建構它們。
另外,在包中給出的 serpentsboxes.h 文件中,我看到了以下程式碼:
/* S0: 3 8 15 1 10 6 5 11 14 13 4 2 7 0 9 12 */ /* depth = 5,7,4,2, Total gates=18 */ #define RND00(a,b,c,d,w,x,y,z) \ { register unsigned long t02, t03, t05, t06, t07, t08, t09, t11, t12, t13, t14, t15, t17, t01;\ t01 = b ^ c ; \ t02 = a | d ; \ t03 = a ^ b ; \ z = t02 ^ t01; \ t05 = c | z ; \ t06 = a ^ d ; \ t07 = b | c ; \ t08 = d & t05; \ t09 = t03 & t07; \ y = t09 ^ t08; \ t11 = t09 & y ; \ t12 = c ^ d ; \ t13 = t07 ^ t11; \ t14 = b & t06; \ t15 = t06 ^ t13; \ w = ~ t15; \ t17 = w ^ t14; \ x = t12 ^ t17; }
這裡,w,x,y,z 是輸出,a,b,c,d 是輸入整數。如果我很好理解,RND00函式相當於 $ S_0 $ . 如果這是真的,他們是如何讓該程式碼工作的?
像這樣定義 16 個函式會使程式碼變長,而且不是很容易理解。是否有另一種方法可以使用更清晰的指令對這些功能進行編碼,就像本文中解釋的那樣?
另一個問題:在性能和實用性方面,bitslice 模式和非 bitslice 模式有什麼區別?為什麼一個人會更喜歡一個而不是另一個?
如您所見,我真的不想複製程式碼。我的目標是理解密碼的每一步,並編寫我自己的可讀程式碼(在 C++11 中優化),以便於理解和遵循。
將 4 個 32 位整數帶入輪函式的原因是因為它是位切片實現。
它將 32 個 4 位 sbox 位分割成 4 個 32 位輸入,並對字使用標準邏輯運算來完成工作。您發布的 sbox 不是 Osvik 生成的,但他為 Serpent 的 32 位實現生成了一組優化的 blitsliced sbox。他的 sbox 只使用 5 個寄存器,即使它們使用更多的邏輯操作也更快,因為不需要將數據移出記憶體。我建議使用他的 sboxes,除非現在有更好的。Osvik 的 sbox 在現代處理器上通常快 25%,而在舊處理器上則快得多。
非位片模式在軟體中會非常慢,除非它是在 8 位 cpu 上。