码迷,mamicode.com
首页 > 其他好文 > 详细

3DES双倍长加密

时间:2018-06-14 15:09:02      阅读:220      评论:0      收藏:0      [点我收藏+]

标签:uppercase   ram   ||   indexof   data   正式   trace   要求   vat   

结果与DES算法工具一致
import java.security.SecureRandom;
import javax.crypto.Cipher;
import javax.crypto.SecretKey;
import javax.crypto.SecretKeyFactory;
import javax.crypto.spec.DESKeySpec;
public class ceshi2 {
     public static void main(String[] args) {
           String key = "F2C04AD9F598EE61C424C9C7D39BA75F";
           String data =  "06321643FF8B67EB";
           String des = encryptECB3Des(key,data);
           System.out.println(des);
     }
     
    public static String encryptECB3Des(String key, String src) { 
        System.out.println("encryptECB3Des->" + "key:" + key); 
        System.out.println("encryptECB3Des->" + "src:" + src); 
        int len = key.length(); 
        if (key == null || src == null) { 
            return null
        } 
        if (src.length() % 16 != 0) { 
            return null
        } 
        if (len == 32) { 
            String outData = ""
            String str = ""
            for (int i = 0; i < src.length() / 16; i++) { 
                str = src.substring(i * 16, (i + 1) * 16); 
                outData += encECB3Des(key, str); 
            } 
            return outData; 
        } 
        return null
    } 
 
    public static String encECB3Des(String key, String src) { 
        byte[] temp = null
        byte[] temp1 = null
        temp1 = encryptDes(hexStringToBytes(key.substring(0, 16)), hexStringToBytes(src)); 
        temp = decryptDes(hexStringToBytes(key.substring(16, 32)), temp1); 
        temp1 = encryptDes(hexStringToBytes(key.substring(0, 16)), temp); 
        return bytesToHexString(temp1); 
    } 
 
    public static String decECB3Des(String key, String src) { 
        byte[] temp2 = decryptDes(hexStringToBytes(key.substring(0, 16)), hexStringToBytes(src)); 
        byte[] temp1 = encryptDes(hexStringToBytes(key.substring(16, 32)), temp2); 
        byte[] dest = decryptDes(hexStringToBytes(key.substring(0, 16)), temp1); 
        return bytesToHexString(dest); 
    } 
   
    public static String bytesToHexString(byte[] src) {
           StringBuilder stringBuilder = new StringBuilder("");
           if (src == null || src.length <= 0) {
                return null;
           }
           for (int i = 0; i < src.length; i++) {
                int v = src[i] & 0xFF;
                String hv = Integer.toHexString(v);
                if (hv.length() < 2) {
                     stringBuilder.append(0);
                }
                stringBuilder.append(hv);
           }
           return stringBuilder.toString();
     }
   
 
    public static byte[] hexStringToBytes(String hexString) {
           if (hexString == null || hexString.equals("")) {
                return null;
           }
           hexString = hexString.toUpperCase();
           int length = hexString.length() / 2;
           char[] hexChars = hexString.toCharArray();
           byte[] d = new byte[length];
           for (int i = 0; i < length; i++) {
                int pos = i * 2;
                d[i] = (byte) (charToByte(hexChars[pos]) << 4 | charToByte(hexChars[pos + 1]));
           }
           return d;
     }
     private static byte charToByte(char c) {
           return (byte) "0123456789ABCDEF".indexOf(c);
     }
   
   
    /**
     * 3DES(双倍长) 解密
     * 
     * @param keybyte
     * @param src
     * @return
     */ 
    public static String decryptECB3Des(String key, String src) { 
        if (key == null || src == null) { 
            return null
        } 
        if (src.length() % 16 != 0) { 
            return null
        } 
        if (key.length() == 32) { 
            String outData = ""
            String str = ""
            for (int i = 0; i < src.length() / 16; i++) { 
                str = src.substring(i * 16, (i + 1) * 16); 
                outData += decECB3Des(key, str); 
            } 
            return outData; 
        } 
        return null
    } 
   
    /**
    * DES加密
    * 
    */ 
   public static byte[] encryptDes(byte[] key, byte[] src) { 
       try
           // 创建一个DESKeySpec对象 
           DESKeySpec desKey = new DESKeySpec(key); 
           // 创建一个密匙工厂 
           SecretKeyFactory keyFactory = SecretKeyFactory.getInstance("DES"); 
           // 将DESKeySpec对象转换成SecretKey对象 
           SecretKey secretKey = keyFactory.generateSecret(desKey); 
           // Cipher对象实际完成解密操作 
           Cipher cipher = Cipher.getInstance("DES/ECB/NoPadding"); 
           // 用密匙初始化Cipher对象 
           cipher.init(Cipher.ENCRYPT_MODE, secretKey); 
           // 现在,获取数据并加密 
           // 正式执行加密操作 
           return cipher.doFinal(src); 
       } catch (Exception e) { 
           e.printStackTrace(); 
       } 
       return null
   } 
 
   /**
    * des解密
    * 
    * @param key
    * @param src
    * @return
    */ 
   public static byte[] decryptDes(byte[] key, byte[] src) { 
       try
           // DES算法要求有一个可信任的随机数源 
           SecureRandom random = new SecureRandom(); 
           // 创建一个DESKeySpec对象 
           DESKeySpec desKey = new DESKeySpec(key); 
           // 创建一个密匙工厂 
           SecretKeyFactory keyFactory = SecretKeyFactory.getInstance("DES"); 
           // 将DESKeySpec对象转换成SecretKey对象 
           SecretKey secretKey = keyFactory.generateSecret(desKey); 
           // Cipher对象实际完成解密操作 
           Cipher cipher = Cipher.getInstance("DES/ECB/NoPadding"); 
           // 用密匙初始化Cipher对象 
           cipher.init(Cipher.DECRYPT_MODE, secretKey, random); 
           // 现在,获取数据并加密 
           // 正式执行加密操作 
           return cipher.doFinal(src); 
       } catch (Exception e) { 
           e.printStackTrace(); 
       } 
       return null
   } 
}

3DES双倍长加密

标签:uppercase   ram   ||   indexof   data   正式   trace   要求   vat   

原文地址:https://www.cnblogs.com/bchange/p/9181989.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!