MISTY1介绍
Misty1是一个分组密码算法,由在三菱工作的Eisaku Takeda提交给NESSIE,于1996年公布。它的密钥长度是128位,明文长度是64位,适用于资源紧张的环境。整个算法由递归等组成,每一个层次的结构采用稳妥的Feistel结构。MISTY1是一种迭代密码,可以迭代超过8轮,或者更普遍的是迭代4回。它用128位密钥对64位数据进行不确定轮回的加密,采用了两个S-盒,其中一个是7×7的S-盒,s7,另一个是9×9的S-盒,s9。Misty1取得了良好的阻力线和鉴别攻击,并且使能实行以相对较少的逻辑组件中执行函数的程度相对较低。
MISTY1算法是一种迭代密码,用128位密钥对64位数据进行不确定轮回的加密。它采用了经证实可以抵抗密码微分分析和线性分析的安全理论,在设计时就考虑到了在硬件环境和软件环境下都比较高的加密速度。算法可以分为两部分,一部分是密钥的产生部分,另一部分是数据随机化部分。密钥产生部分根据128位的输入密钥,产生128位的扩展密钥。数据随机化部分输入64位的数据进行混合,也就是所谓的加密。
密钥产生
K为输入密钥,K’为扩展密钥,K和K’都是128位,扩展密钥是由函数FI从K,1,… K,8中产生,并存储在K,9,…, K,16中。Ki代表K的一个元素,1≤i≤8,每个的长度为16位;然后Ki被认为作输入到FI,Ki+1作为FI模的密钥。FI模的输出是16位的K,i, 1≤i≤8,K9=K1
K=K1‖K2‖K3‖K4‖K5‖K6‖K7‖K8
for i=1 to 8 do
K,i=FI(Ki,Ki+1)
K,= K,1‖K,2‖K,3‖K,4‖K,5‖K,6‖K,7‖K,8
数据随机化
MISTY1算法采用了两个S盒,S7和S9。函数FO调用函数FI,而密钥扩展部分也使用函数FI。FI函数采用了稳妥的Feistel结构,它的输入是32位,输出也是32位。其中,S7是一个7×7的S盒,而S9是一个9×9的S盒。这两个S盒都被证明具有较好的阻力线和鉴别攻击能力,可以有效地保护数据安全。函数FL和函数FO是用来混合数据的,其中函数FL采用线性变换,而函数FO则采用非线性变换。这些函数的设计都旨在提高MISTY1算法的安全性和效率。
函数
FI函数将16位输入分为两部分L0和R0
FI的输入为:
X16= L0‖R0
KIij=KIijL‖KIijR
FI则定义为:
R1=S9[L0]∧(00b‖R0)
L1=R0
R2=S7[L1] ∧(truncate(R1))KIijL
R3=S9[L2] ∧(00b‖R2)
L3=R2
Y16=L3‖R3
FI函数程序代码:
public int FI(int x,int KI)//FI函数
{
int L1,L2,L3,R1,R2,R3;
R1=S9[((x>>7)&0x1FF)]^(x&0x007F);
L1=x&0x7F;
R2=S7[L1]^(R1&0x7F)^((KI>>9)&0x7F);
L2=R1^(KI&0x1FF);
R3=S9[L2]^R2;
L3=R2;
return (L3<<9)|R3;
}
FO函数将32位的输入X32分为两个16位的L0和R0
FO的输入为:
X32=L0‖R0
KOi= KOi1‖KOi2‖KOi3‖KOi4
KIi= KIi1‖KIi2‖KIi3
FO的功能能表现为:
for i=1 to 3 do:
Rj=FI(Lj-1∧KOij,KIij) ∧Rj-1
Lj=Rj-1
Y32=(L3∧KOi4)R3
FO函数程序代码:
public long FO(long x,int y,int z)//FO函数
{
int i;
int KOS[]= new int[4];
int KIS[]= new int[3];
System.arraycopy(KO,y,KOS,0,KOS.length);
System.arraycopy(KI,z,KIS,0,KIS.length);
int L1,L2,L3,R1,R2,R3;
R1=FI((KO[0]^((int)(x>>16)&0xFFFF)),KI[0])^((int)(x&0xFFFF));
L1=(int)(x&0xFFFF);
R2=FI((L1^KO[1]),KI[1])^R1;
L2=R1;
R3=FI((L2^KO[2]),KI[2])^R2;
L3=R2^KO[3];
return (((long)L3)<<16)|((long)R3);
}
Misty1算法的实现
加密
Misty1是一个分组密码算法,使用128位密钥对64位明文进行加密。加密过程中,首先将明文输入P分为两部分,分别为32位的L0和R0。在第一轮和之后的每两轮中,左边和右边的两部分Li-1和Ri-1分别与KL和KLi通过FL函数产生32位的输出。在每一轮中,左边部分调用FO函数,接受32位输入和48位密钥KLi以及64位的密钥KOi,产生32位的输出。这个输出是右边部分的新一部分。在每一轮后,左边部分和右边部分相互交换,以更新Li和Ri。经过8次轮回后,最后一次调用KL函数得到左部和右部,然后再作最后的重组得出左边和右边,即Ln+1和Rn+1,最终产生64位的输出C64。其中n是轮回的次数(一般为8)。
解密
解密函数运行与加密运行完全相同,只需要改变两项:
(1)FL-1函数取代所有的FL函数;
(2)命令中的子密钥的应用都扭转。
有问题欢迎私信或留言沟通。