可乐分享

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 555|回复: 25

基于Misty1算法的加密软件(JAVA)的实现(源代码+论文)

[复制链接]

416

主题

2

回帖

1416

积分

管理员

Rank: 12Rank: 12Rank: 12

积分
1416
发表于 2024-9-18 16:55:00 | 显示全部楼层 |阅读模式
基于Misty1算法的加密软件(Java)的实现
摘  要
随着计算机网络及通信技术的飞速发展,信息安全成了信息社会急需解决的最重要的问题之一,密码技术是保证信息安全的核心技术。本文用JAVA语言开发了一个基于Misty1算法的加密软件,该软件能对文件进行加密和解密。在具体实现时,首先分析了Misty1算法的基本结构,设计出相应的实施方法,正确实现了该算法,其次,设计了一个图形用户界面,最后对软件进行了测试,验证了实现方法的正确性。

关键词:Misty1;Java;加密;解密


The Implementation of Encryption Software (Java) Based on Misty1 Algorithm
Abstract
With the rapid development of computer networks technology and communication technology, Information security has become one of the most important problems urgent to resolve in information society, Cryptographic technology is the core technology to guarantee information security. In this paper, the software of encryption based on Misty1 algorithm is developed by using JAVA language. It can encrypt and decrypt a file. During the process of implementation, the basic structure of the algorithm is analyzed first and the counterpart method is designed, secondly, a GUI is designed, finally, the software is tested, the result shows that method of implementation is right.

Key words: Misty1; Java ; Encryption; Decrypt

目  录
论文总页数:24页
1        引言        1
1.1        课题背景        1
1.2        国内外研究现状        1
1.3        本课题研究的意义        2
1.4        本课题的研究方法        3
2        MISTY1算法描述        3
2.1        秘钥产生部分        3
2.2        数据随机化部分        4
2.3        函数描述        4
2.3.1        FI函数        4
2.3.2        FO函数        5
2.3.3        FL函数        7
2.3.4        FL-1函数        8
3        MISTY1加密软件的设计与实现        9
3.1        工作环境介绍        9
3.2        JAVA及程序编辑工具介绍        9
3.2.1        Java介绍        9
3.2.2        程序编辑工具介绍        10
3.3        MISTY1算法应用于文件加密的分析        12
3.4        MISTY1算法的实现        13
3.4.1        加密        13
3.4.2        解密        15
3.5        设计流程图、图形界面及事件处理        18
3.5.1        加密/解密流程图        18
3.5.2        图形界面        18
3.5.3        处理按钮事件        20
4        程序演示        21
4.1        程序演示        21
4.2        结果及存在的问题        21
结    论        22
参考文献        22
致    谢        23
声    明        24


