使用DES算法进行加密和解密

阅读更多
java 代码
  1. package com.gemt.dataswap.security;   
  2.   
  3. import java.security.Security;   
  4. import javax.crypto.Cipher;   
  5. import javax.crypto.KeyGenerator;   
  6. import javax.crypto.SecretKey;   
  7. import javax.crypto.spec.SecretKeySpec;   
  8. import com.gemt.dataswap.util.Constants;   
  9.   
  10. public class DES {    
  11.     public static int _DES = 1;    
  12.     public static int _DESede = 2;    
  13.     public static int _Blowfish = 3;    
  14.     private Cipher p_Cipher;    
  15.     private SecretKey p_Key;    
  16.     private String p_Algorithm;   
  17.        
  18.     private void selectAlgorithm(int al) {    
  19.         switch (al) {    
  20.             default:    
  21.             case 1:    
  22.                 this.p_Algorithm = "DES";    
  23.                 break;    
  24.             case 2:    
  25.                 this.p_Algorithm = "DESede";    
  26.                 break;    
  27.             case 3:    
  28.                 this.p_Algorithm = "Blowfish";    
  29.                 break;    
  30.         }    
  31.     }   
  32.        
  33.     public DES(int algorithm) throws Exception {    
  34.         this.selectAlgorithm(algorithm);    
  35.         Security.addProvider(new com.sun.crypto.provider.SunJCE());    
  36.         this.p_Cipher = Cipher.getInstance(this.p_Algorithm);    
  37.     }   
  38.        
  39.     public byte[] getKey() {    
  40.         return this.checkKey().getEncoded();    
  41.     }   
  42.        
  43.     private SecretKey checkKey() {    
  44.         try {    
  45.             if (this.p_Key == null) {    
  46.                 KeyGenerator keygen = KeyGenerator.getInstance(this.p_Algorithm);    
  47.                 /*   
  48.                 SecureRandom sr = new SecureRandom(key.getBytes());   
  49.                 keygen.init(168, sr);*/    
  50.                 this.p_Key = keygen.generateKey();    
  51.             }    
  52.         }    
  53.         catch (Exception nsae) {}    
  54.         return this.p_Key;    
  55.     }   
  56.        
  57.     public void setKey(byte[] enckey) {    
  58.         this.p_Key = new SecretKeySpec(enckey, this.p_Algorithm);    
  59.     }   
  60.        
  61.     public byte[] encode(byte[] data) throws Exception {    
  62.         this.p_Cipher.init(Cipher.ENCRYPT_MODE, this.checkKey());    
  63.         return this.p_Cipher.doFinal(data);    
  64.     }   
  65.        
  66.     public byte[] decode(byte[] encdata, byte[] enckey) throws Exception {    
  67.         this.setKey(enckey);    
  68.         this.p_Cipher.init(Cipher.DECRYPT_MODE, this.p_Key);    
  69.         return this.p_Cipher.doFinal(encdata);    
  70.     }   
  71.        
  72.     public String byte2hex(byte[] b) {    
  73.         String hs = "";    
  74.         String stmp = "";    
  75.         for (int i = 0; i < b.length; i++) {    
  76.             stmp = Integer.toHexString(b[i] & 0xFF);    
  77.             if (stmp.length() == 1) {    
  78.                 hs += "0" + stmp;    
  79.             }    
  80.             else {    
  81.                 hs += stmp;    
  82.             }    
  83.         }    
  84.         return hs.toUpperCase();    
  85.     }   
  86.        
  87.     public byte[] hex2byte(String hex) throws IllegalArgumentException {    
  88.         if (hex.length() % 2 != 0) {    
  89.             throw new IllegalArgumentException();    
  90.         }    
  91.         char[] arr = hex.toCharArray();    
  92.         byte[] b = new byte[hex.length() / 2];    
  93.         for (int i = 0, j = 0, l = hex.length(); i < l; i++, j++) {    
  94.             String swap = "" + arr[i++] + arr[i];    
  95.             int byteint = Integer.parseInt(swap, 16) & 0xFF;    
  96.             b[j] = new Integer(byteint).byteValue();    
  97.         }    
  98.         return b;    
  99.     }   
  100.        
  101.     /**  
  102.      * this is DES algorithm, the string will be encode become hex  
  103.      * @param info  
  104.      * @return  
  105.      * @throws Exception  
  106.      */  
  107.     public String encode(String info, byte[] key) {   
  108.         setKey(key);   
  109.         try{   
  110.             return byte2hex(encode(info.getBytes()));   
  111.         }   
  112.         catch (Exception e)   
  113.         {   
  114.             return info;   
  115.         }   
  116.     }   
  117.        
  118.     /**  
  119.      * this is DES algorithm, the string will be decode from hex text  
  120.      * @param info  
  121.      * @return  
  122.      * @throws Exception  
  123.      */    
  124.     public String decode(String info, byte[] key) {   
  125.         try {   
  126.             return new String(decode(hex2byte(info), key));   
  127.         }   
  128.         catch (Exception e)   
  129.         {   
  130.             return info;   
  131.         }   
  132.     }   
  133.        
  134.     public String decode(String info, String hexkey) throws IllegalArgumentException, Exception {   
  135.         return new String(decode(hex2byte(info), hex2byte(hexkey)));   
  136.     }   
  137.        
  138.     public static void main(String[] args) throws Exception {   
  139.         /*  
  140.         String info = "要加密的字串";   
  141.         System.out.println("region string:" + info);   
  142.         byte[] key; //密钥文件(byte)   
  143.         DES des = new DES(DES._DESede); // 声明DES   
  144.         //key = des.getKey(); //获取随机生成的密钥  
  145.         key = "thisisgeomatthisisgeomat".getBytes();   
  146.         des.setKey(key);  
  147.         System.out.println("key's length is " + key.length);  
  148.         System.out.println("encrypted key(byte):" + new String(key));   
  149.         String hexkey = des.byte2hex(key); //生成十六进制密钥   
  150.         System.out.println("encrypted key(hex):" + hexkey);   
  151.         byte[] enc = des.encode(info.getBytes()); //生成加密文件(byte)   
  152.         System.out.println("encrypted string(byte):" + new String(enc));   
  153.         String hexenc = des.byte2hex(enc); //生成十六进制加密文件   
  154.         System.out.println("encrypted string(hex):" + hexenc);   
  155.         byte[] dec = des.decode(enc, des.hex2byte(hexkey)); //解密文件,其中转换十六进制密钥为byte   
  156.         System.out.println("decrypted string:" + new String(dec)); //生成解密文件字符串, 与info相同  
  157.         */  
  158.         DES des = new DES(DES._DESede);   
  159.         String info = "大家好,this is a encode & decode test 9875603421???";   
  160.         String passinfo = des.encode(info, Constants.PASSWORD_KEY);   
  161.         System.out.println("passinfo is :: " + passinfo);   
  162.            
  163.         String oldStr = des.decode(passinfo, Constants.PASSWORD_KEY);   
  164.         System.out.println("old string is :: " + oldStr);   
  165.     }    
  166. }  

你可能感兴趣的:(算法,Security,J#,SUN)