數據加載中……
          JAVA:DES可逆加密算法
            1 import java.security.*;
            2 import javax.crypto.*;
            3 
            4 public class DESPlus {
            5     private static String strDefaultKey = "national";
            6     private Cipher encryptCipher = null;
            7     private Cipher decryptCipher = null;
            8 
            9     /**
           10      * 將byte數組轉換為表示16進制值的字符串, 如:byte[]{8,18}轉換為:0813, 和public static byte[]
           11      * hexStr2ByteArr(String strIn) 互為可逆的轉換過程
           12      * 
           13      * @param arrB
           14      *            需要轉換的byte數組
           15      * @return 轉換后的字符串
           16      * @throws Exception
           17      *             本方法不處理任何異常,所有異常全部拋出
           18      */
           19     public static String byteArr2HexStr(byte[] arrB) throws Exception {
           20         int iLen = arrB.length;
           21         // 每個byte用兩個字符才能表示,所以字符串的長度是數組長度的兩倍
           22         StringBuffer sb = new StringBuffer(iLen * 2);
           23         for (int i = 0; i < iLen; i++) {
           24             int intTmp = arrB[i];
           25             // 把負數轉換為正數
           26             while (intTmp < 0) {
           27                 intTmp = intTmp + 256;
           28             }
           29             // 小于0F的數需要在前面補0
           30             if (intTmp < 16) {
           31                 sb.append("0");
           32             }
           33             sb.append(Integer.toString(intTmp, 16));
           34         }
           35         return sb.toString();
           36     }
           37 
           38     /**
           39      * 將表示16進制值的字符串轉換為byte數組, 和public static String byteArr2HexStr(byte[] arrB)
           40      * 互為可逆的轉換過程
           41      * 
           42      * @param strIn
           43      *            需要轉換的字符串
           44      * @return 轉換后的byte數組
           45      * @throws Exception
           46      *             本方法不處理任何異常,所有異常全部拋出
           47      * @author <a href="mailto:leo841001@163.com">LiGuoQing</a>
           48      */
           49     public static byte[] hexStr2ByteArr(String strIn) throws Exception {
           50         byte[] arrB = strIn.getBytes();
           51         int iLen = arrB.length;
           52 
           53         // 兩個字符表示一個字節,所以字節數組長度是字符串長度除以2
           54         byte[] arrOut = new byte[iLen / 2];
           55         for (int i = 0; i < iLen; i = i + 2) {
           56             String strTmp = new String(arrB, i, 2);
           57             arrOut[i / 2= (byte) Integer.parseInt(strTmp, 16);
           58         }
           59         return arrOut;
           60     }
           61 
           62     /**
           63      * 默認構造方法,使用默認密鑰
           64      * 
           65      * @throws Exception
           66      */
           67     public DESPlus() throws Exception {
           68         this(strDefaultKey);
           69     }
           70 
           71     /**
           72      * 指定密鑰構造方法
           73      * 
           74      * @param strKey
           75      *            指定的密鑰
           76      * @throws Exception
           77      */
           78     public DESPlus(String strKey) throws Exception {
           79         Security.addProvider(new com.sun.crypto.provider.SunJCE());
           80         Key key = getKey(strKey.getBytes());
           81 
           82         encryptCipher = Cipher.getInstance("DES");
           83         encryptCipher.init(Cipher.ENCRYPT_MODE, key);
           84 
           85         decryptCipher = Cipher.getInstance("DES");
           86         decryptCipher.init(Cipher.DECRYPT_MODE, key);
           87     }
           88 
           89     /**
           90      * 加密字節數組
           91      * 
           92      * @param arrB
           93      *            需加密的字節數組
           94      * @return 加密后的字節數組
           95      * @throws Exception
           96      */
           97     public byte[] encrypt(byte[] arrB) throws Exception {
           98         return encryptCipher.doFinal(arrB);
           99     }
          100 
          101     /**
          102      * 加密字符串
          103      * 
          104      * @param strIn
          105      *            需加密的字符串
          106      * @return 加密后的字符串
          107      * @throws Exception
          108      */
          109     public String encrypt(String strIn) throws Exception {
          110         return byteArr2HexStr(encrypt(strIn.getBytes()));
          111     }
          112 
          113     /**
          114      * 解密字節數組
          115      * 
          116      * @param arrB
          117      *            需解密的字節數組
          118      * @return 解密后的字節數組
          119      * @throws Exception
          120      */
          121     public byte[] decrypt(byte[] arrB) throws Exception {
          122         return decryptCipher.doFinal(arrB);
          123     }
          124 
          125     /**
          126      * 解密字符串
          127      * 
          128      * @param strIn
          129      *            需解密的字符串
          130      * @return 解密后的字符串
          131      * @throws Exception
          132      */
          133     public String decrypt(String strIn) throws Exception {
          134         return new String(decrypt(hexStr2ByteArr(strIn)));
          135     }
          136 
          137     /**
          138      * 從指定字符串生成密鑰,密鑰所需的字節數組長度為8位 不足8位時后面補0,超出8位只取前8位
          139      * 
          140      * @param arrBTmp
          141      *            構成該字符串的字節數組
          142      * @return 生成的密鑰
          143      * @throws java.lang.Exception
          144      */
          145     private Key getKey(byte[] arrBTmp) throws Exception {
          146         // 創建一個空的8位字節數組(默認值為0)
          147         byte[] arrB = new byte[8];
          148 
          149         // 將原始字節數組轉換為8位
          150         for (int i = 0; i < arrBTmp.length && i < arrB.length; i++) {
          151             arrB[i] = arrBTmp[i];
          152         }
          153 
          154         // 生成密鑰
          155         Key key = new javax.crypto.spec.SecretKeySpec(arrB, "DES");
          156 
          157         return key;
          158     }
          159 }
          160 

          posted on 2009-05-24 11:18 YeeYang 閱讀(6713) 評論(0)  編輯  收藏 所屬分類: 程序設計

          主站蜘蛛池模板: 潞西市| 淄博市| 西安市| 阜南县| 中西区| 洪泽县| 大名县| 景谷| 宣威市| 遂川县| 庆安县| 皋兰县| 儋州市| 乌兰浩特市| 宿州市| 赤峰市| 志丹县| 龙井市| 卓尼县| 安远县| 安化县| 航空| 长治市| 砚山县| 涿州市| 梓潼县| 耒阳市| 南岸区| 安康市| 江达县| 甘谷县| 西宁市| 日喀则市| 英超| 墨脱县| 铜鼓县| 阿拉善左旗| 财经| 青海省| 东阳市| 英吉沙县|