1        引言
1.1         课题背景
现代密码学是一门迅速发展的应用科学。随着因特网的迅速普及,人们依靠它传送大量的信息,但是这些信息在网络上的传输都是公开的。因此,对于关系到个人利益的信息必须经过加密之后才可以在网上传送,这将离不开现代密码技术。
Misty1算法是在1996年公布的,它是一个分组密码算法,密钥长度是128位,明文长度是64位。它是由在三菱工作的Eisaku Takeda 提交给NESSIE。MISTY1可以在资源紧张的环境下实现。整个算法是由递归等组成,每一个层次的结构又一稳妥的Feistel结构。MISTY1是一迭代密码可以迭代超过8轮,或者更普遍,迭代4回。它用128位密钥对64位数据进行不确定轮回的加密。它采用了两个S -盒,一个7 × 7 S-盒,s7 ,一个9 × 9 S-盒,s9。它取得了良好的良好的阻力线和鉴别攻击,而且还使能实行以相对较少的逻辑组件中执行函数的程度相对较低。
1.2        国内外研究现状
随着我国对计算机的普及,计算机和通信技术已经在我国得到了广泛发展及应用,从而使我们对信息的安全存储、安全处理和安全传输的需要越来越迫切。特别在Internet的应用中,以及个人通信、个人电子身份证、办公自动化,电子邮件、电子自动转帐支付系统和自动零售业务网的建立与实现,信息的安全保护问题已经显得十分突出,而能够解决这一问题的一个有效手段就是使用现代密码技术。
美国早在1977年就制定了本国的数据加密标准,即DES。随着DES的出现,人们对分组密码展开了深入的研究和讨论,已有大量的分组密码,如DES的各种变形、IDEA算法、SAFER系列算法、RC系列算法、Skipjack算法、FEAL系列算法、REDOC系列算法、CAST系列算法Khufu, KhafreMMB, 3-WAY, TEA,            Blowfish,GOST,SQUARE,MISTY,Rijndael算法和AES15种候选算法(第一轮),另有NESSIE17种候选算法(第一轮)等。
目前分组密码所采用的整体结构可分为Feistel结构(例如CAST—256、DEAL、DFC、E2等)、SP网络(例如Safer+、Serpent等)及其他密码结构(例如Frog和HPC)。加解密相似是Feistel型密码的一个实现优点,但它在密码的扩散似乎有些慢,例如需要两轮才能改变输入的每一个比特。SP的网络结构非常清晰,S一般被称为混淆层,主要起混淆作用。P一般被称为扩散层,主要起扩散作用。在明确S和P的某些密码指标后,设计者能估计SP型密码抵抗差分密码分析和线性密码分析的能力。SP网络和Feistel网络相比,可以得到更快速的扩散,但是SP密码的加/解密通常不相似。
目前对分组密码安全的讨论主要包括差分密码分析、线性密码分析和强力攻击等。从理论上讲,差分密码分析和线性密码分析是目前攻击分组密码的最有效的方法,而从实际上说,强力攻击是攻击分组密码最可靠的方法。到目前为止,已有大量文献讨论各种分组密码的安全性,同时推出了譬如截断差分分析、非线性密码分析及插值攻击等多种分析方法。自AES候选算法公布以后,国内外许多专家学者都致力于候选算法的安全分析,预计将会推出一些新的攻击方法,这无疑将进一步推动分组密码的发展。
1.3        本课题研究的意义
标准化是工业社会的一个基本概念,它意味着生产规模化、降低成本、方便维修和更换为了实现非相关团体之间的保密通信,加密体制的标准化是必要的。分组密码由于其固有特点,已经成为标准化进程的首选体制。
信息安全的最大特点之一是自主性,因而其核心技术——密码学的研究与开发应当是一种本土性的科学。对于有些产品,可以通过外方引进来解决由于技术落后而带来的问题。然而对于安全产品,除非能完全确信它在硬件和软件上没有陷门,否则,贸然使用可能带来不可预测的后果。而要做到软硬件上的确认通常是十分困难的。因此,最明智的方法是依靠自己的力量并汲取现有的先进经验进行研究、设计和开发。
为了维护通信安全、打击犯罪,1993年4月,美国政府宣布了一项新的建议,该建议倡导联邦政府和工业界使用新的具有密钥托管功能的联邦加密标准。该建议称为托管加密标准(escrowed encrytion standard,EES),又称C1ipper建议。其目的是为用户提供更好的安全通信方式,同时允许政府机构在必要情况下进行监听。EES系统中嵌入了分组加密算法Sk -ipjack,尽管目前对该系统和算法有许多争议,但从维护国家通信安全的角度,这项建议是有积极意义的。
在区域通信系统中,用户较多,他们的地位、作用都不相同,所流通的信息的重要性也不可能完全相同,因此他们要求得到的安全保护等级也不应该相同。由此可见,研究多安全级密码算法非常必要。迭代分组密码(所谓选代分组密码就是以迭代一个简单的轮函数为基础的密码,即通过选择某个较简单的密码变换,在密钥控制下以迭代方式多次利用它进行加密变换,例如Feistel型密码就是一种选代密码,是分组密码的典型代表,其数学思想简单而灵巧。特别是在相同的轮函数之下,迭代次数的不同即代表了安全强度的不同级别。
在Internet/Intranet中随着通信量和业务种类的增加,对安全认证和保密业务的需求日益迫切。比如,PGP(Pretty Good Privacy)就是一种广泛应用于Internet中E-mail系统的一种安全技术方案,它也可以用于其他网络中。PGP的安全业务包括机密性、认证性、不可抵赖性等,其中的机密性就是利用分组密码算法IDEA来保证的。另外,分组密码的工作模式可提供一些人们所需要的其他密码技术,比如流密码技术和杂凑技术等。
1.4        本课题的研究方法
研究相关资料,理解Misty1算法的原理,并参考学习使用其他编程语言编写的基于此算法的加密软件的代码。深入学习Java编程语言,熟悉其编写程序的流程。然后尝试用Java来实现Misty1算法,能对数据进行加密和解密。对程序进行测试,对测试结果进行分析研究,进而对程序进行改进,对关键算法代码进行尽可能的优化,最终得到一个在windows运行的可以用指定密钥对文件进行MISTY1加密并可解密的完整应用程序。
2        Misty1算法描述
MISTY1算法是用128位密钥对64位数据进行不确定轮回的加密。它在设计时就采用了经证实可以抵抗密码微分分析和线形分析的安全理论,而且它实现了在硬件环境和软件环境下都比较高的加密速度。算法可以分为两部分,一部分是密钥的产生部分,另一部分是数据随机化部分。密钥产生部分根据128位的输入密钥,产生128位的扩展密钥。数据随机化部分输入64位的数据进行混合,也就是所谓的加密。
2.1        秘钥产生部分
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(图2-1)

图2-1 密钥产生

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
2.2        数据随机化部分
数据随机化部分使用了两种函数,FO和FL,函数FO调用函数FI。密钥扩展部分也使用函数FI。FI函数使用两个S盒,S7和S9。
2.3        函数描述
2.3.1        FI函数
FI函数将16位输入分为两部分L0和R0(图2-2)

图2-2 FI函数
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;
  }
