毕业设计Java基于Misty1算法的加密软件的实现

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=KIijLKIijR
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= KOi1KOi2KOi3KOi4
KIi= KIi1KIi2KIi3
FO的功能能表现为:
for i=1 to 3 do:
Rj=FI(Lj-1KOij,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)命令中的子密钥的应用都扭转。

点击免费下载源码

有问题欢迎私信或留言沟通。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

互联小助手

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值