Des加密

 

package com.test;

import java.io.UnsupportedEncodingException;

import javax.crypto.Cipher;
import javax.crypto.SecretKey;
import javax.crypto.SecretKeyFactory;
import javax.crypto.spec.DESKeySpec;

public class DESUtil {

    /**
     * 加密以byte[]明文输入,byte[]密文输出
     * 
     * @param byteS
     * @return
     */
    public static byte[] getEncCode( byte[] key,byte[] byteS) {
        byte[] byteFina = null;
        Cipher cipher;
        try {
            cipher = Cipher.getInstance("DES/ECB/Nopadding");
            DESKeySpec desKey = new DESKeySpec(key);  
            //创建一个密匙工厂,然后用它把DESKeySpec转换成  
            SecretKeyFactory keyFactory = SecretKeyFactory.getInstance("DES");  
            SecretKey securekey = keyFactory.generateSecret(desKey);
            cipher.init(Cipher.ENCRYPT_MODE, securekey);
            byteFina = cipher.doFinal(byteS);
        } catch (Exception e) {
            throw new RuntimeException(
                    "Error initializing SqlMap class. Cause: " + e);
        } finally {
            cipher = null;
        }
        return byteFina;
    }

    /**
     * 解密以byte[]密文输入,以byte[]明文输出
     * 
     * @param byteD
     * @return
     */
    public static byte[] getDesCode(byte[] key,byte[] byteD) {
        Cipher cipher;
        byte[] byteFina = null;
        try {
            cipher = Cipher.getInstance("DES/ECB/Nopadding");
            DESKeySpec desKey = new DESKeySpec(key);  
            //创建一个密匙工厂,然后用它把DESKeySpec转换成  
            SecretKeyFactory keyFactory = SecretKeyFactory.getInstance("DES");  
            SecretKey securekey = keyFactory.generateSecret(desKey);
            cipher.init(Cipher.DECRYPT_MODE, securekey);
            byteFina = cipher.doFinal(byteD);
        } catch (Exception e) {
            throw new RuntimeException( e);
        } finally {
            cipher = null;
        }
        return byteFina;
    }

    
    public static String bytes2HexString(byte[] b) {
        StringBuffer returnValue = new StringBuffer();
        for (int i = 0; i < b.length; i++) {
            String hex = Integer.toHexString(b[i] & 0xFF);
            if (hex.length() == 1) {
                hex = '0' + hex;
            }            
            returnValue.append(hex.toUpperCase());
        }

        return "" + returnValue.toString() + "";
    }
        
    
    public static byte[] hexStr2ByteArray(String hexString) {  
        hexString = hexString.toLowerCase();  
        final byte[] byteArray = new byte[hexString.length() / 2];  
        int k = 0;  
        for (int i = 0; i < byteArray.length; i++) {  
            byte high = (byte) (Character.digit(hexString.charAt(k), 16) & 0xff);  
            byte low = (byte) (Character.digit(hexString.charAt(k + 1), 16) & 0xff);  
            byteArray[i] = (byte) (high << 4 | low);  
            k += 2;  
        }  
        return byteArray;  
    }  
    
    //16进制加密,返回16进制数
    public static String hexEnDes(String hexKey,String hexData){
        byte[] encCode = getEncCode(hexStr2ByteArray(hexKey), hexStr2ByteArray(hexData));
        return bytes2HexString(encCode);
    }
    
    //16进制加密,返回16进制数
    public static byte[] EnDes(byte[] hexKey, byte[] hexData) {
        byte[] encCode = getEncCode(hexKey, hexData );
        return encCode;
    }
        
    //异或
    public static byte[] xor(byte[] dest, byte[] source, int size) {
        int i;
        byte[] a;
        byte[] b;
        a = dest;
        b = source;

        for (i = 0; i < size; i++)
            a[i] ^= b[i];

        dest = a;

        return dest;
    }

    //生成MAC值
    public static String GenMac(byte[] hexKey,byte[] sData){
        
        byte[] cbuf= new byte[8+1];
        byte[] dbuf= new byte[8];
        int i=0, j=0;
        int datalen;
        byte[] smac= new byte[8];
        
        System.out.println("工作密钥:"+bytes2HexString(hexKey) );
        System.out.println("MABBUF:"+sData);
        
        if(sData.length%8 !=0 )
            datalen=8-sData.length%8;
        else
            datalen=0;

        
        byte[] mabbuf= new byte[sData.length+datalen];
        
        for(i=0; i<sData.length; i++ )
            mabbuf[i]=sData[i];
        
        System.out.println("datalen:"+datalen+", i:"+i+", j:"+j);
        
        if( datalen != 0 )
        for(j=0; j<datalen; j++ )
        {    
            mabbuf[i+j]=' ';
        }
        System.out.println("新MABBUF"+ mabbuf +"  长度:"+mabbuf.length);
        
        for(i=0; i<mabbuf.length; )
        {
            for(j=0; j<8; j++)
                dbuf[j]=mabbuf[i+j];
            
            i=i+8;            
            System.out.println("截取数据:"+bytes2HexString(dbuf));
            
            if(i==8)
                dbuf=DESUtil.xor( dbuf ,cbuf, 8);
            else
                dbuf=DESUtil.xor( dbuf ,smac, 8);
            
            System.out.println("异或结果:"+bytes2HexString(dbuf));
            
            smac=DESUtil.EnDes(hexKey, dbuf);
            
            System.out.println("加密结果:"+bytes2HexString(smac));
            
        }
        
        System.out.println("生成的MAC值:"+bytes2HexString(smac));
            
        return bytes2HexString(smac);
            
    }
    