2.3.2        FO函数
FO函数将32位的输入X32分为两个16位的L0和R0(图2-3)

图2-3 FO函数
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);
  }

2.3.3        FL函数
函数FL用于加密。它采用32位的输入数据X32,将X32分为两个16位即XL和XR。另外一个是扩展密钥的下标KEY,返回一个32位的数据Y32(图2-4)


图2-4 FL函数

FL的输入为:
X32 = XL‖XR
KLi = KLiL‖KLIr
FL的功能为:
YR = (XL& KLiL) ∧XR
YL = (YR| KLIr) ∧XL
则输出:Y32= YL‖YR

FL函数程序代码:
public long FL(long x,long key)//FL函数
  {
          long XL,XR,KL,KR,YL,YR;
          XL=x>>16;XR=x&0x0000FFFF;
          KL=key>>16;KR=key&0x0000FFFF;
   YR=(XL&KL)^XR;YL=(YR|KR)^XL;
   return (YL<<16)|YR;
  }

2.3.4        FL-1函数
FL-1函数是逆向的FL函数,用于解密。它将32位的输入Y32分为两个16位的YL和YR,与KLi进行计算,返回一个X32(图2-5)


图2-5 FL-1函数

FL-1输入为:
Y32 = YL‖YR
KLi = KLiL‖KLIr
FL-1的功能:
XL = (YR| KLIr) ∧YL
XR = (XL& KLiL) ∧YR
则输出:
X32 = XL‖XR

FL-1函数程序代码:
public long FLINV(long y,long key)//FLINV函数,FL函数的逆
  {
          long XL,XR,KL,KR,YL,YR;
   YL=y>>16;YR=y&0x0000FFFF;
   KL=key>>16;KR=key&0x0000FFFF;
   XL=(YR|KR)^YL;XR=(XL&KL)^YR;
   return (XL<<16)|XR;
  }
