DES加密和解密.docx

上传人:b****1 文档编号:596298 上传时间:2023-04-29 格式:DOCX 页数:12 大小:89.61KB
下载 相关 举报
DES加密和解密.docx_第1页
第1页 / 共12页
DES加密和解密.docx_第2页
第2页 / 共12页
DES加密和解密.docx_第3页
第3页 / 共12页
DES加密和解密.docx_第4页
第4页 / 共12页
DES加密和解密.docx_第5页
第5页 / 共12页
DES加密和解密.docx_第6页
第6页 / 共12页
DES加密和解密.docx_第7页
第7页 / 共12页
DES加密和解密.docx_第8页
第8页 / 共12页
DES加密和解密.docx_第9页
第9页 / 共12页
DES加密和解密.docx_第10页
第10页 / 共12页
DES加密和解密.docx_第11页
第11页 / 共12页
DES加密和解密.docx_第12页
第12页 / 共12页
亲,该文档总共12页,全部预览完了,如果喜欢就下载吧!
下载资源
资源描述

DES加密和解密.docx

《DES加密和解密.docx》由会员分享,可在线阅读,更多相关《DES加密和解密.docx(12页珍藏版)》请在冰点文库上搜索。

DES加密和解密.docx

DES加密和解密

医学技术学院

课程设计报告

 

DES算法加密与解密的设计与实现

 

课程名称:

密码算法程序设计

学生姓名:

胡苗苗

学生学号:

201412203502007

专业班级:

医学信息工程2班

任课教师:

王海舜

 

2017年1月4日

1背景

1.1DES算法概述

DES(DataEncryptionStandard)是由美国IBM公司于20世纪70年代中期的一个密码算(LUCIFER)发展而来,在1977年1月15日,美国国家标准局正式公布实施,并得到了ISO的认可,在过去的20多年时间里,DES被广泛应用于美国联邦和各种商业信息的保密工作中,经受住了各种密码分析和攻击,有很好的安全性。

然而,目前DES算法已经被更为安全的Rijndael算法取代,但是DES加密算法还没有被彻底的破解掉,仍是目前使用最为普遍的对称密码算法。

所以对DES的研究还有很大价值,在国内DES算法在POS、ATM、磁卡及智能卡(IC卡)、加油站、高速公路收费站等领域被广泛应用,以此来实现关键的数据保密,如信用卡持卡人的PIN码加密传输,IC卡与POS机之间的双向认证、金融交易数据包的MAC校验等,均用到DES算法。

DES算法是一种采用传统的代替和置换操作加密的分组密码,明文以64比特为分组,密钥长度为64比特,有效密钥长度是56比特,其中加密密钥有8比特是奇偶校验,DES的加密和解密用的是同一算法,它的安全性依赖于所用的密钥。

它首先把需要加密的明文划分为每64比特的二进制的数据块,用56比特有效密钥对64比特二进制数据块进行加密,每次加密可对64比特的明文输入进行16轮的替换和移位后,输出完全不同的64比特密文数据。

由于DES算法仅使用最大为64比特的标准算法和逻辑运算,运算速度快,密钥容易产生,适合于在大多数计算机上用软件快速实现,同样也适合于在专用芯片上实现。

1.2DES算法描述

DES算法的加密过程首先对明文分组进行操作,需要加密的明文分组固定为64比特的块。

图1-1是DES加密算法的加密流程。

图1-2是密钥扩展处理过程。

图1-1DES加密算法流程

图1-2子密钥产生流程

2程序设计

2.1主要目标

(1)用java设计一个DES加密/解密程序;

(2)完成一个明文的加解密,明文是字符串,输入明文,输出密文,进行加密后,能够进行正确的解密;

(5)要求从控制台输入读取明文,并在控制台中输出明文及密文;

2.2程序使用工具

该程序用java语言编写,编写时所用的工具主要是eclipse

运行环境是jdk1.7及以上

 

3程序运行结果

测试明文:

01234ABCDabcd!

@#$

4具体实现

4.1DES.java

packagedes;

importjava.security.*;

importjavax.crypto.*;

/**

*DES加解密算法

*/

