Block-Cipher

蛇塊密碼:S0 到 S7 功能不清楚

  • January 8, 2019

我目前正在按照規範在 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 上。

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