3        Misty1加密软件的设计与实现
3.1        工作环境介绍
本设计使用的编程语言为Java,使用Java 2 Platform Standard Edition 5.0。操作系统为Windows XP,CPU为AMP XP 2500+,内存 256M。
3.2        Java及程序编辑工具介绍
3.2.1        Java介绍
Java是1995年5月23日由Sun公司引进到我们这个世界的革命性编程语言,它被美国的著名杂志《PCMagazine》评为1995年是大优秀科技作品。之所以称Java为革命性编程语言,是因为传统的软件往往与具体的实现环境有关,一旦环境有所变化就需要对软件做一番改动,耗时耗力,而Java编写的软件能在执行码上兼容。这样,只要计算机提供了Java解释器,用Java编写的软件就能在其上运行。
Java的优点主要有以下几点:
(1)Write once,run anywhere
这句话一直是Java程序员的精神指南,也是Java之所以能够受到程序设计师们喜爱的原因之一,最大原因就是JVM技术。
(2)简单
纯面向对象的特性,再加上众多类库的支持,使用Java开发各式各样的应用程序,可以说是易如反掌。除此之外,无论在调试或是程序修改、增加新功能方面,因为对象的特性,使得这些维护也变得非常容易。
(3)安全性
Java的很多功能都是针对安全性的问题考虑的,Java甚至可以对于不同的安全需求而Java应用程序的安全等级。原则上一个未经您允许的Java程序,是不可能伤及你的系统的。
(4)Unicode
Java使用Unicode作为他的标准字符,这项特性使得Java的程序在不同语言的平台上都能编写和执行。Java也是目前所有电脑语言中,唯一天生使用Unicode的语言。
(5)网络
Java可以说是借助互联网而重声的,自然对于具备网络功能程序的编写,也是非常容易的。不论是一般互联网的程序Socket、Email,还是服务器网页的程序Servlets、JSP,甚至分布式网络程序CORBA等的相关套件支持,可以说是非常丰富,使用起来也是非常容易。
(6)资源回收处理
资源回收处理是由JVM协助我们的程序对内存做动态的管理,你的程序需要多少内存、那些对象的内存已经不使用了,需要归还给系统,这些烦琐且危险的工作全部交由JVM去帮我们管理,让我们能够更专心的写程序,不需要担心内存的问题,而内存的统一管理,对于跨平台也用相当的帮助。
(7)异常处理
为了使Java程序更安全、更稳定,那么程序随机应变的能力就必须好。Java引入了异常处理机制,能够在程序中比较可能有异常情况发生的地方,加上相对应的处理,让程序不至于因为突发的错误,造成执行中断或是当机的情况。异常处理也让用户更恩能够控制整个程序执行的流程,也使得程序的设计更加严谨。
目前Java的主要应用在于电子商务及企业电子化部分。除此之外,Java也渐渐地在消费性电子平台上发挥它跨平台的特性,各手机厂商、PDA厂商也纷纷地发表内置JVM的系统,Java在这方面跟其他程序语言比起来,可以说是如鱼得水。
未来,除了SUN公司更加强J2EE、J2SE和J2ME中的功能外,Java还会更进一步的结合XML,把现在外挂的XML套件包含进Java标准套件中,那么对于跨平台来说将更是如虎添翼。Java的未来可以说是一片光明。
3.2.2        程序编辑工具介绍
UltraEdit是很多人爱用的文本编辑软件,它除了单纯的文本编辑外,对于一些特殊的文件,例如Java、ASP等等,都会辨别出它们的关键字或是字符串、数字等,然后用不同的颜色表示它们,让你更容易看出程序中有些什么,或是有没有什么关键字输入错了。除此之外它也可以简单地帮你做错字的更正。不过它最强的地方在于能设定一些宏(Macro),让你可以自行设计额外的特殊功能。

图3-1 程序编辑工具UltraEdit
UltraEdit有一项执行外部指令的功能,还可以把执行结果显示出来。好处是可以把DOS模式的结果显示在一个新的文件里,这样一来再多的信息也不怕遗漏了。使用方法很简单,就到菜单栏上选择“高级”→“DOS命令”,快捷键是“F9” 。在“命令”处输入在DOS模式下要输入的编译指令,在“工作目录”处选择程序所在目录。在编写程序的过程中,这个功能就显得十分方便,不用总是要到命令提示符模式下去试运行程序。

图3-2 好用的功能