publicclassDES{

privatestaticStringstrDefaultKey="abcDEF123";

privateCipherencryptCipher=null;

privateCipherdecryptCipher=null;

/**

*默认构造方法,使用默认密钥

*@throwsException

*/

publicDES()throwsException{

this(strDefaultKey);

}

/**

*指定密钥构造方法

*@paramstrKey指定的密钥

*@throwsException

*/

publicDES(StringstrKey)throwsException{

//Security.addProvider(newcom.sun.crypto.provider.SunJCE());

Keykey=getKey(strKey.getBytes());

encryptCipher=Cipher.getInstance("DES");

encryptCipher.init(Cipher.ENCRYPT_MODE,key);

decryptCipher=Cipher.getInstance("DES");

decryptCipher.init(Cipher.DECRYPT_MODE,key);

}

/**

*加密字符串

*@paramstrIn需加密的字符串

*@return加密后的字符串

*@throwsException

*/

publicStringencrypt(StringstrIn)throwsException{

returnbyteArr2HexStr(encrypt(strIn.getBytes()));

}

/**

*加密字节数组

*@paramarrB需加密的字节数组

*@return加密后的字节数组

*@throwsException

*/

publicbyte[]encrypt(byte[]arrB)throwsException{

returnencryptCipher.doFinal(arrB);

}

/**

*解密字符串

*@paramstrIn需解密的字符串

*@return解密后的字符串

*@throwsException

*/

publicStringdecrypt(StringstrIn)throwsException{

returnnewString(decrypt(hexStr2ByteArr(strIn)));

}

/**

*解密字节数组

*@paramarrB需解密的字节数组

*@return解密后的字节数组

*@throwsException

*/

publicbyte[]decrypt(byte[]arrB)throwsException{

returndecryptCipher.doFinal(arrB);

}

/**

*从指定字符串生成密钥,密钥所需的字节数组长度为8位

*不足8位时后面补0,超出8位只取前8位

*@paramarrBTmp构成该字符串的字节数组

*@return生成的密钥

*@throwsjava.lang.Exception

*/

privateKeygetKey(byte[]arrBTmp)throwsException{

byte[]arrB=newbyte[8];

for(inti=0;i

arrB[i]=arrBTmp[i];

}

Keykey=newjavax.crypto.spec.SecretKeySpec(arrB,"DES");

returnkey;

}

/**

*将byte数组转换为表示16进制值的字符串,

*如:

byte[]{8,18}转换为:

0813,

*和publicstaticbyte[]hexStr2ByteArr(StringstrIn)

*互为可逆的转换过程

*@paramarrB需要转换的byte数组

*@return转换后的字符串

*@throwsException本方法不处理任何异常,所有异常全部抛出

*/

publicstaticStringbyteArr2HexStr(byte[]arrB)throwsException{

intiLen=arrB.length;

StringBuffersb=newStringBuffer(iLen*2);

for(inti=0;i

intintTmp=arrB[i];

while(intTmp<0){

intTmp=intTmp+256;

}

if(intTmp<16){

sb.append("0");

}

sb.append(Integer.toString(intTmp,16));

}

returnsb.toString();

}

/**

*将表示16进制值的字符串转换为byte数组,

*和publicstaticStringbyteArr2HexStr(byte[]arrB)

*互为可逆的转换过程

*@paramstrIn需要转换的字符串

*@return转换后的byte数组

*@throwsException本方法不处理任何异常,所有异常全部抛出

*/

publicstaticbyte[]hexStr2ByteArr(StringstrIn)throwsException{

byte[]arrB=strIn.getBytes();

intiLen=arrB.length;

byte[]arrOut=newbyte[iLen/2];

for(inti=0;i

StringstrTmp=newString(arrB,i,2);

arrOut[i/2]=(byte)Integer.parseInt(strTmp,16);

}

returnarrOut;

}

}

4.2EncryUtil.java

packagedes;

/**

*加密解密工具类

*/

publicclassEncryUtil{

/**

*使用默认密钥进行DES加密

*/

publicstaticStringencrypt(StringplainText){

try{

returnnewDES().encrypt(plainText);

}catch(Exceptione){

returnnull;

}

}

 

/**

*使用指定密钥进行DES解密

*/

publicstaticStringencrypt(StringplainText,Stringkey){

try{

returnnewDES(key).encrypt(plainText);

}catch(Exceptione){

returnnull;

}

}

 

/**

*使用默认密钥进行DES解密

*/

publicstaticStringdecrypt(StringplainText){

try{

returnnewDES().decrypt(plainText);

}catch(Exceptione){

returnnull;

}

}

 

/**

*使用指定密钥进行DES解密

*/

publicstaticStringdecrypt(StringplainText,Stringkey){

try{

returnnewDES(key).decrypt(plainText);

}catch(Exceptione){

returnnull;

}

}

}

4.3TestDES.java

packagedes;

importjava.util.Scanner;

publicclassTestDES{

publicstaticvoidmain(String[]args)throwsException{

Scannerin=newScanner(System.in);

Stringstr=in.next();

//Stringstr="01234ABCDabcd!

@#$";

Stringt="";

System.out.println("加密后:

"+(t=EncryUtil.encrypt(str)));

System.out.println("解密后:

"+EncryUtil.decrypt(t));

}

}

5课程报告总结

通过这次程序设计,我学到了很多东西,首先更深入的理解了DES算法,不仅完完全全弄懂了DES算法的各个过程,其次也提高了编程技巧,在处理一些问题时能选择较佳的方法。

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

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

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

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