Java实现文件的RSA和DES加密算法.docx

上传人:聆听****声音 文档编号:8965318 上传时间:2023-05-16 格式:DOCX 页数:10 大小:16.37KB
下载 相关 举报
Java实现文件的RSA和DES加密算法.docx_第1页
第1页 / 共10页
Java实现文件的RSA和DES加密算法.docx_第2页
第2页 / 共10页
Java实现文件的RSA和DES加密算法.docx_第3页
第3页 / 共10页
Java实现文件的RSA和DES加密算法.docx_第4页
第4页 / 共10页
Java实现文件的RSA和DES加密算法.docx_第5页
第5页 / 共10页
Java实现文件的RSA和DES加密算法.docx_第6页
第6页 / 共10页
Java实现文件的RSA和DES加密算法.docx_第7页
第7页 / 共10页
Java实现文件的RSA和DES加密算法.docx_第8页
第8页 / 共10页
Java实现文件的RSA和DES加密算法.docx_第9页
第9页 / 共10页
Java实现文件的RSA和DES加密算法.docx_第10页
第10页 / 共10页
亲,该文档总共10页,全部预览完了,如果喜欢就下载吧!
下载资源
资源描述

Java实现文件的RSA和DES加密算法.docx

《Java实现文件的RSA和DES加密算法.docx》由会员分享,可在线阅读,更多相关《Java实现文件的RSA和DES加密算法.docx(10页珍藏版)》请在冰点文库上搜索。

Java实现文件的RSA和DES加密算法.docx

一、 基础知识

Java实现文件的RSA

和DES加密算法

根据密钥类型不同将现代密码技术分为两类:

对称加密算法(秘密钥匙加密)和非对称加密算法(公开密钥加密)。

对称钥匙加密系统是加密和解密均采用同一把秘密钥匙,而且通信双方都必须获得这把钥匙,并保持钥匙的秘密。

非对称密钥加密系统采用的加密钥匙(公钥)和解密钥匙(私钥)是不同的。

1.1对称加密算法

对称加密算法用来对敏感数据等信息进行加密,常用的算法包括:

DES(DataEncryptionStandard):

数据加密标准,速度较快,适用于加密大量数据的场合。

3DES(TripleDES):

是基于DES,对一块数据用三个不同的密钥进行三次加密,强度更高。

AES(AdvancedEncryptionStandard):

高级加密标准,是下一代的加密算法标准,速度快,安全级别高;

1.2对称算法

常见的非对称加密算法如下:

RSA:

由RSA公司发明,是一个支持变长密钥的公共密钥算法,需要加密的文件块的长度也是可变的;

DSA(DigitalSignatureAlgorithm):

数字签名算法,是一种标准的DSS(数字签名标准);

ECC(EllipticCurvesCryptography):

椭圆曲线密码编码学。

1.3加密算法的选择

前面简单介绍了各种对称和非对称加密算法,那我们在实际使用的过程中究竟该使用哪一种比较好呢?

我们应该根据自己的使用特点来确定,由于非对称加密算法的运行速度比对称加密算法的速度慢很多,当我们需要加密大量的数据时,建议采用对称加密算法,提高加解密速度。

对称加密算法不能实现签名,因此签名只能非对称算法。

由于对称加密算法的密钥管理是一个复杂的过程,密钥的管理直接决定着他的安全性,因此当数据量很小时,我们可以考虑采用非对称加密算法。

在实际的操作过程中,我们通常采用的方式是:

采用非对称加密算法管理对称算法的密钥,然后用对称加密算法加密数据,这样我们就集成了两类加密算法的优点,既实现了加密速度快的优点,又实现了安全方便管理密钥的优点。

如果在选定了加密算法后,那采用多少位的密钥呢?

一般来说,密钥越长,运行的速度就越慢,应该根据的我们实际需要的安全级别来选择,一般来说,RSA建议采用1024位的数字,ECC建议采用160位,AES采用128为即可。

1.4JAVA中的实现