图3-3 DOS命令执行后界面
3.3         Misty1算法应用于文件加密的分析
Misty1是对称密钥加密,也是分组密码。分组密码是将明文划分为固定度的数据组,然后以组为单位进行加密,分组密码优点是不需同步。实质是,设计一种算法,能在密钥控制下,把n比特明文简单而又迅速地置换成唯一n比特密文,并且这种变换是可逆的(解密)。设计思想:“扩散”将明文及密钥的影响尽可能迅速地散布到较多个输出的密文中(将明文冗余度分散到密文中)。产生扩散的最简单方法是通过“置换” (比如:重新排列字符)。“混淆”其目的在于使作用于明文的密钥和密文之间的关系复杂化,是明文和密文之间、密文和密钥之间的统计相关特性极小化,从而使统计分析攻击不能奏效。通常的方法是“代换(Substitution)”(比如恺撒密码)。分组密码设计的要求:1、分组长度足够大(64~128比特);2、密钥量要足够大(64~128);3、算法足够复杂(包括子密钥产生算法)4、加密、解密算法简单,易软、硬件实现5、便于分析(破译是困难的,但算法却简洁清晰)。所以把Misty1应用于文件加密是可行的。
在对称密码技术中,其加密密钥和解密密钥相同。加密信息的安全性取决于密钥的安全性,与算法的安全性无关,即由密文和加解密算法不可能得到明文。换句话说算法无需保密,需保密的仅是密钥。对于带有重要信息的小型文本和二进制数据的维护,如果不加密,将无法放心的保存在计算机上,尤其是联网的或机房里的公共计算机;如果借助功能强大的大型多用户数据保护程序维护几个小型文件,显得十分烦琐,好比杀鸡用牛刀。  
所以,对于使用小型文件进行数据交换的情况,更好的方案是通过一个小型应用程序对这些文件进行对称密钥加密。为了适合前面叙述的在公共BBS与特定的某人交流重要保密信息的情况,加密生成的数据应该是文本,这样可以方便复制粘贴。
3.4        Misty1算法的实现
3.4.1        加密
64位的明文输入P分为两部份分别为32位L0和R0,在第一轮回和之后的每两个轮回,左边和右边的两部分Li-1和Ri-1分别与KLi通过FL函数产生32位的输出。在每次轮回中的左边部份调用接受32位输入和48位密钥KIi以及64位的密钥KOi的FO函数,产生32位的输出。这种输出是右边部分新的一部分。在每一次轮回中,左边部分和右边部分相互交换给Li和Ri。经过8次轮回最后一次调用KL函数得到左部和右部,然后再作最后的重组左边和右边即Ln+1和Rn+1产生64位输出C64,其中n是轮回的次数(一般为8)。(图3-1)

图3-1 加密

其中加密输入为:
P=L0‖R0
KL={KLi}
KO={KOi}
KI={KIi}
加密函数则是:
for i=1,3,...,n-1;
Ri=FL(Li-1,KLi)
Li=FL(Ri-1,KLi+1)^FO(Ri,KOi,KIi)
Li+1=Ri^FO(Li,KOi+2,KIi+1)
Ri+1=Li
for i=n+1;
Ri=FL(Li-1.KLi)
Li= FL(Ri-1.KLi+1)
最后输出:C=Ln+1‖Rn+1

下面是加密部分代码:
public void Encrypt(char ptext[],char userkey[],char ctext[])
{
long L0,L1,L2,L3,L4,L5,L6,L7,L8,L9;
long R0,R1,R2,R3,R4,R5,R6,R7,R8,R9;
KeySchedule(userkey);
//轮回,加密
L0=(((long)ptext[0])<<24)+(((long)ptext[1])<<16)+(((long)ptext[2])<<8)+((long)ptext[3]);
R0=(((long)ptext[4])<<24)+(((long)ptext[5])<<16)+(((long)ptext[6])<<8)+((long)ptext[7]);
R1=FL(L0,KL[0]);
        L1=FO(R1,0,0)^FL(R0,KL[1]);
        R2=L1;
        L2=FO(R2,4,3)^R1;
        R3=FL(L2,KL[2]);
        L3=FO(R3,8,6)^FL(R2,KL[3]);
        R4=L3;
        L4=FO(R4,12,9)^R3;
        R5=FL(L4,KL[4]);
L5=FO(R5,16,12)^FL(R4,KL[5]);
R6=L5;
L6=FO(R6,20,15)^R5;
R7=FL(L6,KL[6]);
L7=FO(R7,24,18)^FL(R6,KL[7]);
R8=L7;
L8=FO(R8,28,21)^R7;
R9=FL(L8,KL[8]);
L9=FL(R8,KL[9]); //最后一轮
       
ctext[0]=(char)((L9>>24)&0XFF);
ctext[1]=(char)((L9>>16)&0XFF);
ctext[2]=(char)((L9>>8)&0XFF);
ctext[3]=(char)(L9&0XFF);
ctext[4]=(char)((R9>>24)&0XFF);
ctext[5]=(char)((R9>>16)&0XFF);
ctext[6]=(char)((R9>>8)&0XFF);
ctext[7]=(char)(R9&0XFF);
}

