java DES加密解密

来源:互联网 发布:淘宝新店做什么活动 编辑:程序博客网 时间:2024/05/02 15:49
Java密码学结构设计遵循两个原则:

  (1)算法的独立性和可靠性。

  (2)实现的独立性和相互作用性。

  算法的独立性是通过定义密码服务类来获得。用户只需了解密码算法的概念,而不用去关心如何实现这些概念。实现的独立性和相互作用性通过密码服务提供器来实现。密码服务提供器是实现一个或多个密码服务的一个或多个程序包。软件开发商根据一定接口,将各种算法实现后,打包成一个提供器,用户可以安装不同的提供器。安装和配置提供器,可将包含提供器的ZIP和JAR文件放在CLASSPATH下,再编辑Java安全属性文件来设置定义一个提供器。Java运行环境Sun版本时, 提供一个缺省的提供器Sun。

  DES算法简介

  DES(Data Encryption Standard)是发明最早的最广泛使用的分组对称加密算法。DES算法的入口参数有三个:Key、Data、Mode。其中Key为8个字节共64位,是DES算法的工作密钥;Data也为8个字节64位,是要被加密或被解密的数据;Mode为DES的工作方式,有两种:加密或解密。

  DES算法工作流程如下:若Mode为加密模式,则利用Key 对数据Data进行加密, 生成Data的密码形式(64位)作为DES的输出结果;如Mode为解密模式,则利用Key对密码形式的数据Data进行解密,还原为Data的明码形式(64位)作为DES的输出结果。在通信网络的两端,双方约定一致的Key,在通信的源点用Key对核心数据进行DES加密,然后以密码形式在公共通信网(如电话网)中传输到通信网络的终点,数据到达目的地后,用同样的Key对密码数据进行解密,便再现了明码形式的核心数据。这样,便保证了核心数据在公共通信网中传输的安全性和可靠性。

  也可以通过定期在通信网络的源端和目的端同时改用新的Key,便能更进一步提高数据的保密性。

 
        DES 算法实例:
import java.security.SecureRandom;  import javax.crypto.Cipher; import javax.crypto.SecretKey; import javax.crypto.SecretKeyFactory; import javax.crypto.spec.DESKeySpec;  /**  * DES加密解密工具类  * @author Front.Tang [Front.Tang@qq.com]  * @version 2012-5-14 上午09:32:43  */ public class DESEncrypt {      private static final String PASSWORD_CRYPT_KEY = "Front.Tang";     private static final String DES = "DES";          /**      * DES加密      * @param src 要加密的数据      * @param key 加密取用的key。八位字符串      * @return      * @throws Exception      */     public static String encrypt(String src, String key){          if(key==null||key.length()==0) {             key = PASSWORD_CRYPT_KEY;         }         byte bb[] = null;         String result = null;         try {             Cipher cipher = getCipher(Cipher.ENCRYPT_MODE,key);           // 正式执行加密操作             bb = cipher.doFinal(src.getBytes());             result = Byte2Hex(bb);         } catch(Exception e) {             result = null;         }         return result;              }          /**      * DES解密      * @param src 要解密的数据源      * @param key 加密时取用的key,八位字符串      * @return      * @throws Exception      */     public static String decrypt(String src, String key) {          if(key==null||key.length()==0) {             key = PASSWORD_CRYPT_KEY;         }         byte[] result = null;         Cipher cipher = null;         try {             result = String2Byte(src);             cipher = getCipher(Cipher.DECRYPT_MODE,key);             // 现在,获取数据并解密              // 正式执行解密操作              return new String(cipher.doFinal(result));         } catch(Exception e) {             return null;         }     }           /**      * 根据 mode 和 key 初始化Cipher对象      * @param mode 加密还是解密      * @param key 密匙      * @return Cipher对象      * @throws Exception      */     public static Cipher getCipher(int mode,String key) throws Exception {         // DES算法要求有一个可信任的随机数源          SecureRandom sr = new SecureRandom();          // 从原始密匙数据创建一个DESKeySpec对象          DESKeySpec dks = new DESKeySpec(key.getBytes());          // 创建一个密匙工厂,然后用它把DESKeySpec对象转换成          // 一个SecretKey对象          SecretKeyFactory keyFactory = SecretKeyFactory.getInstance(DES);          SecretKey securekey = keyFactory.generateSecret(dks);          // Cipher对象实际完成解密操作          Cipher cipher = Cipher.getInstance(DES);          // 用密匙初始化Cipher对象          cipher.init(mode, securekey, sr);          return cipher;     }          /**      * 将byte[] 转成 hex 字符串      * @param bb byte数组      * @return      */     public static String Byte2Hex(byte[] bb) {         StringBuilder buff = new StringBuilder(bb.length);         String sTemp;         for(int i=0;i<bb.length;i++){             sTemp = Integer.toHexString(0xFF &bb[i]);             if(sTemp.length()<2){                 buff.append(0);             }             buff.append(sTemp.toUpperCase());         }         return buff.toString();     }          /**      * 字符串转换成byte[]      * @param src 要转换的字符串      * @return      */     public static byte[] String2Byte(String src) {         int len = (src.length()/2);         byte [] result = new byte[len];         char[] achar = src.toString().toCharArray();         for(int j=0;j<len;j++){             int pos = j*2;             result[j]= ((byte)(Char2Byte(achar[pos])<<4|Char2Byte(achar[pos+1])));         }         return result;     }          /**      * 字符转成byte      * @param c       * @return      */     private static byte Char2Byte(char c){         byte  b = (byte)"0123456789ABCDEF".indexOf(c);         return b;     }               public static void main(String[] args) throws Exception {         System.out.println(encrypt("Front.Tang",PASSWORD_CRYPT_KEY));         System.out.println(decrypt("A7F816CFE0A431F921A2812309EB95A2", PASSWORD_CRYPT_KEY));     } }


原创粉丝点击