cryptojs aes加密.AES 解密加密问题是不是必须拿到加密时的对象

对称加密算法AES联合设备IMEI码设计的加密机制 - 博客频道 - CSDN.NET
童话的博客
分类:网络安全
& & & & & & & & & & &对称加密算法 AES联合设备IMEI码设计的加密机制
& 1.AES算法介绍
&&* 对称加密算法 AES,密码学中的高级加密标准(Advanced Encryption Standard,AES),又称高级加密标准Rijndael加密法,是美国联邦政府采用的一种区块加密标准。
& &*这个标准用来替代原先的DES,已经被多方分析且广为全世界所使用。经过五年的甄选流程,高级加密标准由美国国家标准与
技术研究院(NIST)于日发布于FIPS PUB197,并在日成为有效的标准。2006年,高级加密标准已然成为对称密钥加密中最流行的算法之一。&&
&2.加密机制图示
3.加密机制实现
& & 一,关于获取设备EMEI
& & & 需要文件:jquery.min.js、immersed.js、common.js
& & &plus.device.imei&
&//获取EMEI码
& &二,关于前台JS使用AES算法加密
& & 需要文件: (jquery.min.js)aes.js、pad-iso10126-min.js
&源自CryptoJS加密库
& & & & & & &//加密解密代码
& & &var aesKey=“自定义”;//密钥 EMEI
& & & & & & var ivStr=“经某种算法加密的EMEI”;//向量(16位)
& & & & & & /**
& & & & & & &* 加密数据
& & & & & & &* @param {type} data 待加密的字符串
& & & & & & &* @param {type} keyStr 密钥
& & & & & & &* @param {type} ivStr 向量
& & & & & & &* @returns {unresolved} 加密后的数据
& & & & & & &*/
& & & & & & var aesEncrypt = function(data, keyStr, ivStr) {
& & & & & & & & var sendData = CryptoJS.enc.Utf8.parse(data);
& & & & & & & & var key = CryptoJS.enc.Utf8.parse(keyStr);
& & & & & & & & var iv &= CryptoJS.enc.Utf8.parse(ivStr);
& & & & & & & & var encrypted = CryptoJS.AES.encrypt(sendData, key,{iv:iv,mode:CryptoJS.mode.CBC,padding:CryptoJS.pad.Iso10126});
& & & & & & & & return CryptoJS.enc.Base64.stringify(encrypted.ciphertext);
& & & & & & };
& & & & & & /**
& & & & & & &* 解密数据
& & & & & & &* @param {type} data BASE64的数据
& & & & & & &* @param {type} keyStr 解密密钥
& & & & & & &* @param {type} ivStr 向量
& & & & & & &* @returns {undefined} 解密后的数据
& & & & & & &*/
& & & & & & var aesDecrypt = function(data, keyStr, ivStr) {
& & & & & & & & var key = CryptoJS.enc.Utf8.parse(keyStr);
& & & & & & & & var iv &= CryptoJS.enc.Utf8.parse(ivStr);
& & & & & & & & //解密的是基于BASE64的数据,此处data是BASE64数据
& & & & & & & & var decrypted = CryptoJS.AES.decrypt(data, key, {iv: iv, mode: CryptoJS.mode.CBC, padding: CryptoJS.pad.Iso10126}); & &
& & & & & & & & return decrypted.toString(CryptoJS.enc.Utf8);
& & & & & & };
& &三,关于后台JAVA使用AES算法加密
& & &加密工具类:
public class Dou_AESUtil {
// SecretKey 负责保存对称密钥的容器
private SecretKeySpec skeyS
// Cipher负责完成加密或解密工作
// 该字节数组负责保存加密的结果
private byte[] cipherB
// 向量iv,用于增加加密算法强度
private IvParameterS
@SuppressWarnings(&unused&)
private Dou_AESUtil() {
* privatekey与iv均为64bit
public Dou_AESUtil(byte[] privatekey, byte[] iv)
throws NoSuchAlgorithmException, NoSuchPaddingException,
InvalidKeyException, InvalidAlgorithmParameterException {
Security.addProvider(new com.sun.crypto.provider.SunJCE());
// 使用CBC模式,需要一个向量iv
ivps = new IvParameterSpec(iv);
// 生成密钥
skeySpec = new SecretKeySpec(Base64.decode(Base64.encode(privatekey)),
// 生成Cipher对象,指定其支持的DES算法
c = Cipher.getInstance(&AES/CBC/ISO10126Padding&); // &算法/模式/补码方式&
* 对字符串加密
* @param str
* @throws InvalidKeyException
* @throws IllegalBlockSizeException
* @throws BadPaddingException
* @throws InvalidAlgorithmParameterException
public byte[] encode(byte[] src) throws InvalidKeyException,
IllegalBlockSizeException, InvalidAlgorithmParameterException {
// 根据密钥,对Cipher对象进行初始化,ENCRYPT_MODE表示加密模式
c.init(Cipher.ENCRYPT_MODE, skeySpec, ivps);
// 加密,结果保存进cipherByte
cipherByte = c.doFinal(src);
} catch (BadPaddingException e) {
System.err.println(&error: privatekey is wrong&);
return cipherB
* 对字符串解密
* @param buff
* @throws InvalidKeyException
* @throws IllegalBlockSizeException
* @throws BadPaddingException
* @throws InvalidAlgorithmParameterException
public byte[] decode(byte[] encodesrc) throws InvalidKeyException,
IllegalBlockSizeException, BadPaddingException,
InvalidAlgorithmParameterException {
// 根据密钥,对Cipher对象进行初始化,DECRYPT_MODE表示加密模式
c.init(Cipher.DECRYPT_MODE, skeySpec, ivps);
cipherByte = c.doFinal(encodesrc);
return cipherB
& & & &&}&
& Action处理类:
& &&public class wUserAction extends ActionSupport {
private static final long serialVersionUID = 1L;
// 1.前后台通信对象request,response
HttpServletRequest request = ServletActionContext.getRequest();
HttpServletResponse response = ServletActionContext.getResponse();
HttpSession session = request.getSession();// session模拟数据库
// 2.struts配置返回的json串,必须有set方法配套
String json =
public String getJson() {
public void setJson(String json) {
this.json =
* 功能:注册
public String registers() {
// 获取注册传来的注册信息
String registername = new String(request.getParameter(&name&)
.getBytes(&iso-8859-1&), &utf-8&);
String registerpwd = new String(request.getParameter(&pwd&)
.getBytes(&iso-8859-1&), &utf-8&);
String registerimei = new String(request.getParameter(&imei&)
.getBytes(&iso-8859-1&), &utf-8&);
// 模拟存入数据库
session.setAttribute(&name&, registername);
session.setAttribute(&pwd&, registerpwd);
session.setAttribute(&IMEI&, registerimei);
// 存入成功,模拟注册成功
System.out.println(&用户名:& + registername + &,密码:& + registerpwd
+ &,IMEI:& + registerimei + & 注册成功&);
this.json = &注册成功!&;
return SUCCESS;
} catch (Exception e) {
e.printStackTrace();
return ERROR;
* 功能:登录
* @throws IOException
public String login() throws IOException {
request.setCharacterEncoding(&UTF-8&);
// 接受客户端发送的消息(加密状态且已base64编码)
byte[] bytename = request.getParameter(&name&).getBytes(
&iso-8859-1&);
byte[] bytepwd = request.getParameter(&pwd&).getBytes(&iso-8859-1&);
System.out.println(&客户端发来的消息(加密状态): name: & + new String(bytename)
+ & &pwd: & + new String(bytepwd));
// base64解码
bytename = Base64.decode(bytename);
bytepwd = Base64.decode(bytepwd);
// 解密消息,解密后为byte类型
String privatekey = (String) session.getAttribute(&IMEI&);
bytename = new Dou_AESUtil(privatekey.getBytes(), privatekey
.replace(&0&, &1&).getBytes()).decode(bytename);
bytepwd = new Dou_AESUtil(privatekey.getBytes(), privatekey
.replace(&0&, &1&).getBytes()).decode(bytepwd);
// 将byte类型数据包装成String
String name = new String(bytename, &UTF-8&);
String pwd = new String(bytepwd, &UTF-8&);
System.out.println(&客户端发来的消息(解密状态): name: & + name + & &pwd: &
+ pwd);
// 判断&数据库&的值与用户输入的值是否匹配
if (session.getAttribute(&name&).equals(name)
&& session.getAttribute(&pwd&).equals(pwd)) {
System.out.println(&用户名:& + name + &,密码:& + pwd + & 登录成功!&);
// 返回消息到客户端,以下是对数据进行加密
byte[] bytes = new Dou_AESUtil(privatekey.getBytes(&UTF-8&),
privatekey.replace(&0&, &1&).getBytes())
.encode((&abcdefghijkmnopqrstuvwxyz&)
.getBytes(&UTF-8&));
// 将数据编码为Base64
String send = Base64.encode(bytes).replace(&\r&, &&).replace(
&\n&, &&).replace(&\t&, &&);
System.out.println(&服务器发出的消息(加密状态): & + send);
this.json =
System.out.println(&用户名:& + name + &,密码:& + pwd + &正确IMEI:&
+ session.getAttribute(&IMEI&) + & 登录失败!&);
// 返回消息到客户端,以下是对数据进行加密
byte[] bytes = new Dou_AESUtil(privatekey.getBytes(&UTF-8&),
privatekey.replace(&0&, &1&).getBytes())
.encode((&不是本机登录,登录失败!&).getBytes());
// 将数据编码为Base64
String send = Base64.encode(bytes).replace(&\r&, &&).replace(
&\n&, &&).replace(&\t&, &&);
System.out.println(&服务器发出的消息(加密状态): & + send);
this.json =
return SUCCESS;
} catch (InvalidKeyException e) {
e.printStackTrace();
} catch (IllegalBlockSizeException e) {
e.printStackTrace();
} catch (BadPaddingException e) {
e.printStackTrace();
} catch (InvalidAlgorithmParameterException e) {
e.printStackTrace();
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
} catch (NoSuchPaddingException e) {
e.printStackTrace();
} catch (Base64DecodingException e) {
e.printStackTrace();
return SUCCESS;
&注:Java与CryptoJS分别对AES加密模式对的支持情况
&【Java】算法/模式/填充 & & & & & & &16字节加密后数据长度 & & & & & & & & & & & & & & & & & & 加密内容不满16字节加密后长度
&*&AES/CBC/NoPadding & & & & & & & &16 & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & &
&*&AES/CBC/PKCS5Padding & & & &&32 & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & &16
&*&AES/CBC/ISO10126Padding & &&32 & & & & &
& & & & & & & & & & & & & & & & & & & & & & & & & & & & &16
&*&AES/CFB/NoPadding & & & & & & && 16 & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & &
&&原始数据长度
&*&AES/CFB/PKCS5Padding & & & & &32 & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & &16
&* AES/CFB/ISO10126Padding & &&&32&& & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & &16
&*&AES/ECB/NoPadding
& & & & & & & &&16&& & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & &不支持 09
&* AES/ECB/PKCS5Padding & & & & &32&& & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & &16
&*&AES/ECB/ISO10126Padding
& &&&32&& & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & &16
&* AES/OFB/NoPadding & & & & & & & &&16 & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & &原始数据长度
&*&AES/OFB/PKCS5Padding
& & & & &&32&& & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & &16
&* AES/OFB/ISO10126Padding & &&&32&& & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & &16
&*&AES/PCBC/NoPadding
& & & & & & & 16&& & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & &不支持
&* AES/PCBC/PKCS5Padding & & &&&32&& & & & &
& & & & & & & & & & & & & & & & & & & & & & & & & & & & &16
&*&AES/PCBC/ISO10126Padding
& &32&& & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & &16
&【CryptoJS&】
&* Pkcs7(the default)&
&*&Iso97971&
&*&AnsiX923&
&*&Iso10126&
&*&ZeroPadding&
&*&NoPadding
& &四,还需以后研究的问题
& & & & &&1.该加密机制,对于Tomcat服务器来说,仅支持Tomcat7.0以上,而对于其他低级版本会出现服务器给客户端的加密后的返回消息内容不正确。(PS:该问题相当坑爹,那一夜,我搞到了凌晨3点半才弄明白,原来代码没问题,是服务器的问题。这问题是有多难找啊。)
& & & & & 2.对于App访问服务器,会出现返回消息内容个别字符乱码,并且经查证,乱码字符正是正确字符在Ascii码表上的上一个字符或者下一个字符。
localhost01
排名:千里之外
(4)(0)(1)(1)(1)(1)(2)(3)(5)推荐这篇日记的豆列
······  由于JavaScript属于弱类型脚本语言,因此当其与强类型的后台语言进行数据交互时会产生各种问题,特别是加解密的操作。本人由于工作中遇到用js与Java进行相互加解密的问题,在网上查了很多资料及代码段,均无法解决。后总结多篇文档内容终于找到解决办法,现记录与此:
  第一种:加解密时需要秘钥(key)和秘钥偏移量(iv)的情况,在线验证地址:/tools/aes.html
//该方法可与Java进行相互加解密&!doctype html&
&html lang="en"&
&meta charset="UTF-8"&
&title&需要秘钥(key)及秘钥偏移量(iv)的aes加解密&/title&
&script src="aes_1.js"&&/script&  //引入的js文件在该链接中:/hellobajie/AES-of-JavaScript
var key = CryptoJS.enc.Utf8.parse("十六位十六进制数作为秘钥");
= CryptoJS.enc.Utf8.parse('十六位十六进制数作为秘钥偏移量');
function Encrypt(word){
srcs = CryptoJS.enc.Utf8.parse(word);
var encrypted = CryptoJS.AES.encrypt(srcs, key, { iv: iv,mode:CryptoJS.mode.CBC,padding: CryptoJS.pad.Pkcs7});
return encrypted.ciphertext.toString().toUpperCase();
function Decrypt(word){
var encryptedHexStr = CryptoJS.enc.Hex.parse(word);
var srcs = CryptoJS.enc.Base64.stringify(encryptedHexStr);
var decrypt = CryptoJS.AES.decrypt(srcs, key, { iv: iv,mode:CryptoJS.mode.CBC,padding: CryptoJS.pad.Pkcs7});
var decryptedStr = decrypt.toString(CryptoJS.enc.Utf8);
return decryptedStr.toString();
var mm = Encrypt('nihao')
console.log(mm);
var jm = Decrypt(mm);
console.log(jm)
&/html&//如果想要深度了解每步作用,可以参考:/question/014285.html?qbl=relate_question_0&word=javascript%20aes
  第二种:加解密时仅需要秘钥,在线验证地址:/
&!doctype html&
&html lang="en"&
&meta charset="UTF-8"&
&title&加解密时仅需要秘钥&/title&
&script src="aes_2.js"&&/script&  //引入的js文件在该链接中:/hellobajie/AES-of-JavaScript
&script type="text/javascript"&
var pwd="秘钥";
function Encrypt(word){
return CryptoJS.AES.encrypt(word,pwd).toString();
function Decrypt(word){
return CryptoJS.AES.decrypt(word,pwd).toString(CryptoJS.enc.Utf8);
var mm = Encrypt('nihao');
console.log(mm)
var jm = Decrypt(mm);
console.log(jm)
阅读(...) 评论()现在位置:
ProEncryptor 是一款Mac上简单易用的文件加密解密工具,只需要简单的拖拽,就可以快速的加密或解密一个文件夹或文件,很不错!
ProEncryptor 是一个专业的加密软件,支持AES128及AES256算法,针对安全性较高的需要,我们特别作出了优化,并且支持跨平台的加密和解密,例如Windows、OS X、iOS、Android及Windows Phone等平台。
mSecure 是一款Mac上优秀的密码管理工具,可以方便安全的管理我们的密码,采用256比特blowfish加密法,支持iCloud同步、自动备份等,很实用的一款软件!
[mSecure 在 Mac App Store上售价128元]
mSecure密保助手 - 安全随时随地,便捷随心所欲
超级安全:mSecure采用256比特blowfish加密法,保障诸如银行卡号、用户名、密码等信息的安全。
o自动上锁避免他人偷窥
o密码生成器可生成不容易被猜到的密码
o随处同步云端...
M3 BitLocker Loader 是一款Mac上优秀的加密磁盘读取工具,能够对使用了 Bitlocker 方式加密的磁盘进行读取访问的工具,对于这类 USB 设备或者是磁盘,它能浏览、加密、解密等,很实用!
[M3 BitLocker Loader 在 Mac App Store上售价258元]
A Bitlocker To Go Reader/Writer for Mac OSX alternative to open, access, unlock, decrypt, mount Bitlocker encrypted drive on Mac computer with read-write access su...
Invisible 是一款Mac上优秀的文件隐藏工具,可以通过拖拽批量隐藏和显示文件或目录,简单易用,非常的不错!
[Invisible 在 Mac App Store上售价30元]
The quickest way to keep personal documents away from unwanted eyes.
Drop files onto Invisible to instantly hide them from view, and make them visible again just as easily with the click of a button. All your private files are kept safely out of ...
Hide Files 是一款Mac上简单易用的文件隐藏小工具,可以快速将多个文件隐藏,也可以通过拖拽目录显示目录下的隐藏文件,很实用的一款小工具!
[Hide Files 在官网上售价4.99美元,约合人民币30元]
Hide Files can hide your sensitive files from others, but lets you retrieve them quickly without remembering any passwords.
百度云高速下载(仅限本站VIP):仅限VIP用户下载,「立即通过赞助成...
ProEncryptor 是一款Mac上简单易用的文件夹加密工具,支持AES128及AES256算法,支持加密文件和目录,很实用的一款软件!
[ProEncryptor 在 Mac App Store上售价40元]
ProEncryptor 是一个专业的加密软件,支持AES128及AES256算法,针对安全性较高的需要,我们特别作出了优化,并且支持跨平台的加密和解密,例如Windows、OS X、iOS、Android及Windows Phone等平台。
百度云高速下载(仅限本站VIP):...
Hider是一款Mac上的文件夹隐藏和加密工具,只需要简单的拖拽就可以加密文件或目录,最新的2.2版本完美兼容OS X 10.10 Yosemite系统,软件自身的运行使用密码进行保护,文件使用AES-256 进行高度加密以保护隐私,除了本地的磁盘外,还支持移动硬盘上文件的直接加密和隐藏,以及隐私笔记等功能,非常强大和易用的一款文件加密工具!
[Hider 2 在 Mac App Store上售价128元]
Put out of sight your confidential informa...
iLock 是一款 Mac 上的应用加锁保护工具,和其他的文件夹加密软件不同,iLock是直接给应用加锁,在运行加锁的应用时会要求输入密码,简单易用,保护个人隐私,当密码输入错误时,还支持通过摄像头拍照,对于站长来说,我需要把我的笔记软件和邮箱软件加锁,这时就派上用场了,非常实用和不错的软件!
[iLock 在官网上售价8欧元,约合人民币80元]
iLock password-protects any OS X application from unauthorized usa...
Espionage是一款Mac上的文件夹加密工具,这款软件最大的优点是使用上非常的方便,仅需要将要加密的目录或文件拖拽到窗口中加密即可,并且加密速度很快,安全上,使用AES-128的256位苹果的FileVault加密技术,确保其无法破解,并且支持 Time Machine 和 Dropbox的备份,非常的强大!
[Espionage 在官网上售价29.99美元,约合人民币188元]
Espionage: simple, state of the art encryption and plausible deniability f...
Hider 2 是一款Mac上的文件夹隐藏和加密工具,支持简单的拖拽就可以保护你的文件或目录,软件自身的运行使用密码进行保护,文件使用AES-256 进行高度加密以保护隐私,除了本地的磁盘外,还支持移动硬盘上文件的直接加密和隐藏,以及隐私笔记等功能,非常不错!
[Hider 2 在 Mac App Store 上售价68元]
Make your private data private. Hider 2 lets you hide, encrypt, and password protect private data on your M...
今天和大家分享一款Mac上非常方便和实用的文件隐藏工具:MacHider,通过这款软件,你只需要将需要隐藏的文件或目录直接拖拽到软件中,就可以快速的隐藏他们,你还可以为MacHider软件本身设置密码,这样就可以更安全的保护你的文件,并且还有Finder的插件,可以让你更加快速的隐藏目标文件,非常的好用!
MacHider是乌克兰的一家独立软件公司MacPaw出品一款文件加密隐藏保管软件,它的用户界面友好,可以为您的隐私个人...
今天和大家分享一款Mac上非常好用的文件夹加密软件:Espionage,这款软件最大的优点是使用上非常的方便,仅需要将要加密的目录或文件拖拽到窗口中加密即可,并且加密速度很快,安全上,使用AES-128的256位苹果的FileVault加密技术,非常的强大!
Espionage 是一款非常专业的个人文件夹加密软件。它使用AES-128的256位苹果的FileVault加密技术,可直接加密文件夹或个人重要信息。
百度云高速下载(...
百度站内搜索
VIP会员回馈评价
O(∩_∩)O~
邀请好友奖励10元
第一时间获取新软件

我要回帖

更多关于 android aes加密解密 的文章

 

随机推荐