3.4.2        解密
解密函数运行与加密运行完全相同,只需要改变两项:
(1)FL-1函数取代所有的FL函数;
(2)命令中的子密钥的应用都扭转。(图3-2)

图3-2 解密
解密部分代码:
public void Decrypt(char ctext[],char userkey[],char ptext[])
{
long L0,L1,L2,L3,L4,L5,L6,L7,L8,L9,
long R0,R1,R2,R3,R4,R5,R6,R7,R8,R9;
KeySchedule(userkey);
        //反顺序轮回,解密
        L9=(((long)ctext[0])<<24)+(((long)ctext[1])<<16)+(((long)ctext[2])<<8)+((long)ctext[3]);
        R9=(((long)ctext[4])<<24)+(((long)ctext[5])<<16)+(((long)ctext[6])<<8)+((long)ctext[7]);
R8=FLINV(L9,KL[9]);
L8=FO(R8,28,21)^FLINV(R9,KL[8]);
R7=L8;
L7=FO(R7,24,18)^R8;
R6=FLINV(L7,KL[7]);
L6=FO(R6,20,15)^FLINV(R7,KL[6]);
R5=L6;
L5=FO(R5,16,12)^R6;
R4=FLINV(L5,KL[5]);
L4=FO(R4,12,9)^FLINV(R5,KL[4]);
R3=L4;
L3=FO(R3,8,6)^R4;
R2=FLINV(L3,KL[3]);
L2=FO(R2,4,3)^FLINV(R3,KL[2]);
R1=L2;
L1=FO(R1,0,0)^R2;
R0=FLINV(L1,KL[1]);
L0=FLINV(R1,KL[0]); //最后一轮
       
ptext[0]=(char)((L0>>24)&0XFF);
ptext[1]=(char)((L0>>16)&0XFF);
ptext[2]=(char)((L0>>8)&0XFF);
ptext[3]=(char)(L0&0XFF);
ptext[4]=(char)((R0>>24)&0XFF);
ptext[5]=(char)((R0>>16)&0XFF);
ptext[6]=(char)((R0>>8)&0XFF);
ptext[7]=(char)(R0&0XFF);
}
3.5        设计流程图、图形界面及事件处理
3.5.1        加密/解密流程图

图3-3 设计流程图

3.5.2        图形界面
Java中有2个重要且常用的容器(Container),一个是Frame,另一个是Panal。本设计的图形界面使用的是Frame。为了使界面一目了然,不至于混淆,往容器添加AWT元件时就需要按一定的方案。Java特别设计了Laout这个机制来解决元件版面配置的问题。Java.awt包中总工提供了五个基本的Layout类,本设计使用的是GridLayout。

图3-4 图形界面
图形界面部分代码:

f = new Frame("Misty1算法");
b1 = new Button("加密");
b2 = new Button("解密");
b1.addActionListener(this);
b2.addActionListener(this);
t1 = new TextField("",20);
t2 = new TextField("",20);
t3 = new TextField("",20);
t4 = new TextField("",20);
Label k1,k2,k3,k4,k5,k6;
k1 = new Label("明文(8字节)");
k2 = new Label("密钥(16字节)");
k3 = new Label("密文(8字节)");
k4 = new Label("解密后的明文(8字节)");
k5 = new Label("");
k6 = new Label("");
f.setLayout(new GridLayout(4,3));
f.add(k1);
f.add(t1);
f.add(k5);
f.add(k2);
f.add(t2);
f.add(b1);
f.add(k3);
f.add(t3);
f.add(b2);
f.add(k4);
f.add(t4);
f.add(k6);
f.pack();
f.setVisible(true);

