Blackberry 10 js+html5 AES 128加密
来源:互联网 发布:贪心算法经典例题 编辑:程序博客网 时间:2024/05/20 05:28
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'});
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";}}
0 0
- Blackberry 10 js+html5 AES 128加密
- Blackberry 10 js+html5 RSA加密
- Blackberry 6,7 java环境下AES 128加密
- AES 128 加密补充
- AES 加密 128位
- js与java相互aes加密解密
- js的RSA和AES加密解密
- java和js实现aes加密解密
- JS AES加密与PHP解密
- JS客户端AES加密,Java服务端解密
- js与java相互aes加密解密
- JS AES加密与PHP解密(转)
- java和js实现aes加密解密
- 使用AES,java加密与js解密
- java和js实现aes加密解密
- java使用AES加密解密 AES-128-ECB加密
- AES-128 ECB 加密有感
- AES 地址栏重要信息加密(JS 加密 Java 解密)
- Hadoop 安全机制认证---Kerberos
- Linux内核映像中的内核配置信息生成与获取详解
- oracle with 语句用法
- C# Excel 行高,列宽,合并单元格,单元格边框线,冻结(转载) - 关于C#操作EXCLE常见操作比较全的 (防找不到)
- matlab编程入门学习(7)--Matlab编程(第二版)--菜鸟入门教材(课后题)(第二章)
- Blackberry 10 js+html5 AES 128加密
- 看nginx内存管理的一些感想
- SP13使用JS读取social feed 时的报错 SCRIPT438: Object doesn't support property or method 'get_context
- 探讨PHP页面跳转几种实现技巧
- How to modify virtual address space in Windows
- 选取图片
- nodejs安装及其初始配置
- web开发技术和web前端开发技术有何不同
- CST和GMT时间的区别