AES加密算法在java,AS,JS中的實現_密碼等的加密互解

三方只要在編碼方式,key,vi中設置同樣,就能夠進行跨語言加密解密,java

首先是java ,Base64我這裏是使用的org.apache.commons算法

Java代碼   收藏代碼
  1. package com.jueyue.crypto;  
  2.   
  3. import javax.crypto.Cipher;    
  4. import javax.crypto.spec.IvParameterSpec;    
  5. import javax.crypto.spec.SecretKeySpec;    
  6.   
  7. import org.apache.commons.codec.binary.BAES64;  
  8.     
  9.     
  10. /*******************************************************************************  
  11.  * AES加解密算法  
  12.  *   
  13.  * @author jueyue  
  14.  *   
  15.   
  16.   加密用的Key 能夠用26個字母和數字組成,最好不要用保留字符,雖然不會錯,至於怎麼裁決,我的看狀況而定  
  17.   此處使用AES-128-CBC加密模式,key須要爲16位。  
  18.    也是使用<span style="font-size: 1em; line-height: 1.5;">0102030405060708</span> 
  19.  */    
  20.     
  21. public class AES {    
  22.     
  23.     // 加密    
  24.     public static String Encrypt(String sSrc, String sKey) throws Exception {    
  25.         if (sKey == null) {    
  26.             System.out.print("Key爲空null");    
  27.             return null;    
  28.         }    
  29.         // 判斷Key是否爲16位    
  30.         if (sKey.length() != 16) {    
  31.             System.out.print("Key長度不是16位");    
  32.             return null;    
  33.         }    
  34.         byte[] raw = sKey.getBytes();    
  35.         SecretKeySpec skeySpec = new SecretKeySpec(raw, "AES");    
  36.         Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");//"算法/模式/補碼方式"    
  37.         IvParameterSpec iv = new IvParameterSpec("0102030405060708".getBytes());//使用CBC模式,須要一個向量iv,可增長加密算法的強度    
  38.         cipher.init(Cipher.ENCRYPT_MODE, skeySpec, iv);    
  39.         byte[] encrypted = cipher.doFinal(sSrc.getBytes());    
  40.     
  41.         return BAES64.encodeBAES64String(encrypted);//此處使用BAES64作轉碼功能,同時能起到2次加密的做用。    
  42.     }    
  43.     
  44.     // 解密    
  45.     public static String Decrypt(String sSrc, String sKey) throws Exception {    
  46.         try {    
  47.             // 判斷Key是否正確    
  48.             if (sKey == null) {    
  49.                 System.out.print("Key爲空null");    
  50.                 return null;    
  51.             }    
  52.             // 判斷Key是否爲16位    
  53.             if (sKey.length() != 16) {    
  54.                 System.out.print("Key長度不是16位");    
  55.                 return null;    
  56.             }    
  57.             byte[] raw = sKey.getBytes("ASCII");    
  58.             SecretKeySpec skeySpec = new SecretKeySpec(raw, "AES");    
  59.             Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");    
  60.             IvParameterSpec iv = new IvParameterSpec("0102030405060708"    
  61.                     .getBytes());    
  62.             cipher.init(Cipher.DECRYPT_MODE, skeySpec, iv);    
  63.             byte[] encrypted1 = BAES64.decodeBAES64(sSrc);//先用bAES64解密    
  64.             try {    
  65.                 byte[] original = cipher.doFinal(encrypted1);    
  66.                 String originalString = new String(original);    
  67.                 return originalString;    
  68.             } catch (Exception e) {    
  69.                 System.out.println(e.toString());    
  70.                 return null;    
  71.             }    
  72.         } catch (Exception ex) {    
  73.             System.out.println(ex.toString());    
  74.             return null;    
  75.         }    
  76.     }    
  77.     
  78.   
  79. }   

 接着是as的加密實現,是使用的as3crypto.swc的架包apache

代碼以下:session

