DES-加解密算法(java和c-版)_第1页
DES-加解密算法(java和c-版)_第2页
DES-加解密算法(java和c-版)_第3页
DES-加解密算法(java和c-版)_第4页
DES-加解密算法(java和c-版)_第5页
已阅读5页,还剩1页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

/**java版的

*<p>Title:DES加解密算法</p>

*<p>Description:DES加解密算法</p>

*<p>Copyright:Copyright(c)2004</p>

*<p>Company:AspireCorp</p>

*@authorzhangji

*@version1.0

*/

importjava.security.*;

importjavax.crypto.*;

publicclassDES{

privatestaticStringstrDefaultKey="hnzt";

privateCipherencryptCipher=null;

privateCipherdecryptCipher=null;

/**

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

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

*和publicstaticbyte[]hexStr2ByteArr(StringstrIn)

*互为可逆的转换过程

*@paramarrB需要转换的byte数组

*@return转换后的字符串

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

*/

publicstaticStringbyteArr2HexStr(byte[]arrB)

throwsException

{

intiLen=arrB.length;

//每个byte用两个字符才能表示,所以字符串的长度是数组长度的两倍

StringBuffersb=newStringBuffer(iLen*2);

for(inti=0;i<iLen;i++)

{

intintTmp=arrB[i];

//把负数转换为正数

while(intTmp<0){

intTmp=intTmp+256;

}

//小于0F的数需要在前面补0

if(intTmp<16){

sb.append("0");

}

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

}

returnsb.toString();

}

/**

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

*和publicstaticStringbyteArr2HexStr(byte[]arrB)

*互为可逆的转换过程

*@paramstrIn需要转换的字符串

*@return转换后的byte数组

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

*@author<ahref="mailto:zhangji@">ZhangJi</a>

*/

publicstaticbyte[]hexStr2ByteArr(StringstrIn)

throwsException

{

byte[]arrB=strIn.getBytes();

intiLen=arrB.length;

//两个字符表示一个字节,所以字节数组长度是字符串长度除以2

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

for(inti=0;i<iLen;i=i+2)

{

StringstrTmp=newString(arrB,i,2);

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

}

returnarrOut;

}

/**

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

*@throwsException

*/

publicDES()

throwsException

{

this(strDefaultKey);

}

/**

*指定密钥构造方法

*@paramstrKey指定的密钥

*@throwsException

*/

publicDES(StringstrKey)

throwsException

{

Security.addProvider(newvider.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);

}

/**

*加密字节数组

*@paramarrB需加密的字节数组

*@return加密后的字节数组

*@throwsException

*/

publicbyte[]encrypt(byte[]arrB)

throwsException

{

returnencryptCipher.doFinal(arrB);

}

/**

*加密字符串

*@paramstrIn需加密的字符串

*@return加密后的字符串

*@throwsException

*/

publicStringencrypt(StringstrIn)

throwsException

{

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

}

/**

*解密字节数组

*@paramarrB需解密的字节数组

*@return解密后的字节数组

*@throwsException

*/

publicbyte[]decrypt(byte[]arrB)

throwsException

{

returndecryptCipher.doFinal(arrB);

}

/**

*解密字符串

*@paramstrIn需解密的字符串

*@return解密后的字符串

*@throwsException

*/

publicStringdecrypt(StringstrIn)

throwsException

{

returnnewString(decrypt(hexStr2ByteArr(strIn)));

}

/**

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

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

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

*@return生成的密钥

*@throwsjava.lang.Exception

*/

privateKeygetKey(byte[]arrBTmp)

throwsException

{

//创建一个空的8位字节数组(默认值为0)

byte[]arrB=newbyte[8];

//将原始字节数组转换为8位

for(inti=0;i<arrBTmp.length&&i<arrB.length;i++)

{

arrB[i]=arrBTmp[i];

}

//生成密钥

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

returnkey;

}

/**

*单元测试方法

*@paramargs

*/

publicstaticvoidmain(String[]args)

{

StringstrOriginal="1111";

StringstrOp="-de";

//检查入参个数

if(args.length==2){

strOp=args[0];

strOriginal=args[1];

}

else{

System.out.println("WrongParametercount,tryuse\"javaDES-de|-en'thestringyouwanttobeEncrypted'\"");

System.out.println("NowdoEncryptwith\"1111\"");

try{

DESdes=newDES();

//加密测试

System.out.println("*****加密测试*****");

des.enTest("1111");

//解密测试

System.out.println("*****解密测试*****");

des.deTest("0fc7648b53e54cfb");

}catch(Exceptionex){

ex.printStackTrace();

}

return;

}

try{

if(strOp.equals("-de")){

DESdes=newDES();

des.deTest(strOriginal);

}

elseif(strOp.equals("-en")){

DESdes=newDES();

des.enTest(strOriginal);

}

else{

System.out.println("Wrongoperater,tryuse\"javaDES-de|-en'thestringyouwanttobeEncrypted'\"");

System.out.println("NowdoEncryptwith\"1111\"");

}

}

catch(Exceptionex)

{

ex.printStackTrace();

}

}

/**

*单元测试方法,打印对指定字符串加密后的字符串

*/

privatevoidenTest(StringstrOriginal)

{

try

{

System.out.println("Plain

String:"+strOriginal);

StringstrEncrypt=encrypt(strO

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论