zoukankan      html  css  js  c++  java
  • 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"));
        }
    
    }
  • 相关阅读:
    软件架构——”淘宝网”质量属性研究
    漫谈架构——读后感
    问题账户需求分析
    关于《软件需求分析》需要掌握哪些必要的内容的总结与思考------读后感
    人月神话阅读笔记4
    **系统项目目标文档
    人月神话阅读笔记3
    人月神话阅读笔记2
    人月神话阅读笔记1
    问题账户需求分析
  • 原文地址:https://www.cnblogs.com/mingforyou/p/4107637.html
Copyright © 2011-2022 走看看