AES加密算法在java,AS,JS中的实现_密码等的加密互解

三方只要在编码方式,key,vi中设置一样,就可以进行跨语言加密解密,

首先是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的架包

代码如下:

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/1830792

原文地址:https://www.cnblogs.com/heavens/p/5306630.html