您的位置:首页 > 编程语言 > Java开发

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

2015-01-20 11:06 555 查看
三方只要在编码方式,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加<strong>解密</strong><strong>算法</strong>

*

* @author jueyue

*

<strong><strong><strong>加密</strong></strong></strong>用的Key 可以用26个字母和数字组成,最好不要用保留字符,虽然不会错,至于怎么裁决,个人看情况而定

此处使用AES-128-CBC<strong><strong><strong>加密</strong></strong></strong>模式,key需要为16位。

也是使用<span>0102030405060708</span>

*/

public class AES {

// <strong><strong><strong>加密</strong></strong></strong>

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");//"<strong>算法</strong>/模式/补码方式"

IvParameterSpec iv = new IvParameterSpec("0102030405060708".getBytes());//使用CBC模式,需要一个向量iv,可增加<strong><strong><strong>加密</strong></strong></strong><strong>算法</strong>的强度

cipher.init(Cipher.ENCRYPT_MODE, skeySpec, iv);

byte[] encrypted = cipher.doFinal(sSrc.getBytes());

return BAES64.encodeBAES64String(encrypted);//此处使用BAES64做转码功能,同时能起到2次<strong><strong><strong>加密</strong></strong></strong>的作用。

}

// <strong>解密</strong>

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<strong>解密</strong>

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;

/**

* <strong><strong><strong>加密</strong></strong></strong><strong>算法</strong>,对配置文件进行<strong><strong><strong>加密</strong></strong></strong>

* */

public class EncryptionUtil

{

public function EncryptionUtil()

{

}

/**

* 对字符串<strong><strong><strong>加密</strong></strong></strong>

* */

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);//这里注意,如果想<strong><strong><strong>加密</strong></strong></strong>中文就不要使用$base64.encode();

return $base64.toString();

}

/**

* 对字符串<strong>解密</strong>

* */

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);//这里注意,如果想<strong><strong><strong>加密</strong></strong></strong>中文就不要使用$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就可以基本上保证,在半路不会被破解了
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: