当前位置: 代码迷 >> JavaScript >> AES加密算法在java,AS,JS中的兑现_密码等的加密互解
  详细解决方案

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

热度:362   发布时间:2013-03-21 10:08:17.0
AES加密算法在java,AS,JS中的实现_密码等的加密互解

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

首先是java ,Base64我这里是使用的org.apache.commons

package com.jueyue.crypto;

import javax.crypto.Cipher;  
import javax.crypto.spec.IvParameterSpec;  
import javax.crypto.spec.SecretKeySpec;  

import org.apache.commons.codec.binary.BAES64;
  
  
/******************************************************************************* 
 * AES加解密算法 
 *  
 * @author jueyue 
 *  
 
  加密用的Key 可以用26个字母和数字组成,最好不要用保留字符,虽然不会错,至于怎么裁决,个人看情况而定 
  此处使用AES-128-CBC加密模式,key需要为16位。 
   也是使用0102030405060708
 */  
  
public class AES {  
  
    // 加密  
    public static String Encrypt(String sSrc, String sKey) throws Exception {  
        if (sKey == null) {  
            System.out.print("Key为空null");  
            return null;  
        }  
        // 判断Key是否为16位  
        if (sKey.length() != 16) {  
            System.out.print("Key长度不是16位");  
            return null;  
        }  
        byte[] raw = sKey.getBytes();  
        SecretKeySpec skeySpec = new SecretKeySpec(raw, "AES");  
        Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");//"算法/模式/补码方式"  
        IvParameterSpec iv = new IvParameterSpec("0102030405060708".getBytes());//使用CBC模式,需要一个向量iv,可增加加密算法的强度  
        cipher.init(Cipher.ENCRYPT_MODE, skeySpec, iv);  
        byte[] encrypted = cipher.doFinal(sSrc.getBytes());  
  
        return BAES64.encodeBAES64String(encrypted);//此处使用BAES64做转码功能,同时能起到2次加密的作用。  
    }  
  
    // 解密  
    public static String Decrypt(String sSrc, String sKey) throws Exception {  
        try {  
            // 判断Key是否正确  
            if (sKey == null) {  
                System.out.print("Key为空null");  
                return null;  
            }  
            // 判断Key是否为16位  
            if (sKey.length() != 16) {  
                System.out.print("Key长度不是16位");  
                return null;  
            }  
            byte[] raw = sKey.getBytes("ASCII");  
            SecretKeySpec skeySpec = new SecretKeySpec(raw, "AES");  
            Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");  
            IvParameterSpec iv = new IvParameterSpec("0102030405060708"  
                    .getBytes());  
            cipher.init(Cipher.DECRYPT_MODE, skeySpec, iv);  
            byte[] encrypted1 = BAES64.decodeBAES64(sSrc);//先用bAES64解密  
            try {  
                byte[] original = cipher.doFinal(encrypted1);  
                String originalString = new String(original);  
                return originalString;  
            } catch (Exception e) {  
                System.out.println(e.toString());  
                return null;  
            }  
        } catch (Exception ex) {  
            System.out.println(ex.toString());  
            return null;  
        }  
    }  
  

} 

?接着是as的加密实现,是使用的as3crypto.swc的架包

代码如下:

package util
{
	import com.hurlant.crypto.symmetric.CBCMode;
	import com.hurlant.crypto.symmetric.DESKey;
	
	import flash.utils.ByteArray;
	
	import mx.utils.Base64Decoder;
	import mx.utils.Base64Encoder;

	/**
	 * 加密算法,对配置文件进行加密
	 * */
	public class EncryptionUtil
	{
		public function EncryptionUtil()
		{
		}
		/**
		 * 对字符串加密
		 * */
		static public function encryption(str:String):String{
			if(!str||str.length==0){return "";}
			var key:ByteArray= new   ByteArray();
			key.writeUTFBytes("0102030405060708");
			var   iv:ByteArray= new   ByteArray();
			iv.writeUTFBytes("0102030405060708");
			var   des:DESKey=new DESKey(key);
			var cbc:CBCMode = new CBCMode(des);
			cbc.IV = iv;
			var   tmpByteArray:ByteArray=convertStringToByteArray(str);    
			cbc.encrypt(tmpByteArray);
			var $base64:Base64Encoder = new Base64Encoder();   
			$base64.insertNewLines =  false;//该值等于true时,输出的结果会自动换行,默认为true,  
			$base64.encodeBytes(tmpByteArray);//这里注意,如果想加密中文就不要使用$base64.encode();   
			return $base64.toString();
		}
		/**
		 * 对字符串解密
		 * */
		static public function decryption(str:String):String{
			if(!str||str.length==0){return "";}
			var key:ByteArray= new   ByteArray();
			key.writeUTFBytes("0102030405060708");
			var   iv:ByteArray= new   ByteArray();
			iv.writeUTFBytes("0102030405060708");
			var   des:DESKey=new DESKey(key);
			var cbc:CBCMode = new   CBCMode(des);
			cbc.IV = iv;
			var $base64D:Base64Decoder = new Base64Decoder();   
			$base64D.decode(str);//这里注意,如果想加密中文就不要使用$base64.encode();
			var   tmpByteArray:ByteArray =$base64D.toByteArray();
			cbc.decrypt(tmpByteArray);
			return convertByteArrayToString(tmpByteArray);
		}
		static private function convertStringToByteArray(str:String):ByteArray  
		{  
			var bytes:ByteArray;  
			if (str)  
			{  
				bytes=new ByteArray();  
				bytes.writeUTFBytes(str);  
			}  
			return bytes;  
		}  
		static private function convertByteArrayToString(bytes:ByteArray):String  
		{  
			var str:String;  
			if (bytes)  
			{  
				bytes.position=0;  
				str=bytes.readUTFBytes(bytes.length);  
			}  
			return str;  
		}  
	}
}

?最后是js的实现,js是用的CryptoJS这个包,这个搞了好久,就因为srcs没有转码,还是要细心 呀?

function Encrypt(word){
		 var key = CryptoJS.enc.Utf8.parse("0102030405060708");	
		 var iv  = CryptoJS.enc.Utf8.parse('0102030405060708');	
		 var srcs = CryptoJS.enc.Utf8.parse(word);
		 var encrypted = CryptoJS.AES.encrypt(srcs, key, { iv: iv,mode:CryptoJS.mode.CBC});
         return encrypted.toString();
	}
function Decrypt(word){
		 var key = CryptoJS.enc.Utf8.parse("0102030405060708");	
		 var iv  = CryptoJS.enc.Utf8.parse('0102030405060708');	
		 var decrypt = CryptoJS.AES.decrypt(srcs, key, { iv: iv,mode:CryptoJS.mode.CBC});
		 return CryptoJS.enc.Utf8.stringify(encrypted).toString();
	}

?自己也想了好久,这个key如何设置,如果设置简单的,固定的那么就和没有加密一样,因为自己基本上没有涉及过这个领域,想了一个就是session来作为key,原因是key是单一的,而且不是固定的,这样给破解就加了一定的困难,但是session,能不能在流中被截取,所以可以使用session中的某些值,在即这添加一些,作为key就可以基本上保证,在半路不会被破解了

  相关解决方案