Js代碼   收藏代碼
  1. package util  
  2. {  
  3.     import com.hurlant.crypto.symmetric.CBCMode;  
  4.     import com.hurlant.crypto.symmetric.DESKey;  
  5.       
  6.     import flash.utils.ByteArray;  
  7.       
  8.     import mx.utils.Base64Decoder;  
  9.     import mx.utils.Base64Encoder;  
  10.   
  11.     /** 
  12.      * 加密算法,對配置文件進行加密 
  13.      * */  
  14.     public class EncryptionUtil  
  15.     {  
  16.         public function EncryptionUtil()  
  17.         {  
  18.         }  
  19.         /** 
  20.          * 對字符串加密 
  21.          * */  
  22.         static public function encryption(str:String):String{  
  23.             if(!str||str.length==0){return "";}  
  24.             var key:ByteArray= new   ByteArray();  
  25.             key.writeUTFBytes("0102030405060708");  
  26.             var   iv:ByteArray= new   ByteArray();  
  27.             iv.writeUTFBytes("0102030405060708");  
  28.             var   des:DESKey=new DESKey(key);  
  29.             var cbc:CBCMode = new CBCMode(des);  
  30.             cbc.IV = iv;  
  31.             var   tmpByteArray:ByteArray=convertStringToByteArray(str);      
  32.             cbc.encrypt(tmpByteArray);  
  33.             var $base64:Base64Encoder = new Base64Encoder();     
  34.             $base64.insertNewLines =  false;//該值等於true時,輸出的結果會自動換行,默認爲true,    
  35.             $base64.encodeBytes(tmpByteArray);//這裏注意,若是想加密中文就不要使用$base64.encode();     
  36.             return $base64.toString();  
  37.         }  
  38.         /** 
  39.          * 對字符串解密 
  40.          * */  
  41.         static public function decryption(str:String):String{  
  42.             if(!str||str.length==0){return "";}  
  43.             var key:ByteArray= new   ByteArray();  
  44.             key.writeUTFBytes("0102030405060708");  
  45.             var   iv:ByteArray= new   ByteArray();  
  46.             iv.writeUTFBytes("0102030405060708");  
  47.             var   des:DESKey=new DESKey(key);  
  48.             var cbc:CBCMode = new   CBCMode(des);  
  49.             cbc.IV = iv;  
  50.             var $base64D:Base64Decoder = new Base64Decoder();     
  51.             $base64D.decode(str);//這裏注意,若是想加密中文就不要使用$base64.encode();  
  52.             var   tmpByteArray:ByteArray =$base64D.toByteArray();  
  53.             cbc.decrypt(tmpByteArray);  
  54.             return convertByteArrayToString(tmpByteArray);  
  55.         }  
  56.         static private function convertStringToByteArray(str:String):ByteArray    
  57.         {    
  58.             var bytes:ByteArray;    
  59.             if (str)    
  60.             {    
  61.                 bytes=new ByteArray();    
  62.                 bytes.writeUTFBytes(str);    
  63.             }    
  64.             return bytes;    
  65.         }    
  66.         static private function convertByteArrayToString(bytes:ByteArray):String    
  67.         {    
  68.             var str:String;    
  69.             if (bytes)    
  70.             {    
  71.                 bytes.position=0;    
  72.                 str=bytes.readUTFBytes(bytes.length);    
  73.             }    
  74.             return str;    
  75.         }    
  76.     }  
  77. }  

 最後是js的實現,js是用的CryptoJS這個包,這個搞了很久,就由於srcs沒有轉碼,仍是要細心 呀 編碼

Js代碼   收藏代碼
  1. function Encrypt(word){  
  2.          var key = CryptoJS.enc.Utf8.parse("0102030405060708");   
  3.          var iv  = CryptoJS.enc.Utf8.parse('0102030405060708');   
  4.          var srcs = CryptoJS.enc.Utf8.parse(word);  
  5.          var encrypted = CryptoJS.AES.encrypt(srcs, key, { iv: iv,mode:CryptoJS.mode.CBC});  
  6.          return encrypted.toString();  
  7.     }  
  8. function Decrypt(word){  
  9.          var key = CryptoJS.enc.Utf8.parse("0102030405060708");   
  10.          var iv  = CryptoJS.enc.Utf8.parse('0102030405060708');   
  11.          var decrypt = CryptoJS.AES.decrypt(word, key, { iv: iv,mode:CryptoJS.mode.CBC});  
  12.          return CryptoJS.enc.Utf8.stringify(decrypt).toString();  
  13.     }  

 本身也想了很久,這個key如何設置,若是設置簡單的,固定的那麼就和沒有加密同樣,由於本身基本上沒有涉及過這個領域,想了一個就是session來做爲key,緣由是key是單一的,並且不是固定的,這樣給破解就加了必定的困難,可是session,能不能在流中被截取,因此可使用session中的某些值,在即這添加一些,做爲key就能夠基本上保證,在半路不會被破解了加密

轉自:http://jueyue.iteye.com/blog/1830792url

相關文章
相關標籤/搜索