密码算法应用实践
上QQ阅读APP看本书,新人免费读10天
设备和账号都新为新人

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个比特从左到右分成abc三个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盒的abc三部分中各取2比特合在一起作为输入,8个S盒各自输出的2比特,按表1.16.2所示的位置组成一个16比特的字t,其中t0t的最低比特,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(aK[i,0], bK[i,1], cK[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(aK[i,0], bK[i,1], cK[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(aK[i,0], bK[i,1], cK[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盒如下: