打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
Des加密(转:http://www.cnblogs.com/mingforyou/p/4107637.html)
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"));    }}

本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
AVA版的DES加密解密
常用加密算法的Java实现总结(二)
Android 和 PHP 之间进行数据加密传输
字节数组转成16进制
应用AES技术加密/解密字符串
Java AES加密实现
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服