    public static String toHexString(byte[] b) {
        String str = "";
        for (int i = 0; i < b.length; i++) {
            String hex = Integer.toHexString(b[i] & 0xFF);
            if (hex.length() == 1) {
                hex = '0' + hex;
            }
            System.out.print(hex.toUpperCase());
        }
        return str;
    }
        
    public static void printHexString(String hint, byte[] b) {
        System.out.print(hint);
        for (int i = 0; i < b.length; i++) {
            String hex = Integer.toHexString(b[i] & 0xFF);
            if (hex.length() == 1) {
                hex = '0' + hex;
            }
            System.out.print(hex.toUpperCase() + " ");
        }
        System.out.println("");
    }

    public static void main(String[] args) throws UnsupportedEncodingException {
        
        String Zmkey = "1111111111111111";  /*主密钥*/
        String mwkey = "06B73E606452153C";  /*工作密钥密文*/
        
        /*获取工作密钥明文*/
        String key = bytes2HexString(getDesCode(hexStr2ByteArray(Zmkey), hexStr2ByteArray(mwkey) ));
        String data = "9882    20140823175518        2000056000    6212960101000654250 370113198906033265测试                          00000000000000000000000023000029                    9999                                                                ";
        
        byte[] hexdata=data.getBytes( "gbk");
        
        /*生成MAC必须用工作密钥明文*/
        System.out.println( GenMac( hexStr2ByteArray(key), hexdata) );
        
    }
    
}

 

 

public class EncryDes {
    /* 加密类 */
    protected Cipher ecipher;

    /* 接密类 */
    protected Cipher dcipher;

    public EncryDes() {
        try {
            // Create the key,"emosdnah"为随即初始化密文
            String passPhrase = "emosdnah";
            /* 生成秘钥 */
            KeySpec keySpec = new DESKeySpec(passPhrase.getBytes());
            SecretKey key = SecretKeyFactory.getInstance("DES").generateSecret(
                    keySpec);
            // SecretKeySpec key = new
            // SecretKeySpec(passPhrase.getBytes(),"DES");
            /* 初始化加解密实例 */
            ecipher = Cipher.getInstance(key.getAlgorithm());
            dcipher = Cipher.getInstance(key.getAlgorithm());

            // Prepare the parameter to the ciphers
            // AlgorithmParameterSpec paramSpec = new PBEParameterSpec(salt,
            // iterationCount);
            // Create the ciphers
            ecipher.init(Cipher.ENCRYPT_MODE, key);
            dcipher.init(Cipher.DECRYPT_MODE, key);

        } catch (Exception e) {
            e.printStackTrace();
        }

    }

    /**
     * 对字符串加密
     * 
     * @param source
     *            String 要加密的字符串
     * @return byte[] 已加密的字节
     */
    public byte[] encrypt(String source) {
        try {
            // Encode the string into bytes using utf-8
            // byte[] utf8 = new sun.misc.BASE64Decoder().decodeBuffer(str);

            // Encrypt
            byte[] enc = ecipher.doFinal(source.getBytes());

            // Encode bytes to base64 to get a string
            // return new sun.misc.BASE64Encoder().encode(enc);
            return enc;
        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }

    /**
     * 对字节数组解密
     * 
     * @param buf
     *            byte[]
     * @return String
     */
    public String decrypt(byte[] buf) {
        try {
            // Decode base64 to get bytes
            // byte[] dec = new sun.misc.BASE64Decoder().decodeBuffer(str);

            // Decrypt
            byte[] utf8 = dcipher.doFinal(buf);

            // Decode using utf-8
            // return new String(utf8, "UTF8");
            return new String(utf8);
        } catch (javax.crypto.BadPaddingException e) {
        } catch (IllegalBlockSizeException e) {
            // } catch (UnsupportedEncodingException e) {
        }
        return null;
    }

    /**
     * 专用密码加密
     * 
     * @param password
     *            String
     * @return String
     */
    public String getEncPass(String password) {
        byte[] dst = encrypt(password + "        ");// 密码补足十二位
        String dstStr = "";
        for (int i = 0; i < dst.length && i < 12; i++) {// 密文只取前64位
            int cTmp = (int) dst[i] & 0xff;
            String hexStr = Integer.toHexString(cTmp);
            while (hexStr.length() < 2) {
                hexStr = "0" + hexStr;
            }
            dstStr += hexStr;
        }
        return dstStr.toUpperCase();
    }
    
    public static void main(String []args){
        EncryDes des = new EncryDes();
        System.out.println(des.getEncPass("1234567890123"));
    }

}

 

posted @ 2014-11-19 10:32  残星  阅读(1588)  评论(0编辑  收藏  举报