日期:2014-05-16  浏览次数:20507 次

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 =  f