DES加密和解密.docx
《DES加密和解密.docx》由会员分享,可在线阅读,更多相关《DES加密和解密.docx(12页珍藏版)》请在冰点文库上搜索。
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;iarrB[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;iintintTmp=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;iStringstrTmp=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算法的各个过程,其次也提高了编程技巧,在处理一些问题时能选择较佳的方法。