• 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

  • 相关阅读:
    行转列
    multipath 安装配置
    网卡绑定
    numa对MySQL多实例性能影响
    Fatal NI connect error 12170
    REVOKE DBA权限要小心
    Oracle 数据库整理表碎片
    listagg 函数
    10046 事件补充
    tkprof 解释
  • 原文地址:https://www.cnblogs.com/heavens/p/5306630.html
Copyright © 2020-2023  润新知