我是靠谱客的博主 苗条鸵鸟,最近开发中收集的这篇文章主要介绍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";
	}
}








最后

以上就是苗条鸵鸟为你收集整理的Blackberry 10 js+html5 AES 128加密的全部内容,希望文章能够帮你解决Blackberry 10 js+html5 AES 128加密所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(63)

评论列表共有 0 条评论

立即
投稿
返回
顶部