文件加密与解密Java课程设计报告.docx
- 文档编号:27634323
- 上传时间:2023-07-03
- 格式:DOCX
- 页数:19
- 大小:233.77KB
文件加密与解密Java课程设计报告.docx
《文件加密与解密Java课程设计报告.docx》由会员分享,可在线阅读,更多相关《文件加密与解密Java课程设计报告.docx(19页珍藏版)》请在冰豆网上搜索。
文件加密与解密Java课程设计报告
JAVA课程设计
题目:
文件的加密与解密
姓名:
学号:
班级:
日期:
指导老师
分数
一、设计思路
自从Java技术出现以业,有关Java平台的安全性用由Java技术发展所引发的安全性问题,引起了越来越多的关注。
目前,Java已经大量应用于各个领域,研究Java的安全性对于更好地利用Java具有深远的意义。
使用Java的安全机制设计和实现安全系统更具有重要的应用价值。
本课程设计,主要实践Java安全中的JCE模块,包括密钥生成,Cipher对象初始化、加密模式、填充模式、底层算法参数传递,也涉及文件读写与对象输入输出流。
二、具体实现
本系统通过用户界面接收三个参数:
明文文件、密文文件、口令。
采用DES加密算法,密码分组链(CipherBlockChaining,CBC)加密模式,PKCS#5-Padding的分组填充算法。
因为CBC涉及到底层算法参数的解密密钥的传递,所以将明文文件中的字节块以密封对象(SealedObject)的方式加密后,用对象流输出到密文文件,这样就将密文、算法参数、解密密钥三都密封到一个对象中了。
口令的hash值作为产生密钥的参数。
设计流程图如下所示:
文件加密与解密设计流程图
本系统中,包含Default,Shares,SecretKey,EncAndDec四个包共6个类组成。
定义的几个参数:
MAX_BUF_SIZE为每次从文件中读取的字节数,也是内存缓冲区的大小;加密算法为DES;加密模式是密码分组链(CBC)模式;分组填充方式是PKCS#5Padding。
包和类结构图如下所示:
本课程设计,包和类结构图:
PackageDefault->ClassJCEDialog//文件加密解密窗口类
PackageShares->ClassHashDigest、Classbyte2hex//密码Hash值生成类、二进制转字符串类
PackageSecretKey->ClassGenerateKey//由密码Hash值生成秘密密钥类
PackageEncAndDec->ClassDec、ClassEnc//文件加密、解密类
以下为包中的类的方法实现说明
PackageShares类结构图
PackageShares
publicclassHashDigest
密码Hash值生成方类,使用默认构造方法。
publicbyte[]HashDigest(StringStrPassword)
密码Hash值生成方法
MessageDigest对象生成,使用类的getInstance(StringDigestAlgorithm)方法。
1)输入产生摘要的原始数据,使用报文摘要对象MesDigest的update方法,接收byte[]类型的输入,因此需要交String类型预先转化为byte[]类型。
2)报文摘要的产生可以直接调用报文摘要对象MesDigest的digest方法,也可以将输入的byte[]类型作为参数而省去update方法调用。
publicclassbyte2hex
二进制转字符串类
publicStringbyte2hex(byte[]b)
该方法接收byte[]类型的二进制数据。
将二进制数据转为字符串,以便于观察和对比,便于调试程序。
PackageSecretKey类结构图
PackageSecretKey
publicclassGenerateKey
由密码Hash值生成秘密密钥类,使用默认构造方法。
PublicSecretKeyGenerateKey(byte[]KeyData)
由密码Hash值生成秘密密钥方法(由hashDigest算法产生byte[]类型的hash值,再由此hash值生成对称密钥的算法)
算法中用到了两个重要的类
1)DESKeySpec,是密码服务提供者“SunJCE”支持的一种DES密钥透明表示,即以适当的格式表示的DES密钥的底层元素。
本设计中以输入密钥的hash值生成DESKeySpec对象。
2)SecretKeyFactory是一种密钥转换机制,用于密钥(Key,java.security.key类型的不透明密钥)与密钥规范(keyspecification,符合适当的底层密钥元素的透明表示)之间的互相转换。
SecretKeyFactory仅作用于秘密密钥(对称密钥),它用于由keyspecification(DESKeySpec)生成Key(SecretKey)。
PackageEncAndDec类结构图
PackageEncAndDec
publicclassEnc
文件加密类,使用默认构造方法
publicbooleanEncryptFile(SecretKeySecKey1,StringPlainFilePath1,StringCipherFilePath1)
文件加密方法,该加密的流程如图-文件加密流程图所示。
该过程采用DES块加密算法、密码分组(CBC)加密模式、PKCS#5Padding填充方式。
CBC模式需要传递底层算法参数和解密密钥,而SealedObject是解决底层算法参数传递的理想方案与关键。
publicclassDec
文件解密类,使用默认构造方法
publicbooleanEncryptFile(SecretKeySecKey2,StringPlainFilePath2,StringCipherFilePath2)
文件解密是文件加密的逆过程,接收相同的三个入口参数,所使用的对象与API有很多相似的关联,其流程与实现只有少数不同之处
1)文件解密以对象输入流(ObjcetInputStream)从密文文件中读取密文对象,用普通文件输出流(FileOutputStream)将解密后的明文文件。
2)解密使用参数SecKey2作用于密文文件中的SealdObject。
Cipher对象和底层算法参数都封装在SealdeObject中,解密语句:
buffer2=(byte[])SealedObj2.getObject(SecKey2);将密文从读取的SealdeObj2中用解密密钥SecKey2解密出来,解密后的明文暂存于buffer2。
图1文件加密流程图
文件加密与解密窗口类结构图:
PublicclassJCEDialogextendsJDialog//文件加密解密窗口类
FinalintMAX_BUF_SIZE=1024;
StringAlgorithm=”DES”;
StringEncryptMode=”CBC”;
StringPaddingScheme=”PKCS5Padding”;
ImportShares.*Publicbyet[]HashDigest(StringStrPassword)//Shares包,HashDigest类,密码Hash值生成方法
ImportSecretKey.*PublicSecretKeyGenerateKey(byte[]KeyData)//SecreKey包,GenerateKey类,由密码Hash值生成秘密密钥方法
ImportEncAndDec.*PublicboolenEncryptFile(SecretKeySecKey1,StringPlainFilePath1,StringCipherFilePath1)//EncAndDec包,Enc类,文件加密方法
ImportEnAndDec.*PublicboolenDecryptFile(SecretKeySecKey2,StringPlainFilePath2,StringCipherFilePath2)//EncAndDec包,Dec类,文件解密方法
publicstaticvoidmain(String[]args)//窗口类主方法体
btnEncrypt.addActionListener(newActionListener(){
publicvoidactionPerformed(ActionEvente){}
}//加密按钮事件
btnDecrypt.addActionListener(newActionListener(){
publicvoidactionPerformed(ActionEvente){}
}//解密按钮事件
三、运行调试与分析讨论
系统的详细设计代码请查阅附带的代码。
以下仅对各个界面进行截图展示:
图2系统主界面
图4文件加密界面
图5文件解密界面
图6待加密文件Plain1.txt
图7Plain1.txt加密后的文件Cipher.txt
图8密文文件Cipher.txt解密后的明文文件Plain2.txt
运行JAVA程序中,显示系统的主界面,如图三所示,主界面有进入其他子功能的按钮,选择相应的按钮便可进入相应的功能。
加密功能如图四所示,根据提示输入要加密的明文文件路径、密文文件路径,点击加密,若加密成功将弹出提示框,提示加密成功否则提示解密失败。
解密功能如图五所示,根据提示输入要解密的密文文件路径、明文文件路径。
点击解密,若解密成功将弹出提示框,提示解密成功否则提示解密失败。
图6-图8为加密与解密文件的效果图。
四、设计体会与小结
本次Java课程设计,自己通过查找资料、复习课本、编程调试,写实验报告等环节,进一步掌握了以前学到的知识,并且还学习到Java密码扩展服务(JavaCryptographyExtension,JCE)。
JCE为加密解密,密钥产生与分配、消息认证码(MessageAuthenticationCode)算法提供框架与实现,支持对称加密、非对称加密、块加密与流加密,也支持安全流与密封对象。
另外对SunJCE服务提供者也有所了解。
通过实践的学习,我认到学好计算机要重视实践操作,不仅仅是学习java语言,还是其它的语言,以及其它的计算机方面的知识都要重在实践,所以后在学习过程中,我会更加注重视实践操作,使自己更好地学好计算机。
五、参考文献
[1]朱福喜,唐晓军,傅建明编著.Java项目设计与开发范例.北京.电子工业出版社,2005.10
[2]朱福喜,尹为民等编著.Java语言与面向对象程序设计.武汉:
武汉大学出版社,2002.12
[3]冯军,程超等编著.JBuilder9.0程序设计.北京:
中国水利水电出版社,2004.5
[4]丁振凡,黎章等编著.Java语言实用教程..北京:
北京邮电大学出版社,2005.8
[5]何桥,李肃义等编著.Java程序设计简明教程.北京:
中国水利水电出版社,2004.9
六、附录
程序的主要代码:
主界面模块主要代码JCEDialog.java
//加密按钮事件的处理方法
btnEncrypt.addActionListener(newActionListener(){
@Override
publicvoidactionPerformed(ActionEvente){
HashDigesthashDigest=newHashDigest();
GenerateKeygenerateKey=newGenerateKey();
Encenc=newEnc();
//TODOAuto-generatedmethodstub
StringPlainFilePath1,CipherFilePath1,Strpasswrod1;
PlainFilePath1=txtPlain.getText();
CipherFilePath1=txtCipher.getText();
//Strpasswrod1=txtKey.getText();
Strpasswrod1=newString(txtKey.getPassword());
//System.out.println(txtPlain.getText());
byte[]KeyData1=hashDigest.HashDigest(Strpasswrod1);//生成密码的HASH值
javax.crypto.SecretKeySecKey1=generateKey.GenerateKey(KeyData1);//由输入的密码的hash值,产生加密密钥
booleanEncOK=enc.EncryptFile(SecKey1,PlainFilePath1,CipherFilePath1);//调用文件加密算法
txtKey.setText("");
if(EncOK==true)
{
JOptionPane.showMessageDialog(null,"文件加密成功!
");
}
else{
JOptionPane.showMessageDialog(null,"文件加密失败!
");
}
}
});
//解密按钮事件的处理方法
btnDecrypt.addActionListener(newActionListener(){
@Override
publicvoidactionPerformed(ActionEvente){
//TODOAuto-generatedmethodstub
HashDigesthashDigest=newHashDigest();
GenerateKeygenerateKey=newGenerateKey();
Decdec=newDec();
StringPlainFilePath2,CipherFilePath2,StrPasswrod2;
PlainFilePath2=txtPlain.getText();
CipherFilePath2=txtCipher.getText();
//StrPasswrod2=txtKey.getText();
StrPasswrod2=newString(txtKey.getPassword());
byte[]KeyData2=hashDigest.HashDigest(StrPasswrod2);
javax.crypto.SecretKeySecKey2=generateKey.GenerateKey(KeyData2);
booleanDecOK=dec.DecryptFile(SecKey2,PlainFilePath2,CipherFilePath2);
txtKey.setText("");
if(DecOK==true)
{
JOptionPane.showMessageDialog(null,"文件解密成功!
");
}
else{
JOptionPane.showMessageDialog(null,"文件解密失败!
");
}
}
});
密码hash值生成HashDigest.java
publicclassHashDigest{
publicbyte[]HashDigest(StringStrPassword)
{
byte[]BytePasswrod=StrPassword.getBytes();
StringDigestAlgorithm="SHA-1";
byte[]KeyMaterial={};
try
{
java.security.MessageDigestMesDigest=MessageDigest.getInstance(DigestAlgorithm);
MesDigest.update(BytePasswrod);
KeyMaterial=MesDigest.digest();
returnKeyMaterial;
}
catch(java.security.NoSuchAlgorithmExceptione1)
{
e1.printStackTrace();
returnnull;
}
}
}
Hash产生密钥算法GenrateKey.java
publicclassGenerateKey{
publicSecretKeyGenerateKey(byte[]KeyData)
{
StringAlogorithm="DES";
try
{
javax.crypto.spec.DESKeySpecDesKeySpec=newDESKeySpec(KeyData);
javax.crypto.SecretKeyFactorySecKeyFac=SecretKeyFactory.getInstance(Alogorithm);
javax.crypto.SecretKeysecKey=SecKeyFac.generateSecret(DesKeySpec);
returnsecKey;
}
catch(java.security.NoSuchAlgorithmExceptione1)
{
e1.printStackTrace();
returnnull;
}
catch(java.lang.Exceptione2)
{
e2.printStackTrace();
returnnull;
}
}
}
文件加密算法Enc.java
publicclassEnc{
finalintMAX_BUF_SIZE=1024;
StringAlgorithm="DES";
StringEncryptMode="CBC";
StringPaddingScheme="PKCS5Padding";
publicbooleanEncryptFile(SecretKeySecKey1,StringPlainFilePath1,StringCipherFilePath1)
{
try
{
//加密,将明文文件a.txt加密到另一个文件b.txt
javax.crypto.CipherCipher1=Cipher.getInstance(Algorithm+"/"+EncryptMode+"/"+PaddingScheme);
Cipher1.init(Cipher.ENCRYPT_MODE,SecKey1);
java.io.FilePlainFile1=newFile(PlainFilePath1);
java.io.FileCipherFile1=newFile(CipherFilePath1);
longFileLen1=PlainFile1.length();
if(FileLen1<=0)
{
JOptionPane.showMessageDialog(null,"明文文件是空的!
");
returnfalse;
}
java.io.FileInputStreamfis1=newFileInputStream(PlainFile1);
java.io.FileOutputStreamfos1=newFileOutputStream(CipherFile1);
java.io.ObjectOutputStreamObjOS1=newObjectOutputStream(fos1);
byte[]buffer1=newbyte[MAX_BUF_SIZE];
inti=fis1.read(buffer1);
while(i!
=-1)
{
javax.crypto.SealedObjectSealedObj1=newSealedObject(buffer1,Cipher1);
ObjOS1.writeObject(SealedObj1);
i=fis1.read(buffer1);
}
fis1.close();
ObjOS1.flush();
ObjOS1.close();
fos1.close();
returntrue;
}
catch(java.security.NoSuchAlgorithmExceptione1)
{
e1.printStackTrace();
returnfalse;
}
catch(javax.crypto.NoSuchPaddingExceptione2)
{
e2.printStackTrace();
returnfalse;
}
catch(java.lang.Exceptione3)
{
e3.printStackTrace();
returnfalse;
}
}
}
文件解密算法Dec.java
publicclassDec{
finalintMAX_BUF_SIZE=1024;
publicbooleanDecryptFile(SecretKeySecKey2,StringPlainFilePath2,StringCipherFilePath2)
{
try
{
java.io.FilePlainFile2=newFile(PlainFilePath2);
java.io.FileCipherFile2=newFile(CipherFilePath2);
longFileLen2=CipherFile2.length();
if(FileLen2<=0)
{
JOptionPane.showMessageDialog(null,"密文文件是空的!
");
returnfalse;
}
java.io.FileInputStreamfis2=newFileInputStream(CipherFile2);
java.io.ObjectInputStreamObjIS2=newObjectInputStream(fis2);
java.io.FileOutputStreamfos2=newFileOutputStream(PlainFile2);
byte[]buffer2=newbyte[MAX_BUF_SIZE];
javax.c
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 文件 加密 解密 Java 课程设计 报告