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盒如下: