下载
加入VIP
  • 专属下载特权
  • 现金文档折扣购买
  • VIP免费专区
  • 千万文档免费下载

上传资料

关闭

关闭

关闭

封号提示

内容

首页 Java课程设计(论文)-加密和解密

Java课程设计(论文)-加密和解密.doc

Java课程设计(论文)-加密和解密

听説马尔星球在下雨
2017-10-17 0人阅读 举报 0 0 暂无简介

简介:本文档为《Java课程设计(论文)-加密和解密doc》,可适用于综合领域

Java课程设计(论文)加密和解密课程设计(论文)任务书软件学院软件工程专业班一、课程设计(论文)题目加密与解密二、课程设计(论文)工作自年月日起至年月日止。三、课程设计(论文)地点:四、课程设计(论文)内容要求:(本课程设计的目的()使学生巩固和提高Java编程技术()培养学生掌握程序设计的基本思路和方法()加强学生研发、调试程序的能力()培养学生分析、解决问题的能力()提高学生的科技论文写作能力。(课程设计的任务及要求)任务:()设计GUI界面的Hannoi塔用户可以通过拖动鼠标移动各个塔上的盘子程序也可以自动演示盘子的移动过程。()有三个表示塔的对象分别命名为A、B和C。A塔上有若干个盘子盘子的大小不等并按着大小顺序依次摆放在A塔上大盘在下小盘在上。用户可以用鼠标拖动盘子把A塔上的盘子全部移动到另外两个塔中的任何一个塔上。要求每次只能移动一个盘子在任何时候不允许大盘压在小盘的上面。()用户也可以选择让程序自动演示。选择自动演示后程序将以动画形式演示把A塔上的盘子全部移到C塔的过程并将移动过程以文本形式显示在一个文本区中。)创新要求:在基本要求达到后可进行创新设计增加功能和游戏趣味性。)课程设计论文编写要求()课程设计任务及要求()需求分析()设计思路工作原理、功能规划()详细设计数据分析、算法思路、类设计、功能实现(含程序流程图、主要代码及注释)、界面等。()运行调试与分析讨论给出运行屏幕截图分析运行结果有何改进想法等。()设计体会与小结设计遇到的问题及解决办法通过设计学到了哪些新知识巩固了哪些知识有哪些提高。()参考文献(必须按标准格式列出可参考教材后面的参考文献格式)()报告按规定排版打印要求装订平整否则要求返工()课设报告的装订顺序如下:封面任务书中文摘要目录正文附录(代码及相关图片)()严禁抄袭如有发现按不及格处理。)答辩与评分标准:()考勤:分()程序检查:分()答辩回答问题:分()课程设计报告:分)参考文献:()《Java语言程序设计教程》邱桃荣机械工业出版社()《Java程序设计试验指导》陈轶姚晓昆清华大学出版社)课程设计进度安排内容天数地点构思及收集资料图书馆编码与调试实验室撰写论文图书馆、实验室学生签名:年月日课程设计(论文)评审意见()考勤(分):优()、良()、中()、一般()、差()()程序检查(分):优()、良()、中()、一般(),,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,S:,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,S:,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,S:,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,在此以S为例说明其功能我们可以看到:在S中共有行数据命名为、、行每行有列命名为、、、、列。现设输入为:D,DDDDDD令:列,DDDD行,DD然后在S表中查得对应的数以位二进制表示此即为选择函数S的输出。()子密钥Ki(b)的生成算法开始由于不考虑每个字节的第位DES的密钥从位变为位如表所示首先位密钥被分成两个部分每部分位然后根据轮数两部分分别循环左移l或位。表密钥置换DES算法规定其中第„位是奇偶校验位不参与DES运算。故Key实际可用位数只有位。即:经过密钥置换表的变换后Key的位数由位变成了位此位分为CD两部分各位然后分别进行第一次循环左移得到CD将C(位)D(位)合并得到位再经过压缩置换从而便得到了密钥K(位)。依次类推便可得到KK„K。需要注意的是次循环左移对应的左移位数要依据表所示的规则进行。表循环左移位数轮位数以上介绍了DES算法的加密过程。DES算法的解密过程是一样的区别仅在于第一次迭代时用子密钥K第二次是K„最后一次用K算法本身并没有任何变化。二、概要设计抽象数据类型的定义程序所需要引入的包:importjavaawt*包含用于创建用户界面和绘制图形图像的所有类。importjavaawtevent*提供处理由AWT组件所激发的各类事件的接口和类。importjavaxswing*提供一组“轻量级”(全部是Java语言)组件尽量让这些组件在所有平台上的工作方式都相同。importjavaio*通过数据流、序列化和文件系统提供系统输入和输出。importjavasecurity*为安全框架提供类和接口。importjavaxcrypto*为cryptographic(加密)操作提供类和接口。importjavaxcryptospec*为密钥规范和算法参数规范提供类和接口。其他定义:newFlowLayout()对文件加密器对话框采用FlowLayout管理器。newActionListener()对文件的加密和解密设置事件监听器。bytebytK、bytebytK、bytebytK密钥分三部分采用字节数组保存数据。主程序流程开始弹出文件加密器对话框输入文件路径和密钥加密或解密是否密钥长度等于,文件是否已解密加密否加密生成机密文件生成解密文件结束图主程序流程图各程序模块之间的层次(调用)关系模块定义主函数模块:生成加密器框体获取数据的输入调用加密或解密函数。加密模块:判断密钥是否合法和文件是否已加密启动加密操作显示操作结果并在与源文件同一文件夹下生成密文。加密操作模块:用DES方法加密输入的字节并返回。解密模块:判断密钥是否合法启动解密操作显示操作结果并在指定的文件路径下生成明文。解密操作模块:用DES方法解密输入的字节并返回。转换模块:转换模块一:输入密码的字符形式返回字节数组形式。转换模块二:计算一个进制字符的进制值。文件选择模块:选择需要加密或解密的文件。密码生成模块:随机生成或用获得的密钥用DES算法对密钥进行操作。层次(调用)关系文件加密器模块文件选择模块密码生成模块解密模块加密模块转换模块一加密操作模块解密操作模块转换模块二图层次(调用)关系三、详细设计主函数模块代码实现:publicclassFileEncrypterextendsJFrame{FileEncrypter继承JFrame类publicstaticfinalintWIDTH=定义不可变的宽度值为publicstaticfinalintHEIGHT=定义不可变的高度值为publicstaticvoidmain(Stringargs){新建一个可见的框体FileEncrypterfe=newFileEncrypter()feshow()}FileEncrypter(){thissetSize(WIDTH,HEIGHT)thissetDefaultCloseOperation(JFrameEXITONCLOSE)thissetResizable(false)Toolkittk=ToolkitgetDefaultToolkit()DimensionscreenSize=tkgetScreenSize()thissetLocation((screenSizewidthWIDTH),(screenSizeheightHEIGHT))thissetTitle("文件加密器(TirDES)")以上设置新建框体的标题框体的宽度和高度关闭时的操作框体大小不可变框体在屏幕上显示的位置。Containerc=thisgetContentPane()创建容器ccsetLayout(newFlowLayout())c采用FlowLayout布局管理finalFilePanelfp=newFilePanel("文件选择")cadd(fp)添加名为“文件选择”面板finalKeyPanelpp=newKeyPanel("密码")cadd(pp)添加名为“密码”面板JButtonjbE=newJButton("加密")cadd(jbE)添加加密按钮jbEaddActionListener(newActionListener(){设置加密监听器publicvoidactionPerformed(ActionEventevent){Filefile=newFile(fpgetFileName())if(fileexists())encrypt(filegetAbsoluteFile(),ppgetKey())elseJOptionPaneshowMessageDialog(,"请选择文件~","提示",JOptionPaneOKOPTION)}})JButtonjbD=newJButton("解密")cadd(jbD)添加解密按钮jbDaddActionListener(newActionListener(){设置解密监听器publicvoidactionPerformed(ActionEventevent){Filefile=newFile(fpgetFileName())if(fileexists())decrypt(filegetAbsoluteFile(),ppgetKey())elseJOptionPaneshowMessageDialog(,"请选择文件~","提示",JOptionPaneOKOPTION)}})}加密模块入口参数:指定的文件和密钥出口值:文件已加密提示“文件已加密~”加密成功提示“加密成功!”并输出加密后的密文密码长度不等于提示“密码长度必须等于~”抛出异常。代码实现:privatevoidencrypt(FilefileIn,StringsKey){try{if(sKeylength()==){密钥长度等于成立bytebytK=getKeyByStr(sKeysubstring(,))密钥前位返回的字节数组保存到数组bytKbytebytK=getKeyByStr(sKeysubstring(,))密钥中位返回的字节数组保存到数组bytKbytebytK=getKeyByStr(sKeysubstring(,))密钥后位返回的字节数组保存到数组bytKStringstrPath=fileIngetPath()if(strPathsubstring(strPathlength())toLowerCase()equals("tdes")){判断文件是否已加密加密则输出信息并返回JOptionPaneshowMessageDialog(this,"该文件已加密~","提示",JOptionPaneOKOPTION)return}else{FileInputStreamfis=newFileInputStream(fileIn)bytebytIn=newbyte(int)fileInlength()for(inti=i<fileInlength()i){bytIni=(byte)fisread()}加密bytebytOut=encryptByDES(encryptByDES(encryptByDES(bytIn,bytK),bytK),bytK)反复调用加密操作模块StringfileOut=fileIngetPath()"tdes"文件名后上“tdes”作为密文的标记。FileOutputStreamfos=newFileOutputStream(fileOut)for(inti=i<bytOutlengthi){foswrite((int)bytOuti)}fosclose()输出密文JOptionPaneshowMessageDialog(this,"加密成功~","提示",JOptionPaneOKOPTION)给出“加密成功”信息}}elseJOptionPaneshowMessageDialog(this,"密码长度必须等于~","错误信息",JOptionPaneERRORMESSAGE)给出“密码长度必须等于”信息}catch(Exceptione){异常处理操作eprintStackTrace()}}加密操作模块入口参数:字节数组出口值:经DES算法加密过的字节数组代码实现:privatebyteencryptByDES(bytebytP,bytebytKey)throwsException{DESKeySpecdesKS=newDESKeySpec(bytKey)新建一个DESKeySpec对象bytKey位密钥SecretKeyFactoryskf=SecretKeyFactorygetInstance("DES")用秘密密钥工厂生成DES密钥规范。SecretKeysk=skfgenerateSecret(desKS)根据密钥规范生成密钥Ciphercip=CiphergetInstance("DES")生成一个DES转换的Cipher对象cipinit(CipherENCRYPTMODE,sk)用密钥和加密模式初始化cipreturncipdoFinal(bytP)}解密模块入口参数:指定文件路径和密钥出口值:不是密文提示“不是合法的加密文件~”解密成功提示“解密成功”并按指定路径给出解密明文密码长度不等于提示“密码长度必须等于~”密码错误异常处理提示“解密失败请核对密码!”代码实现:privatevoiddecrypt(FilefileIn,StringsKey){try{if(sKeylength()==){密钥长度等于成立StringstrPath=fileIngetPath()if(strPathsubstring(strPathlength())toLowerCase()equals("tdes"))strPath=strPathsubstring(,strPathlength())判断指定文件是否是密文不是则返回else{JOptionPaneshowMessageDialog(this,"不是合法的加密文件~","提示",JOptionPaneOKOPTION)return}JFileChooserchooser=newJFileChooser()choosersetCurrentDirectory(newFile(""))choosersetSelectedFile(newFile(strPath))用户指定要保存的文件intret=choosershowSaveDialog(this)if(ret==JFileChooserAPPROVEOPTION){bytebytK=getKeyByStr(sKeysubstring(,))bytebytK=getKeyByStr(sKeysubstring(,))bytebytK=getKeyByStr(sKeysubstring(,))FileInputStreamfis=newFileInputStream(fileIn)bytebytIn=newbyte(int)fileInlength()for(inti=i<fileInlength()i){bytIni=(byte)fisread()}解密bytebytOut=decryptByDES(decryptByDES(decryptByDES(bytIn,bytK),bytK),bytK)反复调用加密操作模块FilefileOut=choosergetSelectedFile()fileOutcreateNewFile()FileOutputStreamfos=newFileOutputStream(fileOut)for(inti=i<bytOutlengthi){foswrite((int)bytOuti)}fosclose()按指定路径输出明文JOptionPaneshowMessageDialog(this,"解密成功~","提示",JOptionPaneOKOPTION)}}elseJOptionPaneshowMessageDialog(this,"密码长度必须等于~","错误信息",JOptionPaneERRORMESSAGE)}catch(Exceptione){JOptionPaneshowMessageDialog(this,"解密失败请核对密码~","提示",JOptionPaneOKOPTION)异常处理}}解密操作模块入口参数:字节数组出口值:经DES算法解密过的字节数组代码实现:privatebytedecryptByDES(bytebytE,bytebytKey)throwsException{DESKeySpecdesKS=newDESKeySpec(bytKey)SecretKeyFactoryskf=SecretKeyFactorygetInstance("DES")SecretKeysk=skfgenerateSecret(desKS)Ciphercip=CiphergetInstance("DES")cipinit(CipherDECRYPTMODE,sk)用密钥和解密模式初始话cipreturncipdoFinal(bytE)}转换模块转换模块一入口参数:密码的字符形式出口值:字节数组形式代码实现:privatebytegetKeyByStr(Stringstr){bytebRet=newbytestrlength()新建字节数组长度为字符串的一半for(inti=i<strlength()i){Integeritg=newInteger(*getChrInt(strcharAt(*i))getChrInt(strcharAt(*i)))从位开始偶数位转换为进制乘加上奇数为转换为进制所得的值复给itgbReti=itgbyteValue()}returnbRet}转换模块二入口参数:单个字符出口值:字符从进制转换成的进制数代码实现:privateintgetChrInt(charchr){intiRet=初值为if(chr==""charAt())iRet=if(chr==""charAt())iRet=if(chr==""charAt())iRet=if(chr==""charAt())iRet=if(chr==""charAt())iRet=if(chr==""charAt())iRet=if(chr==""charAt())iRet=if(chr==""charAt())iRet=if(chr==""charAt())iRet=if(chr==""charAt())iRet=if(chr=="A"charAt())iRet=if(chr=="B"charAt())iRet=if(chr=="C"charAt())iRet=if(chr=="D"charAt())iRet=if(chr=="E"charAt())iRet=if(chr=="F"charAt())iRet=returniRet}}文件选择模块出口值:被选文件的路径代码实现:classFilePanelextendsJPanel{FilePanel(Stringstr){JLabellabel=newJLabel(str)JTextFieldfileText=newJTextField()JButtonchooseButton=newJButton("浏览")thisadd(label)thisadd(fileText)thisadd(chooseButton)clickActionca=newclickAction(this)chooseButtonaddActionListener(ca)在面板加入文本框“浏览”按钮设置按钮监听器}publicStringgetFileName(){容器中第一个组件为文本框JTextFieldjtf=(JTextField)thisgetComponent()returnjtfgetText()}privateclassclickActionimplementsActionListener{由类实现接口clickAction(Componentc){cmpt=c}publicvoidactionPerformed(ActionEventevent){触发执行操作JFileChooserchooser=newJFileChooser()choosersetCurrentDirectory(newFile(""))intret=choosershowOpenDialog(cmpt)if(ret==JFileChooserAPPROVEOPTION){JPaneljp=(JPanel)cmptJTextFieldjtf=(JTextField)jpgetComponent()jtfsetText(choosergetSelectedFile()getPath())弹出文件选择框选择文件返回当前文件的路径}}privateComponentcmpt}}密码生成模块classKeyPanelextendsJPanel{KeyPanel(Stringstr){JLabellabel=newJLabel(str)JTextFieldfileText=newJTextField()JButtonchooseButton=newJButton("随机产生")thisadd(label)thisadd(fileText)thisadd(chooseButton)clickActionca=newclickAction(this)chooseButtonaddActionListener(ca)}返回生成的密码(个字符长度)publicStringgetKey(){JTextFieldjtf=(JTextField)thisgetComponent()returnjtfgetText()}privateclassclickActionimplementsActionListener{clickAction(Componentc){cmpt=c}publicvoidactionPerformed(ActionEventevent){try{KeyGeneratorkg=KeyGeneratorgetInstance("DES")按DES密钥规范生成密钥生成器kginit()初始化密钥长度为Keyke=kggenerateKey()bytebytK=kegetEncoded()ke=kggenerateKey()bytebytK=kegetEncoded()ke=kggenerateKey()bytebytK=kegetEncoded()JPaneljp=(JPanel)cmptJTextFieldjtf=(JTextField)jpgetComponent()jtfsetText(getByteStr(bytK)getByteStr(bytK)getByteStr(bytK))}catch(Exceptione){异常处理eprintStackTrace()}}privateStringgetByteStr(bytebyt){将密码转换为进制StringstrRet=""for(inti=i<bytlengthi){strRet=getHexValue((byti))strRet=getHexValue(byti)}returnstrRet}privateStringgetHexValue(ints){转换为进制字符形式StringsRet=switch(s){case:sRet=""breakcase:sRet=""breakcase:sRet=""breakcase:sRet=""breakcase:sRet=""breakcase:sRet=""breakcase:sRet=""breakcase:sRet=""breakcase:sRet=""breakcase:sRet=""breakcase:sRet="A"breakcase:sRet="B"breakcase:sRet="C"breakcase:sRet="D"breakcase:sRet="E"breakcase:sRet="F"}returnsRet}privateComponentcmpt}}四、调试分析调试过程中遇到的问题问题一:怎样判断一个文件是已经加密了的文件。问题描述:在对文件加密之后要怎样来判断这个文件是已经加密了的不需要再进行加密操作了。解决办法是:在生成的加密文件名后加一个“tdes”扩展名StringfileOut=fileIngetPath()"tdes"在要对选中文件进行加密时先判断文件名的后为是不是“tdes”,是就表示这个文件是已经加密了的if(strPathsubstring(strPathlength())toLowerCase()equals("tdes")){JOptionPaneshowMessageDialog(this,"该文件已加密~","提示",JOptionPaneOKOPTION)return}问题二:DES算法设计问题描述:要将DES算法编写成程序步骤繁琐且复杂非常容易出错。解决方法:在Java帮组文档中发现有一个秘密密钥工厂类SecretKeyFactory得知Java本身就可以进行DES算法操作所以调用这个类对密钥进行操作可以省去很多步骤。DESKeySpecdesKS=newDESKeySpec(bytKey)SecretKeyFactoryskf=SecretKeyFactorygetInstance("DES")SecretKeysk=skfgenerateSecret(desKS)Ciphercip=CiphergetInstance("DES")cipinit(CipherENCRYPTMODE,sk)(加密)cipinit(CipherDECRYPTMODE,sk)(解密)对设计与实现的回顾讨论和分析在程序设计之初一直考虑的是如何用语言来实现DES算法发现Java对DES算法支持以后大大减少了工作量可以说用Java语言是程序实现的一个成功之处。Java语言具有简单、安全、可移植、面向对象、健壮、多线程、体系结构中立、解释执行、高性能、分布式和动态等主要特点。我想只有在不断的使用以后菜能体会到在发现Java拥有秘密密钥工厂后更是感受到它的强大。Java帮助文档对于使用Java编程是非常有帮助的对Java语言的了解也更方便。程序利用Java图形界面设计了一个方便用户操作的窗口使得程序运行的时候更想是个封装好的运用程序不过我知道离这个还是有一定距离的界面所能实现的也就几个操作而已。如果程序要再做的强大点可以引入其他的加密算法共用户选择还可以设计成同时对多个文件进行加密。程序的每个模块实现的功能还算完整层次间的调用还是比较清晰的。算法的时空分析程序是直接调用DES算法进行加密所以在程序上是看不到DES算法的时间复杂度和空间复杂度的。所以对算法的时空分析就要根据算法的原理和详述来进行分析。它以位为分组对数据加密,其中有位奇偶校验,有效密钥DES是一个分组加密算法,长度为位。位一组的明文从算法的一端输入,位的密文从另一端输出。DES算法的加密和解密用的是同一算法,它的安全性依赖于所用的密钥。DES对位的明文分组进行操作,通过一个初始置换,将明文分组成左半部分Li和右半部分Ri,各位长。然后进行轮完全相同的运算,数学公式:Li,Ri,Ri=Lif(Ri,Ki),i=…在运算过程中数据与密钥结合。经过轮后,左、右半部分合在一起经过一个逆置换(初始置换的逆置换),完成算法。在每一轮中,密钥进行左位移,然后再从密钥的位中选出位通过一个扩展置换将数据的右半部分扩展成位,并通过一个异或操作与位密钥结合,通过个s盒将这位替代成新的位数据,再将其置换一次。这些运算构成了函数f。然后,通过另一个异或运算,函数f输出与左半部分结合,其结果即成为新的右半部分,原来的右半部分成为新的左半部分。将该操作重复次,实现DES的轮运算。有以上就不难看出虽然算法要进行轮的重复操作但仍可以知道DES算法的时间复杂度为O(n),空间复杂度也为O(n)。经验和体会这次课程设计的要求并不多只要实现加密与解密功能而且只需要采用一种加密算法。但是通过这些我还是学到了很多东西先不说其他的我最起码了解的DES这个加密算法而且以后可以运用到自己想要保密的文件当中去。通过这次课程设计我用JAVA语言实现我这是我对JAVA语言有了根深的了解巩固了以前学到的知识也学习到了新的知识。五、测试结果加密首先在我机器C盘文件夹名为的文件夹离创建一个名为Exampletxt文本文件用做测试。运行程序弹出如图的对话框图运行程序然后进行文件选择和密码输入两者都可以直接输入文件选择还可以点击“浏览”按钮弹出文件选择器进行文件选择如图密码可以点击“随机产生”按钮随机生成。两者都输入好后如图。图选择加密文件点击加密按钮后程序将对文件进行加密给出提示信息(如图)并在同一文件夹下生成带“tdes”扩展名的文件(如图)。图加密文件路径密码输入图加密成功提示信息图生成新的加密文件如果我们所选择的是一个已加密的文件进行加密操作将弹出如图的提示框图对加密文件进行加密提示信息解密解密操作中对文件选择密码输入和加密操作是一样的。将刚刚加密的程序进行解密如图。解密时会弹出文件选择框(如图)这不是要选择文件了这里是要选择文件解密图解密文件路径密码输入后所生成的明文路径。这里将路径选为C盘根目录文件名仍为Exampletxt,结果如图。解密成功给出提示信息如图图选择明文保存路径和文件名图解密成功生成新的文件图解密成功提示信息如果文件选择的不是加密文件则显示错误信息如图。图不是密文提示信息图密码长度不是提示信息如果输入的密码长度不是位则显示信息如图。(加密时显示的信息一样)如果输入的密码是错误的则解密失败显示信息如图图密码不对解密失败六、主要参考资料《Java语言程序设计教程》邱桃荣机械工业出版社《Java程序设计试验指导》陈轶姚晓昆清华大学出版社通过互连网检索相关资料。七、附录程序实现Java源代码importjavaawt*importjavaawtRenderingHintsKeyimportjavaawteventActionEventimportjavaawteventActionListenerimportjavaioFileimportjavaioFileInputStreamimportjavaioFileOutputStreamimportjavaxcryptoCipherimportjavaxcryptoKeyGeneratorimportjavaxcryptoSecretKeyimportjavaxcryptoSecretKeyFactoryimportjavaxcryptospecDESKeySpecimportjavaxswing*publicclassFileEncrypterextendsJFrame{FileEncrypter继承JFrame类publicstaticfinalintWIDTH=定义不可变的宽度值为publicstaticfinalintHEIGHT=定义不可变的高度值为publicstaticvoidmain(Stringargs){新建一个可见的框体FileEncrypterfe=newFileEncrypter()feshow()}FileEncrypter(){thissetSize(WIDTH,HEIGHT)thissetDefaultCloseOperation(JFrameEXITONCLOSE)thissetResizable(false)Toolkittk=ToolkitgetDefaultToolkit()DimensionscreenSize=tkgetScreenSize()thissetLocation((screenSizewidthWIDTH),(screenSizeheightHEIGHT))thissetTitle("文件加密器(TirDES)")以上设置新建框体的标题框体的宽度和高度关闭时的操作框体大小不可变框体在屏幕上显示的位置。Containerc=thisgetContentPane()创建容器ccsetLayout(newFlowLayout())c采用FlowLayout布局管理finalFilePanelfp=newFilePanel("文件选择")cadd(fp)添加名为“文件选择”面板finalKeyPanelpp=newKeyPanel("密码")cadd(pp)添加名为“密码”面板JButtonjbE=newJButton("加密")cadd(jbE)添加加密按钮jbEaddActionListener(newActionListener(){设置加密监听器publicvoidactionPerformed(ActionEventevent){Filefile=newFile(fpgetFileName())if(fileexists())encrypt(filegetAbsoluteFile(),ppgetKey())elseJOptionPaneshowMessageDialog(,"请选择文件~","提示",JOptionPaneOKOPTION)}})JButtonjbD=newJButton("解密")cadd(jbD)添加解密按钮jbDaddActionListener(newActionListener(){设置解密监听器publicvoidactionPerformed(ActionEventevent){Filefile=newFile(fpgetFileName())if(fileexists())decrypt(filegetAbsoluteFile(),ppgetKey())elseJOptionPaneshowMessageDialog(,"请选择文件~","提示",JOptionPaneOKOPTION)}})}*加密*privatevoidencrypt(FilefileIn,StringsKey){try{if(sKeylength()==){密钥长度等于成立bytebytK=getKeyByStr(sKeysubstring(,))密钥前位返回的字节数组保存到数组bytKbytebytK=getKeyByStr(sKeysubstring(,))密钥中位返回的字节数组保存到数组bytKbytebytK=getKeyByStr(sKeysubstring(,))密钥后位返回的字节数组保存到数组bytKStringstrPath=fileIngetPath()if(strPathsubstring(strPathlength())toLowerCase()equals("tdes")){判断文件是否已加密加密则输出信息并返回JOptionPaneshowMessageDialog(this,"该文件已加密~","提示",JOptionPaneOKOPTION)return}else{FileInputStreamfis=newFileInputStream(fileIn)bytebytIn=newbyte(int)fileInlength()for(inti=i<fileInlength()i){bytIni=(byte)fisread()}加密bytebytOut=encryptByDES(encryptByDES(encryptByDES(bytIn,bytK),bytK),bytK)反复调用加密操作模块StringfileOut=fileIngetPath()"tdes"文件名后上“tdes”作为密文的标记。FileOutputStreamfos=newFileOutputStream(fileOut)for(inti=i<bytOutlengthi){foswrite((int)bytOuti)}fosclose()输出密文JOptionPaneshowMessageDialog(this,"加密成功~","提示",JOptionPaneOKOPTION)给出“加密成功”信息}}elseJOptionPaneshowMessageDialog(this,"密码长度必须等于~","错误信息",JOptionPaneERRORMESSAGE)给出“密码长度必须等于”信息}catch(Exceptione){异常处理操作eprintStackTrace()}}*解密*privatevoiddecrypt(FilefileIn,StringsKey){try{if(sKeylength()==){密钥长度等于成立StringstrPath=fileIngetPath()if(strPathsubstring(strPathlength())toLowerCase()equals("tdes"))strPath=strPathsubstring(,strPathlength())判断指定文件是否是密文不是则返回else{JOptionPaneshowMessageDialog(this,"不是合法的加密文件~","提示",JOptionPaneOKOPTION)return}JFileChooserchooser=newJFileChooser()choosersetCurrentDirectory(newFile(""))choosersetSelectedFile(newFile(strPath))用户指定要保存的文件intret=choosershowSaveDialog(this)if(ret==JFileChooserAPPROVEOPTION){bytebytK=getKeyByStr(sKeysubstring(,))bytebytK=getKeyByStr(sKeysubstring(,))bytebytK=getKeyByStr(sKeysubstring(,))FileInputStreamfis=newFileInputStream(fileIn)bytebytIn=newbyte(int)fileInlength()for(inti=i<fileInlength()i){bytIni=(byte)fisread()}解密bytebytOut=decryptByDES(decryptByDES(decryptByDES(bytIn,bytK),bytK),bytK)反复调用加密操作模块FilefileOut=choosergetSelectedFile()fileOutcreateNewFile()FileOutputStreamfos=newFileOutputStream(fileOut)for(inti=i<bytOutlengthi){foswrite((int)bytOuti)}fosclose()按指定路径输出明文JOptionPaneshowMessageDialog(this,"解密成功~","提示",JOptionPaneOKOPTION)}}elseJOptionPaneshowMessageDialog(this,"密码长度必须等于~","错误信息",JOptionPaneERRORMESSAGE)}catch(Exceptione){JOptionPaneshowMessageDialog(this,"解密失败请核对密码~","提示",JOptionPaneOKOPTION)异常处理}}*加密操作*privatebyteencryptByDES(bytebytP,bytebytKey)throwsException{DESKeySpecdesKS=newDESKeySpec(bytKey)新建一个DESKeySpec对象bytKey位密钥SecretKeyFactoryskf=SecretKeyFactorygetInstance("DES")用秘密密钥工厂生成DES密钥规范。SecretKeysk=skfgenerateSecret(desKS)根据密钥规范生成密钥Ciphercip=CiphergetInstance("DES")生成一个DES转换的Cipher对象cipinit(CipherENCRYPTMODE,sk)用密钥和加密模式初始化cipreturncipdoFinal(bytP)}*解密操作*privatebytedecryptByDES(bytebytE,bytebytKey)throwsException{DESKeySpecdesKS=newDESKeySpec(bytKey)SecretKeyFactoryskf=SecretKeyFactorygetInstance("DES")SecretKeysk=skfgenerateSecret(desKS)Ciphercip=CiphergetInstance("DES")cipinit(CipherDECRYPTMODE,sk)用密钥和解密模式初始话cipreturncipdoFinal(bytE)}*字符转换成字节数组*privatebytegetKeyByStr(Stringstr){bytebRet=newbytestrlength()新建字节数组长度为字符串的一半for(inti=i<strlength()i){Integeritg=newInteger(*getChrInt(strcharAt(*i))getChrInt(strcharAt(*i)))从位开始偶数位转换为进制乘加上奇数为转换为进制所得的值复给itgbReti=itgbyteValue()}returnbRet}*进制转换成进制*privateintgetChrInt(charchr){intiRet=初值为if(chr==""charAt())iRet=if(chr==""charAt())iRet=if(chr==""charAt())iRet=if(chr==""charAt())iRet=if(chr==""charAt())iRet=if(chr==""charAt())iRet=if(chr==""charAt())iRet=if(chr==""charAt())iRet=if(chr==""charAt())iRet=if(chr==""charAt())iRet=if(chr=="A"charAt())iRet=if(chr=="B"charAt())iRet=if(chr=="C"charAt())iRet=if(chr=="D"charAt())iRet=if(chr=="E"charAt())iRet=if(chr=="F"charAt())iRet=returniRet}}*文件选择*classFilePanelextendsJPanel{FilePanel(Stringstr){JLabellabel=newJLabel(str)JTextFieldfileText=newJTextField()JButtonchooseButton=newJButton("浏览")thisadd(label)thisadd(fileText)thisadd(chooseButton)clickActionca=newclickAction(this)chooseButtonaddActionListener(ca)在面板加入文本框“浏览”按钮设置按钮监听器}publicStringgetFileName(){容器中第一个组件为文本框JTextFieldjtf=(JTextField)thisgetComponent()returnjtfgetText()}privateclassclickActionimplementsActionListener{由类实现接口clickAction(Componentc){cmpt=c}publicvoidactionPerformed(ActionEventevent){触发执行操作JFileChooserchooser=newJFileChooser()choosersetCurrentDirectory(newFile(""))intret=choosershowOpenDialog(cmpt)if(ret==JFileChooserAPPROVEOPTION){JPaneljp=(JPanel)cmptJTextFieldjtf=(JTextField)jpgetComponent()jtfsetText(choosergetSelectedFile()getPath())弹出文件选择框选择文件返回当前文件的路径}}privateComponentcmpt}}*密码生成*classKeyPanelextendsJPanel{KeyPanel(Stringstr){JLabellabel=newJLabel(str)JTextFieldfileText=newJTextField()JButtonchooseButton=newJButton("随机产生")thisadd(label)thisadd(fileText)thisadd(chooseButton)clickActionca=newclickAction(this)chooseButtonaddActionListener(ca)}返回生成的密码(个字符长度)publicStringgetKey(){JTextFieldjtf=(JTextField)thisgetComponent()returnjtfgetText()}privateclassclickActionimplementsActionListener{clickAction(Componentc){cmpt=c}publicvoidactionPerformed(ActionEventevent){try{KeyGeneratorkg=KeyGeneratorgetInstance("DES")按DES密钥规范生成密钥生成器kginit()初始化密钥长度为SecretKeyke=kggenerateKey()bytebytK=kegetEncoded()ke=kggenerateKey()bytebytK=kegetEncoded()ke=kggenerateKey()bytebytK=kegetEncoded()JPaneljp=(JPanel)cmptJTextFieldjtf=(JTextField)jpgetComponent()jtfsetText(getByteStr(bytK)getByteStr(bytK)getByteStr(bytK))}catch(Exceptione){异常处理eprintStackTrace()}}privateStringgetByteStr(bytebyt){将密码转换为进制StringstrRet=""for(inti=i<bytlengthi){strRet=getHexValue((byti))strRet=getHexValue(byti)}returnstrRet}privateStringgetHexValue(ints){转换为进制字符形式StringsRet=switch(s){case:sRet=""breakcase:sRet=""breakcase:sRet=""breakcase:sRet=""breakcase:sRet=""breakcase:sRet=""breakcase:sRet=""breakcase:sRet=""breakcase:sRet=""breakcase:sRet=""breakcase:sRet="A"breakcase:sRet="B"breakcase:sRet="C"breakcase:sRet="D"breakcase:sRet="E"breakcase:sRet="F"}returnsRet}privateComponentcmpt}

用户评价(0)

关闭

新课改视野下建构高中语文教学实验成果报告(32KB)

抱歉,积分不足下载失败,请稍后再试!

提示

试读已结束,如需要继续阅读或者下载,敬请购买!

文档小程序码

使用微信“扫一扫”扫码寻找文档

1

打开微信

2

扫描小程序码

3

发布寻找信息

4

等待寻找结果

我知道了
评分:

/50

Java课程设计(论文)-加密和解密

VIP

在线
客服

免费
邮箱

爱问共享资料服务号

扫描关注领取更多福利