3.5.3        处理按钮事件
当用户单击按钮时就发生一个事件。对于按钮这个事件源,它有一个事件,就是单击按钮。这个事件源获得监视器的方法是:addActionListener()。     处理该事件的接口是ActionListener,接口中的方法是            actionPerformer(ActionEvent e)。单击按钮事件的类型是ActionEvent类型,即当用户单击按钮后,Java包java.awt.envent中的类ActionEvent自动创建了一个事件对象。
在用户单击按钮后,将用户在文本框中输入的字符串数据转换为数组数据,传入程序对应的数组,然后程序调用函数进行运算,最后把得出的结果转换为字符串数据,输出到指定文本框位置。

按钮事件处理部分代码:
public void actionPerformed(ActionEvent e)//接口实现方法
    {
            函数 hxdx = new 函数();//产生函数对象
            if(e.getSource()==b1)          
       {
               char plaintext1[] = (t1.getText()).toCharArray();
        char key[] = (t2.getText()).toCharArray();
        char ciphertext1[] = new char[8];       
                  hxdx.Encrypt(plaintext1,key,ciphertext1);
                  t3.setText(String.valueOf(ciphertext1));               
             }
            else if(e.getSource()==b2)
             {
                     char key[] = (t2.getText()).toCharArray();
                     char ciphertext1[] = (t3.getText()).toCharArray();
                     char plaintext1[] = new char[8];       
                     hxdx.Decrypt(ciphertext1,key,plaintext1);
                     t4.setText(String.valueOf(plaintext1));
             }
           }
4        程序演示
4.1        程序演示

图4-1 DOS下运行的情况


图4-2 图形界面 加密


图4-3 图形界面 解密
4.2        结果及存在的问题
目前完成了对Misty1算法的代码编写,能够实现用指定密钥对输入数据进行加密并能够解密。但这只是基本工作,还有一些功能有待完善和实现。主要有以下几个方面:
(1)暂时无法实现对文本文档载入进行加密;
(2)加密有些数据可能会出现异常;
(3)部分代码还不够简洁。
希望通过继续学习Java编程技术,找到问题的关键,对程序进一步完善。
结    论
通过较长时间的程序设计和开发,基于MISTY1算法的加密软件系统基本开发完毕。在对MISTY1算法和加密软件的实现过程详细的介绍中,了解到MISTYI算法进行文件加密的优点和算法的实现的大概过程,以及其中各个函数的意义。
本系统以JAVA为开发语言,采用JAVA语言为开发语言是因为它是网络应用方面最广泛使用的语言。在具体实现中,首先实现MISTY1算法的各组成模块,并验证实现的正确性,然后将各模块进行联调,完成整个算法的实现,最后设计一个图形界面。该软件能对文件进行正确的加密和解密。不足之处在于功能比较单一,使用起来不是特别快捷。

参考文献
[1]林德敬,林柏钢,林德清.国内外分组密码理论与技术的研究现状及发展趋势[EB]. http://www.bjx.com.cn/files/wx/tjtxjs/2002-4/1.htm,2004-4。
[2]朱仲杰.Java2全方位学习(J2SE 5.0增修版)[M].北京:机械工业出版社,2006。
[3]耿祥义.张跃平.JAVA2实用教程(修订)[M].北京:清华大学出版社,2001。
[4]叶至军.Java2自学教程[M].北京:人民邮电出版社,2004.10。
[5]宋智平.MISTY1加密算法描述[EB]. http://www.detian.org/rfc/RFC2994.txt,2001.4。
[6]陈鲁生等.现代密码学[M].北京:科学出版社,2002.7。
[7]张仕斌等.网络安全技术[M].北京:清华大学出版社,2004.8。


致    谢

本文是在陈俊老师的热情关心和指导下完成的,他渊博的知识和严谨的治学作风使我受益匪浅,对顺利完成本课题起到了极大的作用。在此向他表示我最衷心的感谢!
在论文完成过程中,本人还得到了其他老师和许多同学的热心帮助,本人向他们表示深深的谢意!
最后向在百忙之中评审本文的各位专家、老师表示衷心的感谢!







作者简介
姓    名:  王文丰                                性别: 男
出生年月:  1984年4月4日                       民族: 汉
E-mail:zkyo1984@sina.com


