`
jueyue
  • 浏览: 195569 次
社区版块
存档分类
最新评论

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

    博客分类:
  • flex
阅读更多

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

分享到:
评论
6 楼 xcgh 2016-09-08  
<script type="text/javascript" src="rollups/aes.js"></script>
function Decrypt(word){
var key = CryptoJS.enc.Utf8.parse("0102030405060708");
var iv  = CryptoJS.enc.Utf8.parse('0102030405060708');
var decrypt = CryptoJS.AES.decrypt(word, key, { iv:iv,mode:CryptoJS.mode.CBC });
return CryptoJS.enc.Utf8.stringify(decrypt).toString();
}
解密方法后两句复制的,楼主忘改了
5 楼 haiking5253 2016-03-16  
js需要引入那些js文件了,下载到这个js文件很多的?
4 楼 2153942 2016-01-20  
楼主您好,最近正好要使用JAVA和AS3之间加解密的交互,用您的代码测试了一下发现JAVA和AS3之间加密后的结果是不通用的,您有解决之道么?
3 楼 u012885441 2015-12-30  
js那个能详细点么?需要哪些js包????急求
2 楼 diannaoxiaotong 2015-09-10  
想问一下两种key的生成方式有何不同?
                        KeyGenerator kgen = KeyGenerator.getInstance("AES"); 
                kgen.init(128, new SecureRandom(password.getBytes())); 
                SecretKey secretKey = kgen.generateKey(); 
                byte[] enCodeFormat = secretKey.getEncoded(); 
                SecretKeySpec key = new SecretKeySpec(enCodeFormat, "AES"); 

------------------------------------------------------------------------------
SecretKeySpec key = new SecretKeySpec(password.getBytes("UTF-8"), "AES");
1 楼 meng521215 2015-01-25  
CryptoJS这个包 怎么引用啊?里面好多js

相关推荐

    AES加密算法(java实现).zip_aes java_cmM0 解密_java aes加密 demo_js aes加密算法_

    AES在Java中的实现通常包括加密和解密两个过程,适用于数据保护、隐私安全等多个场景。 Java实现AES加密的基本步骤如下: 1. **密钥生成**:首先,你需要创建一个密钥。在Java中,可以使用`javax.crypto....

    AES加密算法(java)实现

    AES高级加密标准,在密码学中又称Rijndael加密法,是美国联邦政府采用的一种...本软件是用java语言开发,实现了AES算法对文件的加密和解密,并在界面上加了进度条,来提示用户加密解密的进度。如果不足之处,欢迎留言。

    AES加密java与AS和JS互解.zip

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

    AES加密算法的JAVA实现

    以上就是AES加密算法在Java中的实现基础,实际应用中还需要考虑错误处理、密钥管理、安全性等问题。通过`secret`这个文件名,可能包含了具体实现AES加密的Java代码示例,你可以查阅这个文件以获得更详细的信息。

    AES.rar_AES_AES加密 java_AES算法_aes java_java aes

    在Java中,我们可以使用`javax.crypto`包提供的API来实现AES的加密和解密。以下是一般步骤: - 导入相关类:`Cipher`,`KeyGenerator`,`SecretKeySpec`等。 - 生成密钥:使用`KeyGenerator`实例化并设置密钥长度...

    JAVA实现AES加密算法代码.doc

    JAVA 实现 AES 加密算法代码是指使用 JAVA 语言来实现高级加密标准(Advanced Encryption Standard,AES)的加密算法。AES 已经变成目前对称加密中最流行算法之一,能够使用 128、192 和 256 位密钥,并且使用 128 ...

    各种密码算法的FPGA实现情况.rar_AES加解密_DES加密算法FPGA_des fpga_加密_密码 FPGA

    在FPGA中实现密码算法,除了提高速度,还有利于减少功耗和资源占用,适应不同应用环境。此外,FPGA的可重构性也使得密码算法可以根据新的安全标准进行快速更新和升级。 综上所述,本资料集深入剖析了AES、DES和RSA...

    QT 实现AES 加密算法

    在QT中实现AES(Advanced Encryption Standard)加密算法,可以帮助开发者确保数据的安全性,防止未授权的访问和篡改。AES是目前国际上广泛采用的一种块密码标准,因其高效性和安全性而备受推崇。 AES加密算法基于...

    Java实现AES加密算法

    Java实现AES加密算法Java实现AES加密算法

    Java实现AES加密和解密算法

    在Java中实现AES(Advanced Encryption Standard)加密和解密算法主要涉及到对称密钥加密技术。AES算法是一种块密码,采用固定大小的128位(16字节)块进行加密和解密,支持128、192和256位的密钥长度。在给定的代码...

    AESjiami.rar_AES 算法_AES加密_AES加密算法_AES加密算法c++_AES算法

    AES(Advanced Encryption ...总之,AES加密算法是现代密码学中的重要组成部分,其在C++中的实现需要理解加密原理,并合理运用第三方库。通过学习和实践,你可以掌握这一强大的工具,为你的项目提供坚实的安全保障。

    AES.rar_AES 加密_AES加密算法_aes 源码_aes源码_vc 加密

    在VC++中实现AES加密通常涉及以下几个关键部分: 1. **密钥扩展**:使用Rijndael的密钥扩展算法生成子密钥数组。 2. **状态初始化**:将明文数据组织成4x4的字节矩阵,作为加密的初始状态。 3. **加密循环**:执行...

    AES加密算法(C++实现,附源码)

    在实际应用中,AES加密常用于保护敏感数据,如网络传输中的密码、个人隐私信息等。C++实现的AES库可以被其他应用程序调用,通过接口函数进行加密和解密操作。在源码中,开发者可能会使用标准库如 `&lt;vector&gt;` 和 `...

    AES(java).rar_AES_AES加密算法_Java Aes界面

    在Java中实现AES加密,主要依赖于Java Cryptography Extension (JCE)框架。JCE提供了丰富的加密、解密、消息摘要以及数字签名等功能。要进行AES加密操作,首先需要了解其工作原理。AES是一种分组密码,它将明文数据...

    AES加密算法java实现及实验报告

    在Java中,可以使用`javax.crypto`包来实现AES加密。主要涉及以下几个步骤: 1. **密钥生成**:首先需要生成一个128位的密钥,可以使用`KeyGenerator`类,指定算法为"AES"。 2. **密钥转换**:生成的密钥通常是`...

    Delphi.rar_AES_AES加密_delphi AES加密_delphi 加解密_java delphi aes

    Java中的AES加密同样有多种工作模式可供选择,并且JCE也提供了易于使用的API来实现这些操作。为了实现Delphi和Java之间的兼容性,开发者需要确保两者的加密参数(如密钥、初始向量IV、工作模式等)一致,并且遵循...

    AES.rar_AES 加密算法_AES 解密_AES加密_AES算法_加密解密算法

    在提供的压缩包文件中,`AES.doc`很可能包含了关于AES加密算法的详细解释、实现示例或实际应用等内容。学习和理解AES,不仅可以帮助你保护个人数据,也是深入理解现代密码学的基础。AES的高效性和安全性使其成为众多...

    AES-test.rar_AES_AES加密 java_aes java_aes文本_java aes

    在Java中实现AES加密通常涉及以下步骤: 1. 密钥生成:首先,需要创建一个AES密钥。这可以通过`java.security.SecureRandom`类生成随机数据,然后用`javax.crypto.spec.SecretKeySpec`类创建密钥。 2. 加密过程:...

    AES.rar_AES_AES 加密算法_AES 加密解密算法_AES加密算法_加密算法源码

    在提供的压缩文件"AES.c"中,可能包含了AES加密和解密算法的C语言实现。通常,这样的源代码会包含以下部分: - 密钥扩展函数:用于生成多轮所需的轮密钥。 - 加密函数:根据AES加密流程,实现字节代换、行移位、列...

Global site tag (gtag.js) - Google Analytics