DES加密、解密字符串算法(java版)

  1. DESPlus.java   
  2.   
  3. /**  
  4.  * @author    
  5.  * @company   leemenz (C) copyright  
  6.  * @time      Nov 1, 2006  10:18:41 AM  
  7.  * @version   1.0.0.0  
  8.  * @package   com.des  
  9.  */  
  10. package com.des;   
  11.   
  12. import java.security.*;   
  13. import javax.crypto.*;   
  14.   
  15. public class DESPlus {   
  16.  private static String strDefaultKey = "national";   
  17.   
  18.  private Cipher encryptCipher = null;   
  19.   
  20.  private Cipher decryptCipher = null;   
  21.   
  22.  /**  
  23.   * 将byte数组转换为表示16进制值的字符串, 如:byte[]{8,18}转换为:0813, 和public static byte[]  
  24.   * hexStr2ByteArr(String strIn) 互为可逆的转换过程  
  25.   *   
  26.   * @param arrB  
  27.   *            需要转换的byte数组  
  28.   * @return 转换后的字符串  
  29.   * @throws Exception  
  30.   *             本方法不处理任何异常,所有异常全部抛出  
  31.   */  
  32.  public static String byteArr2HexStr(byte[] arrB) throws Exception {   
  33.   int iLen = arrB.length;   
  34.   // 每个byte用两个字符才能表示,所以字符串的长度是数组长度的两倍   
  35.   StringBuffer sb = new StringBuffer(iLen * 2);   
  36.   for (int i = 0; i < iLen; i++) {   
  37.    int intTmp = arrB[i];   
  38.    // 把负数转换为正数   
  39.    while (intTmp < 0) {   
  40.     intTmp = intTmp + 256;   
  41.    }   
  42.    // 小于0F的数需要在前面补0   
  43.    if (intTmp < 16) {   
  44.     sb.append("0");   
  45.    }   
  46.    sb.append(Integer.toString(intTmp, 16));   
  47.   }   
  48.   return sb.toString();   
  49.  }   
  50.   
  51.  /**  
  52.   * 将表示16进制值的字符串转换为byte数组, 和public static String byteArr2HexStr(byte[] arrB)  
  53.   * 互为可逆的转换过程  
  54.   *   
  55.   * @param strIn  
  56.   *            需要转换的字符串  
  57.   * @return 转换后的byte数组  
  58.   * @throws Exception  
  59.   *             本方法不处理任何异常,所有异常全部抛出  
  60.   * @author <a href="mailto:leo841001@163.com">LiGuoQing</a>  
  61.   */  
  62.  public static byte[] hexStr2ByteArr(String strIn) throws Exception {   
  63.   byte[] arrB = strIn.getBytes();   
  64.   int iLen = arrB.length;   
  65.   
  66.   // 两个字符表示一个字节,所以字节数组长度是字符串长度除以2   
  67.   byte[] arrOut = new byte[iLen / 2];   
  68.   for (int i = 0; i < iLen; i = i + 2) {   
  69.    String strTmp = new String(arrB, i, 2);   
  70.    arrOut[i / 2] = (byte) Integer.parseInt(strTmp, 16);   
  71.   }   
  72.   return arrOut;   
  73.  }   
  74.   
  75.  /**  
  76.   * 默认构造方法,使用默认密钥  
  77.   *   
  78.   * @throws Exception  
  79.   */  
  80.  public DESPlus() throws Exception {   
  81.   this(strDefaultKey);   
  82.  }   
  83.   
  84.  /**  
  85.   * 指定密钥构造方法  
  86.   *   
  87.   * @param strKey  
  88.   *            指定的密钥  
  89.   * @throws Exception  
  90.   */  
  91.  public DESPlus(String strKey) throws Exception {   
  92.   Security.addProvider(new com.sun.crypto.provider.SunJCE());   
  93.   Key key = getKey(strKey.getBytes());   
  94.   
  95.   encryptCipher = Cipher.getInstance("DES");   
  96.   encryptCipher.init(Cipher.ENCRYPT_MODE, key);   
  97.   
  98.   decryptCipher = Cipher.getInstance("DES");   
  99.   decryptCipher.init(Cipher.DECRYPT_MODE, key);   
  100.  }   
  101.   
  102.  /**  
  103.   * 加密字节数组  
  104.   *   
  105.   * @param arrB  
  106.   *            需加密的字节数组  
  107.   * @return 加密后的字节数组  
  108.   * @throws Exception  
  109.   */  
  110.  public byte[] encrypt(byte[] arrB) throws Exception {   
  111.   return encryptCipher.doFinal(arrB);   
  112.  }   
  113.   
  114.  /**  
  115.   * 加密字符串  
  116.   *   
  117.   * @param strIn  
  118.   *            需加密的字符串  
  119.   * @return 加密后的字符串  
  120.   * @throws Exception  
  121.   */  
  122.  public String encrypt(String strIn) throws Exception {   
  123.   return byteArr2HexStr(encrypt(strIn.getBytes()));   
  124.  }   
  125.   
  126.  /**  
  127.   * 解密字节数组  
  128.   *   
  129.   * @param arrB  
  130.   *            需解密的字节数组  
  131.   * @return 解密后的字节数组  
  132.   * @throws Exception  
  133.   */  
  134.  public byte[] decrypt(byte[] arrB) throws Exception {   
  135.   return decryptCipher.doFinal(arrB);   
  136.  }   
  137.   
  138.  /**  
  139.   * 解密字符串  
  140.   *   
  141.   * @param strIn  
  142.   *            需解密的字符串  
  143.   * @return 解密后的字符串  
  144.   * @throws Exception  
  145.   */  
  146.  public String decrypt(String strIn) throws Exception {   
  147.   return new String(decrypt(hexStr2ByteArr(strIn)));   
  148.  }   
  149.   
  150.  /**  
  151.   * 从指定字符串生成密钥,密钥所需的字节数组长度为8位 不足8位时后面补0,超出8位只取前8位  
  152.   *   
  153.   * @param arrBTmp  
  154.   *            构成该字符串的字节数组  
  155.   * @return 生成的密钥  
  156.   * @throws java.lang.Exception  
  157.   */  
  158.  private Key getKey(byte[] arrBTmp) throws Exception {   
  159.   // 创建一个空的8位字节数组(默认值为0)   
  160.   byte[] arrB = new byte[8];   
  161.   
  162.   // 将原始字节数组转换为8位   
  163.   for (int i = 0; i < arrBTmp.length && i < arrB.length; i++) {   
  164.    arrB[i] = arrBTmp[i];   
  165.   }   
  166.   
  167.   // 生成密钥   
  168.   Key key = new javax.crypto.spec.SecretKeySpec(arrB, "DES");   
  169.   
  170.   return key;   
  171.  }   
  172. }   
  173.   
  174. 测试程序  Test.java   
  175.   
  176. /**  
  177.  * @author    李国庆  
  178.  * @company   leemenz (C) copyright  
  179.  * @time      Nov 1, 2006  10:24:06 AM  
  180.  * @version   1.0.0.0  
  181.  * @package   com.des  
  182.  */  
  183. package com.des;   
  184.   
  185. /**  
  186.  * @author Administrator  
  187.  *  
  188.  */  
  189. public class Test {   
  190.   
  191.  /**  
  192.   * @param args  
  193.   */  
  194.  public static void main(String[] args) {   
  195.   // TODO Auto-generated method stub   
  196.   try {   
  197.    String test = "Hellow Word!";   
  198.    //DESPlus des = new DESPlus();//默认密钥   
  199.    DESPlus des = new DESPlus("leemenz");//自定义密钥   
  200.    System.out.println("加密前的字符:"+test);   
  201.    System.out.println("加密后的字符:"+des.encrypt(test));   
  202.    System.out.println("解密后的字符:"+des.decrypt(des.encrypt(test)));   
  203.   } catch (Exception e) {   
  204.    // TODO: handle exception   
  205.    e.printStackTrace();   
  206.   }   
  207.  }   
  208. }  
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值