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

提交評論