java DES加密解密

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)); 
    } 
}


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值