JAVA课程设计题目:文件的加密与解密姓名:学号:班级: 日期:目录一、设计思路 (3)二、具体实现 (3)三、运行调试与分析讨论 (8)四、设计体会与小结 (11)五、参考文献 (12)六、附录 (12)一、设计思路自从Java技术出现以业,有关Java平台的安全性用由Java技术发展所引发的安全性问题,引起了越来越多的关注。
目前,Java已经大量应用于各个领域,研究Java的安全性对于更好地利用Java具有深远的意义。
使用Java的安全机制设计和实现安全系统更具有重要的应用价值。
本课程设计,主要实践Java安全中的JCE模块,包括密钥生成,Cipher对象初始化、加密模式、填充模式、底层算法参数传递,也涉及文件读写与对象输入输出流。
二、具体实现本系统通过用户界面接收三个参数:明文文件、密文文件、口令。
采用DES加密算法,密码分组链(Cipher Block Chaining,CBC)加密模式,PKCS#5-Padding的分组填充算法。
因为CBC涉及到底层算法参数的解密密钥的传递,所以将明文文件中的字节块以密封对象(Sealed Object)的方式加密后,用对象流输出到密文文件,这样就将密文、算法参数、解密密钥三都密封到一个对象中了。
口令的hash值作为产生密钥的参数。
设计流程图如下所示:文件加密与解密设计流程图本系统中,包含Default,Shares,SecretKey,EncAndDec四个包共6个类组成。
定义的几个参数:MAX_BUF_SIZE为每次从文件中读取的字节数,也是内存缓冲区的大小;加密算法为DES;加密模式是密码分组链(CBC)模式;分组填充方式是PKCS#5Padding。
包和类结构图如下所示:本课程设计,包和类结构图:以下为包中的类的方法实现说明Package Shares类结构图Package SecretKey类结构图Package EncAndDec类结构图图1 文件加密流程图文件加密与解密窗口类结构图:三、运行调试与分析讨论系统的详细设计代码请查阅附带的代码。
以下仅对各个界面进行截图展示:图2系统主界面图 1 文件加密界面图 2 文件解密界面图 3 待加密文件Plain1.txt图 4 Plain1.txt加密后的文件Cipher.txt图 5 密文文件Cipher.txt解密后的明文文件Plain2.txt运行JA V A程序中,显示系统的主界面,如图三所示,主界面有进入其他子功能的按钮,选择相应的按钮便可进入相应的功能。
加密功能如图四所示,根据提示输入要加密的明文文件路径、密文文件路径,点击加密,若加密成功将弹出提示框,提示加密成功否则提示解密失败。
解密功能如图五所示,根据提示输入要解密的密文文件路径、明文文件路径。
点击解密,若解密成功将弹出提示框,提示解密成功否则提示解密失败。
图6-图8为加密与解密文件的效果图。
四、设计体会与小结本次Java课程设计,自己通过查找资料、复习课本、编程调试,写实验报告等环节,进一步掌握了以前学到的知识,并且还学习到Java密码扩展服务(Java Cryptography Extension,JCE)。
JCE为加密解密,密钥产生与分配、消息认证码(Message Authentication Code)算法提供框架与实现,支持对称加密、非对称加密、块加密与流加密,也支持安全流与密封对象。
另外对SunJCE服务提供者也有所了解。
通过实践的学习,我认到学好计算机要重视实践操作,不仅仅是学习java语言,还是其它的语言,以及其它的计算机方面的知识都要重在实践,所以后在学习过程中,我会更加注重视实践操作,使自己更好地学好计算机。
五、参考文献[1]朱福喜,唐晓军,傅建明编著.Java项目设计与开发范例.北京.电子工业出版社,2005.10[2]朱福喜,尹为民等编著.Java语言与面向对象程序设计.武汉:武汉大学出版社,2002.12[3]冯军,程超等编著.JBuilder 9.0程序设计.北京:中国水利水电出版社,2004.5[4]丁振凡,黎章等编著.Java语言实用教程..北京:北京邮电大学出版社,2005.8[5]何桥,李肃义等编著.Java程序设计简明教程.北京:中国水利水电出版社,2004.9六、附录程序的主要代码:主界面模块主要代码JCEDialog.java//加密按钮事件的处理方法btnEncrypt.addActionListener(new ActionListener() {@Overridepublic void actionPerformed(ActionEvent e) {HashDigest hashDigest=new HashDigest();GenerateKey generateKey=new GenerateKey();Enc enc=new Enc();// TODO Auto-generated method stubString PlainFilePath1,CipherFilePath1,Strpasswrod1;PlainFilePath1=txtPlain.getText();CipherFilePath1=txtCipher.getText();//Strpasswrod1 = txtKey.getText();Strpasswrod1 = new String(txtKey.getPassword());//System.out.println(txtPlain.getText());byte[] KeyData1= hashDigest.HashDigest(Strpasswrod1);//生成密码的HASH 值javax.crypto.SecretKey SecKey1=generateKey.GenerateKey(KeyData1); //由输入的密码的hash值,产生加密密钥boolean EncOK=enc.EncryptFile(SecKey1, PlainFilePath1, CipherFilePath1);//调用文件加密算法txtKey.setText("");if(EncOK==true){JOptionPane.showMessageDialog(null, "文件加密成功!");}else {JOptionPane.showMessageDialog(null, "文件加密失败!");}}});//解密按钮事件的处理方法btnDecrypt.addActionListener(new ActionListener() {@Overridepublic void actionPerformed(ActionEvent e) {// TODO Auto-generated method stubHashDigest hashDigest=new HashDigest();GenerateKey generateKey=new GenerateKey();Dec dec =new Dec();String PlainFilePath2,CipherFilePath2,StrPasswrod2;PlainFilePath2=txtPlain.getText();CipherFilePath2=txtCipher.getText();//StrPasswrod2=txtKey.getText();StrPasswrod2=new String(txtKey.getPassword());byte[] KeyData2=hashDigest.HashDigest(StrPasswrod2);javax.crypto.SecretKey SecKey2=generateKey.GenerateKey(KeyData2);boolean DecOK=dec.DecryptFile(SecKey2, PlainFilePath2, CipherFilePath2);txtKey.setText("");if(DecOK==true){JOptionPane.showMessageDialog(null, "文件解密成功!");}else {JOptionPane.showMessageDialog(null, "文件解密失败!");}}});密码hash值生成HashDigest.javapublic class HashDigest {public byte[] HashDigest(String StrPassword){byte[] BytePasswrod=StrPassword.getBytes();String DigestAlgorithm ="SHA-1";byte[] KeyMaterial ={};try{java.security.MessageDigestMesDigest=MessageDigest.getInstance(DigestAlgorithm);MesDigest.update(BytePasswrod);KeyMaterial=MesDigest.digest();return KeyMaterial;}catch(java.security.NoSuchAlgorithmException e1){e1.printStackTrace();return null;}}}Hash产生密钥算法GenrateKey.javapublic class GenerateKey {public SecretKey GenerateKey(byte[] KeyData){String Alogorithm="DES";try{javax.crypto.spec.DESKeySpec DesKeySpec=new DESKeySpec(KeyData);javax.crypto.SecretKeyFactorySecKeyFac=SecretKeyFactory.getInstance(Alogorithm);javax.crypto.SecretKeysecKey=SecKeyFac.generateSecret(DesKeySpec);return secKey;}catch(java.security.NoSuchAlgorithmException e1){e1.printStackTrace();return null;}catch(ng.Exception e2){e2.printStackTrace();return null;}}}文件加密算法Enc.javapublic class Enc {final int MAX_BUF_SIZE=1024;String Algorithm="DES";String EncryptMode="CBC";String PaddingScheme="PKCS5Padding";public boolean EncryptFile(SecretKey SecKey1,String PlainFilePath1,String CipherFilePath1){try{//加密,将明文文件a.txt加密到另一个文件b.txtjavax.crypto.Cipher Cipher1 = Cipher.getInstance(Algorithm+ "/"+ EncryptMode + "/" + PaddingScheme);Cipher1.init(Cipher.ENCRYPT_MODE,SecKey1);java.io.File PlainFile1=new File(PlainFilePath1);java.io.File CipherFile1=new File(CipherFilePath1);long FileLen1=PlainFile1.length();if(FileLen1<=0){JOptionPane.showMessageDialog(null, "明文文件是空的!");return false;}java.io.FileInputStream fis1=new FileInputStream(PlainFile1);java.io.FileOutputStream fos1=new FileOutputStream(CipherFile1);java.io.ObjectOutputStream ObjOS1=new ObjectOutputStream(fos1);byte[] buffer1 = new byte[MAX_BUF_SIZE];int i=fis1.read(buffer1);while(i!=-1){javax.crypto.SealedObject SealedObj1=new SealedObject(buffer1, Cipher1);ObjOS1.writeObject(SealedObj1);i=fis1.read(buffer1);}fis1.close();ObjOS1.flush();ObjOS1.close();fos1.close();return true;}catch(java.security.NoSuchAlgorithmException e1){e1.printStackTrace();return false;}catch(javax.crypto.NoSuchPaddingException e2){e2.printStackTrace();return false;}catch(ng.Exception e3){e3.printStackTrace();return false;}}}文件解密算法Dec.javapublic class Dec {final int MAX_BUF_SIZE=1024;public boolean DecryptFile(SecretKey SecKey2,String PlainFilePath2,String CipherFilePath2){try{java.io.File PlainFile2=new File(PlainFilePath2);java.io.File CipherFile2=new File(CipherFilePath2);long FileLen2=CipherFile2.length();if(FileLen2<=0){JOptionPane.showMessageDialog(null, "密文文件是空的!");return false;}java.io.FileInputStream fis2=new FileInputStream(CipherFile2);java.io.ObjectInputStream ObjIS2=new ObjectInputStream(fis2);java.io.FileOutputStream fos2=new FileOutputStream(PlainFile2);byte[] buffer2=new byte[MAX_BUF_SIZE];javax.crypto.SealedObject SealedObj2=null;SealedObj2=(SealedObject)ObjIS2.readObject();while(SealedObj2!=null){buffer2=(byte[])SealedObj2.getObject(SecKey2);fos2.write(buffer2);SealedObj2=(SealedObject)ObjIS2.readObject();}ObjIS2.close();fis2.close();fos2.flush();fos2.close();return true;}catch(java.security.NoSuchAlgorithmException e1){e1.printStackTrace();return false;}catch(java.io.EOFException e2){System.out.println("解密完成!");return true;}catch(ng.Exception e3){e3.printStackTrace();return false;}}}。