搜档网
当前位置:搜档网 › 文件加密与解密—Java课程设计报告

文件加密与解密—Java课程设计报告

文件加密与解密—Java课程设计报告
文件加密与解密—Java课程设计报告

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() {

@Override

public void actionPerformed(ActionEvent e) {

HashDigest hashDigest=new HashDigest();

GenerateKey generateKey=new GenerateKey();

Enc enc=new Enc();

// TODO Auto-generated method stub

String 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() {

@Override

public void actionPerformed(ActionEvent e) {

// TODO Auto-generated method stub

HashDigest 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.java

public class HashDigest {

public byte[] HashDigest(String StrPassword)

{

byte[] BytePasswrod=StrPassword.getBytes();

String DigestAlgorithm ="SHA-1";

byte[] KeyMaterial ={};

try

{

java.security.MessageDigest

MesDigest=MessageDigest.getInstance(DigestAlgorithm);

MesDigest.update(BytePasswrod);

KeyMaterial=MesDigest.digest();

return KeyMaterial;

}

catch(java.security.NoSuchAlgorithmException e1)

{

e1.printStackTrace();

return null;

}

}

}

Hash产生密钥算法GenrateKey.java

public class GenerateKey {

public SecretKey GenerateKey(byte[] KeyData)

{

String Alogorithm="DES";

try

{

javax.crypto.spec.DESKeySpec DesKeySpec=new DESKeySpec(KeyData);

javax.crypto.SecretKeyFactory

SecKeyFac=SecretKeyFactory.getInstance(Alogorithm);

javax.crypto.SecretKey

secKey=SecKeyFac.generateSecret(DesKeySpec);

return secKey;

}

catch(java.security.NoSuchAlgorithmException e1)

{

e1.printStackTrace();

return null;

}

catch(https://www.sodocs.net/doc/688914249.html,ng.Exception e2)

{

e2.printStackTrace();

return null;

}

}

}

文件加密算法Enc.java

public 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.txt

javax.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(https://www.sodocs.net/doc/688914249.html,ng.Exception e3)

{

e3.printStackTrace();

return false;

}

}

}

文件解密算法Dec.java

public 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(https://www.sodocs.net/doc/688914249.html,ng.Exception e3)

{

e3.printStackTrace();

return false;

}

}

}

相关主题