1.16 MacGuffin加密算法
MacGuffin是由美國的Matt Blaze和Bruce Schneier在1994年劍橋快速軟件密碼會議上提出的一個分組密碼,它采用非平衡Feistel結構。MacGuffin加密算法在分組長度、應用范圍和加密框架方面都與DES加密算法非常類似,它的輸入分組長度為64比特,密鑰長度為128比特,迭代層數為32層(從理論上講,密鑰長度和迭代層數可以任意變化)。Matt Blaze和Bruce Schneier設計該算法的主要目的是希望密碼分析人員對使用非平衡Feistel結構的密碼非線性函數的強度進行分析,同時也希望它成為DES加密算法的替代品。
算法描述如下:
將64比特的輸入分成左右不等的兩部分,左邊L0為16比特,右邊R0為48比特,將右邊的48個比特從左到右分成a、b、c三個16比特的字,與48比特的層密鑰進行模2加,經過8個S盒后輸出的16比特與左邊的16比特進行模2加,模2加的結果(16比特)輸入右邊的右端,左邊移出的16比特成為下一層的左邊。
該算法的非線性部分是8個S盒,每個S盒的輸入為6比特,輸出為2比特。S盒的輸入是從右邊48比特中固定位置選出的6比特。令r15代表r的最高有效比特,r0代表r的最低比特。MacGuffin加密算法的S盒如表1.16.1所示。
表1.16.1 MacGuffin加密算法的S盒

從每個S盒的a、b、c三部分中各取2比特合在一起作為輸入,8個S盒各自輸出的2比特,按表1.16.2所示的位置組成一個16比特的字t,其中t0為t的最低比特,t15為最高比特。
表1.16.2 MacGuffin加密算法S盒的輸出表

MacGuffin加密算法的加密過程偽代碼如下:
left, a, b, c ← I for i=0 to 31 do { for j=1 to 8 do t<=Sj(a⊕K[i,0], b⊕K[i,1], c⊕K[i,2]) left ← left⊕t left, a, b, c ← a, b, c, left } O ← left, a, b, c
和DES加密算法不同,MacGuffin加密算法的層密鑰不是由初始密鑰直接移位和抽取得到的,而是以初始密鑰為輸入,經MacGuffin加密算法反復加密,以輸出的結果作為層密鑰的。32個層密鑰都為48比特,將第i個層密鑰記成3個16比特字K[i,0]、K[i,1]、K[i,2]。生成層密鑰過程的偽代碼如下:
K=0 left, a, b, c ← k0...k63 for h=0 to 31 do { for i=0 to 31 do { for j=1 to 8 do t<=Sj(a⊕K[i,0], b⊕K[i,1], c⊕K[i,2]) left ← left⊕t left, a, b, c ← a, b, c, left } K[h,0] ← left K[h,1] ← a K[h,2] ← b } left, a, b, c ← k64...k127 for h=0 to 31 do { for i=0 to 31 do { for j=1 to 8 do t<=Sj(a⊕K[i,0], b⊕K[i,1], c⊕K[i,2]) left ← left⊕t left, a, b, c ← a, b, c, left } K[h,0] ← K[h,0]⊕left K[h,1] ← K[h,1]⊕a K[h,2] ← K[h,2]⊕b }
上述偽代碼中,“←”表示賦值;K[i, j]表示第i個層密鑰的第j個16比特,“<=”表示合并且賦值。
8個S盒如下:
