欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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

程序员文章站 2022-05-05 21:20:50
...

三方只要在编码方式,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就可以基本上保证,在半路不会被破解了