声    明
本论文的工作是 2007年2月至2007年6月在成都信息工程学院网络工程系完成的。文中除了特别加以标注地方外,不包含他人已经发表或撰写过的研究成果,也不包含为获得成都信息工程学院或其他教学机构的学位或证书而使用过的材料。除非另有说明,本文的工作是原始性工作。

关于学位论文使用权和研究成果知识产权的说明:
本人完全了解成都信息工程学院有关保管使用学位论文的规定,其中包括:
(1)学校有权保管并向有关部门递交学位论文的原件与复印件。
(2)学校可以采用影印、缩印或其他复制方式保存学位论文。
(3)学校可以学术交流为目的复制、赠送和交换学位论文。
(4)学校可允许学位论文被查阅或借阅。
(5)学校可以公布学位论文的全部或部分内容(保密学位论文在解密后遵守此规定)。
除非另有科研合同和其他法律文书的制约,本论文的科研成果属于成都信息工程学院。
特此声明!


                                                   作者签名:     
                                                        年   月   日


基于Misty1算法的加密软件(JAVA)的实现(源代码 论文).rar

265.63 KB, 下载次数: 0

售价: 20 金币  [记录]  [购买]


可乐分享 - 免责声明1、本主题所有言论和图片纯属会员个人意见,与本论坛立场无关
2、本站信息来自网络,版权争议与本站无关
3、本站发布的相关帖子文章仅限用于学习和研究目的,不得将上述内容用于商业或者非法用途,否则,一切后果请用户自负
4、本帖部分内容转载自其它媒体,但并不代表本站赞同其观点和对其真实性负责
5、如本帖侵犯到任何版权问题,请立即告知本站,本站将及时予与删除并致以最深的歉意
6、可乐分享管理员和版主有权不事先通知发贴者而删除本文

回复

使用道具 举报

0

主题

580

回帖

879

积分

高级会员

Rank: 6Rank: 6

积分
879
发表于 2024-9-20 22:54:59 | 显示全部楼层
我的一楼总是献给度娘
回复

使用道具 举报

0

主题

544

回帖

825

积分

高级会员

Rank: 6Rank: 6

积分
825
发表于 2024-9-23 02:01:42 | 显示全部楼层
楼主听话,快到碗里来!
回复

使用道具 举报

0

主题

552

回帖

837

积分

高级会员

Rank: 6Rank: 6

积分
837
发表于 2024-9-24 09:45:03 | 显示全部楼层
如果这就是爱,再转身的时候就该留下
回复

使用道具 举报

0

主题

562

回帖

852

积分

高级会员

Rank: 6Rank: 6

积分
852
发表于 2024-9-25 03:09:03 | 显示全部楼层
楼主听话,快到碗里来!
回复

使用道具 举报

0

主题

630

回帖

954

积分

高级会员

Rank: 6Rank: 6

积分
954
发表于 2024-10-9 01:30:35 | 显示全部楼层
你有没有见过这么整齐的十五字啊
回复

使用道具 举报

0

主题

580

回帖

879

积分

高级会员

Rank: 6Rank: 6

积分
879
发表于 2024-10-11 22:24:34 | 显示全部楼层
可乐分享就是牛keleshare.cn
回复

使用道具 举报

0

主题

540

回帖

819

积分

高级会员

Rank: 6Rank: 6

积分
819
发表于 2024-10-19 15:57:43 | 显示全部楼层
火钳刘明
回复

使用道具 举报

0

主题

594

回帖

900

积分

高级会员

Rank: 6Rank: 6

积分
900
发表于 2024-10-22 22:32:56 | 显示全部楼层
如果这就是爱,再转身的时候就该留下
回复

使用道具 举报

0

主题

522

回帖

792

积分

高级会员

Rank: 6Rank: 6

积分
792
发表于 2024-10-30 00:47:57 | 显示全部楼层
我只是来打酱油的
回复

使用道具 举报

懒得打字嘛,点击右侧快捷回复 【可乐分享www.keleshare.cn】
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|小黑屋|可乐分享,站长交流 ( 苏ICP备2024109924号 )|网站地图

GMT+8, 2025-5-6 23:17 , Processed in 0.125259 second(s), 25 queries .

Powered by 可乐分享

© 2023-2024 keleshare.cn.

快速回复 返回顶部 返回列表