Blackberry 10 js+html5 AES 128加密

Blackberry10 使用js+html5开发 AES加密解密时遇到的问题:BB10端使用js加密与解密, 服务器端使用java加密与解密

1,js端加密  秘钥与iv的长度固定16位,类型转换为utf-8,否则后面加密 解密的时候会出现错误.

var key  = CryptoJS.enc.Utf8.parse('qazwsxujmyhntgbf');
var iv   = CryptoJS.enc.Utf8.parse('qazwsxujmyhntgbf');

2,需要加密的内容也需要转化为utf-8格式:

var content =CryptoJS.AES.encrypt(CryptoJS.enc.Utf8.parse(data),key,{iv:iv,mode:CryptoJS.mode.CBC});

3,两端都是用AES/CBC/PKCS5Padding填充模式加密 解密.


4,js加密后的内容需要做转码 否则加密后的内容中会出现"\"之类的字符使得ajax无法发送报文请求道java服务器端:

encodeURIComponent(content)
5,ajax发送请求的时候需要指明dataType:'html' 否则的话ajax无法发送报文到java服务器端:

$.ajax({
	 type:"GET",
	 url:url
	 data:{data:data},
	 success:function(result){
	   //成功后执行....
	 },
	 error:function(result){
	  //失败后执行....
	 },dataType: 'html'});


6,java端解密的时候需要注意首先要将js中的转码转回来:

sSrc=java.net.URLDecoder.decode(sSrc, "UTF-8");
7,需要注意的是 js端加密的时候会自动的进行base64加密,所以java端解密的时候先用base64解密

byte[] encrypted1 = getFromBASE64(sSrc);//先用bAES64解密
8,最后一个问题 整整让我蛋疼了好几个夜晚:在java端收到bb10发过来的报文后总是无法 解密出来,但是直接将js加密的报文用java解密可以正常解密,最后我同事一个一个词的对,终于发现 js发过来的报文过长会有换行之类的字符(可能是js加密后组成报文的时候产生换行),将它去掉就可以,所以建议用到的朋友在操作加密后的字符串时先将其中可能出现的空格或者换行过滤掉:

requestStr=requestStr.replace("\r", "").replace("\n", "");

下面是代码不包括最后一个问题所有的代码,最后一个问题的解决方法已经给出,加到你操作密文最前面就行.

js端:非常简单不多说

var key  = CryptoJS.enc.Utf8.parse('qazwsxujmyhntgbf');
var iv   = CryptoJS.enc.Utf8.parse('qazwsxujmyhntgbf');

function encryping(data){
	var content =CryptoJS.AES.encrypt(CryptoJS.enc.Utf8.parse(data),key,{iv:iv,mode:CryptoJS.mode.CBC});
	return encodeURIComponent(content);
	
}
function decrypting(encrypted){
     var decrypt = CryptoJS.AES.decrypt(encrypted, key, { iv: iv,mode:CryptoJS.mode.CBC});
     return CryptoJS.enc.Utf8.stringify(decrypt).toString();
}

java端:

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

import sun.misc.BASE64Decoder;

/*******************************************************************************
 * AES加解密算法
 * 
 * 
 * 
 * 加密用的Key 可以用26个字母和数字组成,最好不要用保留字符,
 * 虽然不会错,至于怎么裁决,个人看情况而定
 * 此处使用AES-128-CBC加密模式,key需要为16位
 */
public class CryptoBB10Util {

	// 加密
	public static String encrypt(String sSrc) throws Exception {
		String sKey =getKeyStr();
		String sIv=getIv();
		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");
		// 使用CBC模式,需要一个向量iv,可增加加密算法的强度
		IvParameterSpec iv = new IvParameterSpec(sIv.getBytes());
		cipher.init(Cipher.ENCRYPT_MODE, skeySpec, iv);
		byte[] encrypted = cipher.doFinal(sSrc.getBytes("UTF-8"));
		//此处使用BAES64做转码功能,同时能起到2次加密的作用。
		return getBASE64(encrypted).replace("\r", "").replace("\n", "");
	}

	// 解密
	public static String decrypting(String sSrc) throws Exception {
		sSrc=java.net.URLDecoder.decode(sSrc, "UTF-8");
		String sKey =getKeyStr();
		String sIv=getIv();
		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(sIv.getBytes());
			cipher.init(Cipher.DECRYPT_MODE, skeySpec, iv);
			//先用bAES64解密
			byte[] encrypted1 = getFromBASE64(sSrc);
			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;
		}
	}

	public static String getBASE64(byte[] s) {
		if (s == null)
			return null;
		return (new sun.misc.BASE64Encoder()).encode(s);

	}

	// 将 BASE64 编码的字符串 s 进行解码
	public static byte[] getFromBASE64(String s) {
		if (s == null)
			return null;
		BASE64Decoder decoder = new BASE64Decoder();
		try {
			byte[] b = decoder.decodeBuffer(s);
			return b;
		} catch (Exception e) {
			return null;
		}

	}	
	private static String getKeyStr(){
		return "qazwsxujmyhntgbf";
	}
	private static String getIv(){
		return "qazwsxujmyhntgbf";
	}
}








评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值