2012年3月11日星期日

序列化与反序列化中的AES加密


  1. import java.io.File;  
  2. import java.io.FileInputStream;  
  3. import java.io.FileOutputStream;  
  4. import java.io.ObjectInputStream;  
  5. import java.io.ObjectOutputStream;  
  6. import java.io.Serializable;  
  7. import java.security.AlgorithmParameters;  
  8. import java.security.MessageDigest;  
  9. import java.security.spec.AlgorithmParameterSpec;  
  10. import java.security.spec.KeySpec;  
  11. import java.util.Date;  
  12.   
  13. import javax.crypto.Cipher;  
  14. import javax.crypto.SealedObject;  
  15. import javax.crypto.SecretKey;  
  16. import javax.crypto.SecretKeyFactory;  
  17. import javax.crypto.spec.IvParameterSpec;  
  18. import javax.crypto.spec.PBEKeySpec;  
  19. import javax.crypto.spec.SecretKeySpec;  
  20.   
  21. import com.yoursite.bean.UserInfo;  
  22.   
  23. public class SerializationUtil {  
  24.     static String algorithm = "AES";   
  25.     static Cipher encrypter = null, decrypter = null;  
  26.     static {   
  27.         setupCrypt();  
  28.     }  
  29.   
  30.     /** 
  31.      * @param args 
  32.      */  
  33.     public static void main(String[] args) throws Exception {  
  34.         UserInfo customer = new UserInfo("河蟹""xxx@gmail"new Date(0));  
  35.         File file = new File("D:\\instance.obj");  
  36.         serialization(file,customer);  
  37.         customer = (UserInfo)deserialization(file);  
  38.         System.out.println(customer);  
  39.     }  
  40.   
  41.     // 反序列化对象  
  42.     public static Object deserialization(File file) throws Exception {  
  43.   
  44.         ObjectInputStream in = null;  
  45.         SealedObject sealed = null;  
  46.         Object object = null;  
  47.         try {  
  48.             in = new ObjectInputStream(new FileInputStream(file));  
  49.             sealed = (SealedObject) in.readObject();  
  50.             object = sealed.getObject(decrypter);   
  51.         } catch (Exception e) {  
  52.             throw e;  
  53.         } finally {  
  54.             if (in != null)  
  55.                 in.close();  
  56.         }  
  57.         return object;  
  58.     }  
  59.   
  60.     // 序列化对象  
  61.     @SuppressWarnings("unused")  
  62.     public static void serialization(File file,Object object) throws Exception {  
  63.         ObjectOutputStream out = null;  
  64.         SealedObject sealed = null;  
  65.         try {  
  66.             out = new ObjectOutputStream(new FileOutputStream(file));   
  67.             sealed = new SealedObject((Serializable) object, encrypter);  
  68.             out.writeObject(sealed);  
  69.         } catch (Exception e) {  
  70.             throw e;  
  71.         } finally {  
  72.             if (out != null)  
  73.                 out.close();  
  74.         }  
  75.     }  
  76.   
  77.     private static byte[] getMD5(String input) {  
  78.         try {  
  79.             byte[] bytesOfMessage = input.getBytes("UTF-8");  
  80.             MessageDigest md = MessageDigest.getInstance("MD5");  
  81.             return md.digest(bytesOfMessage);  
  82.         } catch (Exception e) {  
  83.             return null;  
  84.         }  
  85.     }   
  86.     @SuppressWarnings("unused")  
  87.     private static void setupCrypt() {  
  88.         String key ="helloworld";  
  89.         SecretKeySpec skey = new SecretKeySpec(getMD5(key), algorithm);  
  90.         // Create an 8-byte initialization vector  
  91.         byte[] iv = new byte[] { 0x000x010x020x030x040x050x06,  
  92.                 0x070x080x090x0a0x0b0x0c0x0d0x0e0x0f };  
  93.   
  94.         AlgorithmParameterSpec paramSpec = new IvParameterSpec(iv);  
  95.         try {  
  96.             encrypter = Cipher.getInstance("AES/CBC/PKCS5Padding");  
  97.             decrypter = Cipher.getInstance("AES/CBC/PKCS5Padding");  
  98.             // CBC requires an initialization vector  
  99.             encrypter.init(Cipher.ENCRYPT_MODE, skey, paramSpec);  
  100.             decrypter.init(Cipher.DECRYPT_MODE, skey, paramSpec);  
  101.         } catch (Exception e) {  
  102.             e.printStackTrace();  
  103.         }  
  104.     }  
  105.       
  106.     @SuppressWarnings("unused")  
  107.     private static void setupCrypt2() {   
  108.         //key需要128  
  109.         String key = "81865011520190145659841015258206940634698416000116687963543955828649380740817034326700266554532335762191268533799481074944660845";  
  110.         char[] password = key.toCharArray();  
  111.         byte[] salt = "123456".getBytes();  
  112.         SecretKeyFactory factory = null;  
  113.         SecretKey tmp = null;  
  114.         KeySpec spec = new PBEKeySpec(password, salt, 1024128);  
  115.         try {  
  116.             factory = SecretKeyFactory.getInstance("PBKDF2WithHmacSHA1");  
  117.             tmp = factory.generateSecret(spec);  
  118.         } catch (Exception e) {  
  119.             e.printStackTrace();  
  120.         }  
  121.         SecretKey secret = new SecretKeySpec(tmp.getEncoded(), algorithm);  
  122.         try {  
  123.             encrypter = Cipher.getInstance("AES/CBC/PKCS5Padding");  
  124.             encrypter.init(Cipher.ENCRYPT_MODE, secret);  
  125.             AlgorithmParameters params = encrypter.getParameters();  
  126.             byte[] iv = params.getParameterSpec(IvParameterSpec.class).getIV();  
  127.             decrypter = Cipher.getInstance("AES/CBC/PKCS5Padding");  
  128.             decrypter.init(Cipher.DECRYPT_MODE, secret, new IvParameterSpec(iv));  
  129.         } catch (Exception e) {  
  130.             // TODO Auto-generated catch block  
  131.             e.printStackTrace();  
  132.         }   
  133.     }  
  134. @SuppressWarnings("unused")  
  135.     private static void setupCrypt3() {   
  136.         //16位  
  137.         String key = "0123456789123456";  
  138.         SecretKeySpec skeySpec = new SecretKeySpec(key.getBytes(), algorithm);  
  139.         try {  
  140.             encrypter = Cipher.getInstance(algorithm);  
  141.             encrypter.init(Cipher.ENCRYPT_MODE, skeySpec);  
  142.             decrypter = Cipher.getInstance(algorithm);  
  143.             decrypter.init(Cipher.DECRYPT_MODE, skeySpec);  
  144.         } catch (Exception e) {  
  145.             // TODO Auto-generated catch block  
  146.             e.printStackTrace();  
  147.         }   
  148.     }  
  149. }  

一些有用链接 
http://stackoverflow.com/questions/992019/java-256bit-aes-encryption/992413#992413 
http://www.ibm.com/developerworks/cn/java/j-5things1/?ca=drs-cn-0504 

没有评论:

发表评论