根据以上阐述说明,对于要加密的数据量大时,一般采用DES对称加密算法.对于需要实现签名的数据,则要采用RSA非对称加密算法.以下分别介绍这两种算法在JAVA的实现过程.

二、java实现DES加密算法

为了实现一对密钥对整个项目所有加密解密文件都适用的方法,采用先生成一对密钥.保存到xml文件中,以后获得私匙和公钥只需要从xml文件中取得就可以了.

/**

*把成生的一对密钥保存到DesKey.xml文件中

*/

publicstaticvoidsaveDesKey(){try{

SecureRandomsr=newSecureRandom();

//为我们选择的DES算法生成一个KeyGenerator对象KeyGeneratorkg=KeyGenerator.getInstance("DES");kg.init(sr);

FileOutputStreamfos=newFileOutputStream("C:

/DesKey.xml");ObjectOutputStreamoos=newObjectOutputStream(fos);

//生成密钥

Keykey=kg.generateKey();oos.writeObject(key);oos.close();

}catch(Exceptione){e.printStackTrace();

}

}

/**

*获得DES加密的密钥。

在交易处理的过程中应该定时更

*换密钥。

需要JCE的支持,如果jdk版本低于1.4,则需要

*安装jce-1_2_2才能正常使用。

*@return Key 返回对称密钥

*/

publicstaticKeygetKey(){Keykp=null;

try{

StringfileName="conf/DesKey.xml";InputStreamis=DesUtil.class.getClassLoader()

.getResourceAsStream(fileName);ObjectInputStreamoos=newObjectInputStream(is);kp=(Key)oos.readObject();

oos.close();

}catch(Exceptione){e.printStackTrace();

}

returnkp;

}

获取密钥方法如下:

文件采用DES算法加密文件

/**

*文件file进行加密并保存目标文件destFile中

*@paramfile

*要加密的文件如c:

/test/srcFile.txt

*@paramdestFile

*加密后存放的文件名如c:

/加密后文件.txt

*/

publicstaticvoidencrypt(Stringfile,StringdestFile)throwsException{Ciphercipher=Cipher.getInstance("DES");cipher.init(Cipher.ENCRYPT_MODE,getKey());

InputStreamis=newFileInputStream(file);OutputStreamout=newFileOutputStream(dest);

CipherInputStreamcis=newCipherInputStream(is,cipher);byte[]buffer=newbyte[1024];

intr;

while((r=cis.read(buffer))>0){out.write(buffer,0,r);

}

cis.close();

is.close();

out.close();

}

文件采用DES算法解密文件

/**

*文件file进行加密并保存目标文件destFile中

*@paramfile

*已加密的文件如c:

/加密后文件.txt

*@paramdestFile

*解密后存放的文件名如c:

/test/解密后文件.txt

*/

publicstaticvoiddecrypt(Stringfile,Stringdest)throwsException{Ciphercipher=Cipher.getInstance("DES");cipher.init(Cipher.DECRYPT_MODE,getKey());InputStreamis=newFileInputStream(file);

OutputStreamout=newFileOutputStream(dest);CipherOutputStreamcos=newCipherOutputStream(out,cipher);byte[]buffer=newbyte[1024];

intr;

while((r=is.read(buffer))>=0){cos.write(buffer,0,r);

}

cos.close();

out.close();

is.close();

}

三、java实现RSA加密算法

同样为了实现一对密钥对整个项目所有加密解密文件都适用的方法,采用先生成一对密钥.保存到xml文件中,以后获得私匙和公钥只需要从xml文件中取得就可以了.但实现方法不一样了.

/**

*把成生的一对密钥保存到RSAKey.xml文件中

*/

publicvoidsaveRSAKey(){

try{

SecureRandomsr=newSecureRandom();

KeyPairGeneratorkg=KeyPairGenerator.getInstance("RSA",

neworg.bouncycastle.jce.provider.BouncyCastleProvider());

//注意密钥大小最好为1024,否则解密会有乱码情况.kg.initialize(1024,sr);

FileOutputStreamfos=newFileOutputStream("C:

/RSAKey.xml");ObjectOutputStreamoos=newObjectOutputStream(fos);

//生成密钥oos.writeObject(kg.generateKeyPair());oos.close();

}catch(Exceptione){e.printStackTrace();

}

}

注意:

需要从http:

//www.bouncycastle.org下载bcprov-jdk14-137.jar包.

/**

*获得RSA加密的密钥。

*@return KeyPair返回对称密钥

*/

publicstaticKeyPairgetKeyPair(){

//产生新密钥对KeyPairkp;

try{

StringfileName="conf/RASKey.xml";InputStreamis=FileUtils.class.getClassLoader()

.getResourceAsStream(fileName);ObjectInputStreamoos=newObjectInputStream(is);kp=(KeyPair)oos.readObject();

oos.close();

}catch(Exceptione){

thrownewEprasRuntimeException("读取加密文件出错.",e);

}

returnkp;

}

获取密钥方法如下:

文件采用RSA算法加密文件

/**

*文件file进行加密并保存目标文件destFile中

*@paramsrcFileName

*要加密的文件如c:

/test/srcFile.txt

*@paramdestFileName

*加密后存放的文件名如c:

/加密后文件.txt

*/

publicstaticvoidencryptFile(StringsrcFileName,StringdestFileName)throwsException{

OutputStreamoutputWriter=null;InputStreaminputReader=null;try{

Ciphercipher=Cipher.getInstance("RSA/ECB/PKCS1Padding",

neworg.bouncycastle.jce.provider.BouncyCastleProvider());byte[]buf=newbyte[100];

intbufl;

cipher.init(Cipher.ENCRYPT_MODE,getKeyPair().getPublic());outputWriter=newFileOutputStream(destFileName);inputReader=newFileInputStream(srcFileName);

while((bufl=inputReader.read(buf))!

=-1){byte[]encText=null;

byte[]newArr=null;

if(buf.length==bufl){newArr=buf;

}else{

newArr=newbyte[bufl];for(inti=0;i

newArr[i]=(byte)buf[i];

}

}

encText=cipher.doFinal(newArr);outputWriter.write(encText);

}

outputWriter.flush();

}catch(Exceptione){throwe;

}finally{

try{

if(outputWriter!

=null){outputWriter.close();

}

if(inputReader!

=null){inputReader.close();

}

}catch(Exceptione){

}

}

}

/**

*文件file进行加密并保存目标文件destFile中

*@paramsrcFileName

*已加密的文件如c:

/加密后文件.txt

*@paramdestFileName

*解密后存放的文件名如c:

/test/解密后文件.txt

*/

publicstaticvoiddecryptFile(StringsrcFileName,StringdestFileName)throwsException{

OutputStreamoutputWriter=null;InputStreaminputReader=null;try{

Ciphercipher=Cipher.getInstance("RSA/ECB/PKCS1Padding",

neworg.bouncycastle.jce.provider.BouncyCastleProvider());byte[]buf=newbyte[128];

intbufl;

cipher.init(Cipher.DECRYPT_MODE,getKeyPair().getPrivate());

outputWriter=newFileOutputStream(destFileName);inputReader=newFileInputStream(srcFileName);while((bufl=inputReader.read(buf))!

=-1){

byte[]encText=null;byte[]newArr=null;

if(buf.length==bufl){newArr=buf;

}else{

newArr=newbyte[bufl];for(inti=0;i

newArr[i]=(byte)buf[i];

}

}

encText=cipher.doFinal(newArr);outputWriter.write(encText);

}

文件采用RSA算法解密文件

outputWriter.flush();

}catch(Exceptione){throwe;

}finally{

try{

if(outputWriter!

=null){outputWriter.close();

}

if(inputReader!

=null){inputReader.close();

}

}catch(Exceptione){

}

}

}

四、 总结

上述两种加密方法通过测试发现

如果对于大文件加密采用RSA算法执行速度要非常非常慢;

如果对加密文件密码安全性要求不高,可以采用DES算法,速度会有明显的提升.

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 总结汇报 > 学习总结

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2