AES算法介绍

  • 对称加密算法 AES,密码学中的高级加密标准(Advanced Encryption Standard,AES),又称高级加密标准Rijndael加密法,是美国联邦政府采用的一种区块加密标准。
  • 这个标准用来替代原先的DES, 已经被多方分析且广为全世界所使用。经过五年的甄选流程,高级加密标准由美国国家标准与技术研究院(NIST)于2001年11月26日发布于FIPS PUB 197,并在2002年5月26日成为有效的标准。2006年,高级加密标准已然成为对称密钥加密中最流行的算法之一。

加密机制图示

加密机制实现

关于获取设备EMEI

需要文件: jquery.min.js、immersed.js、common.js 获取EMEI码:plus.device.imei

关于前台JS使用AES算法加密

需要文件:(jquery.min.js)aes.js、pad-iso10126-min.js //yptoJS加密库

  //加密解密代码var aesKey=“自定义”;//密钥 EMEIvar 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算法加密

加密工具类

```java
public class Dou_AESUtil {
// SecretKey 负责保存对称密钥的容器
private SecretKeySpec skeySpec;
// Cipher负责完成加密或解密工作
private Cipher c;
// 该字节数组负责保存加密的结果
private byte[] cipherByte;
// 向量iv,用于增加加密算法强度
private IvParameterSpec ivps;@SuppressWarnings("unused")
private Dou_AESUtil() {
}/**
* privatekey与iv均为64bit
*/
public Dou_AESUtil(byte[] privatekey, byte[] iv) throws Exception {Security.addProvider(new com.sun.crypto.provider.SunJCE());// 使用CBC模式,需要一个向量ivivps = new IvParameterSpec(iv);// 生成密钥skeySpec = new SecretKeySpec(Base64.decode(Base64.encode(privatekey)),"AES");// 生成Cipher对象,指定其支持的DES算法c = Cipher.getInstance("AES/CBC/ISO10126Padding"); // "算法/模式/补码方式"
}/**
* 对字符串加密
*
* @param str
* @return
* @throws Exception
*/
public byte[] encode(byte[] src) throws Exception {// 根据密钥,对Cipher对象进行初始化,ENCRYPT_MODE表示加密模式c.init(Cipher.ENCRYPT_MODE, skeySpec, ivps);// 加密,结果保存进cipherBytetry {cipherByte = c.doFinal(src);} catch (BadPaddingException e) {System.err.println("error: privatekey is wrong");}return cipherByte;
}/**
* 对字符串解密
*
* @param buff
* @return
* @throws Exception
*/
public byte[] decode(byte[] encodesrc) throws Exception {// 根据密钥,对Cipher对象进行初始化,DECRYPT_MODE表示加密模式c.init(Cipher.DECRYPT_MODE, skeySpec, ivps);cipherByte = c.doFinal(encodesrc);return cipherByte;
}
}
复制代码

#### Action处理类```javapublic class wUserAction extends ActionSupport {private static final long serialVersionUID = 1L;// 1.前后台通信对象request,responseHttpServletRequest request = ServletActionContext.getRequest();HttpServletResponse response = ServletActionContext.getResponse();HttpSession session = request.getSession();// session模拟数据库// 2.struts配置返回的json串,必须有set方法配套String json = null;public String getJson() {return json;}public void setJson(String json) {this.json = json;}/*** 功能:注册** @return*/public String registers() {try {  // 获取注册传来的注册信息  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;  }  }  /** * 功能:登录 *  * @return * @throws IOException */  public String login() throws IOException {  request.setCharacterEncoding("UTF-8");  try {  // 接受客户端发送的消息(加密状态且已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(("abcdefghijkmnopqrstuvwxyz1234567890").getBytes("UTF-8"));  // 将数据编码为Base64  String send = Base64.encode(bytes).replace("\r", "").replace("\n", "").replace("\t", "");  System.out.println("服务器发出的消息(加密状态): " + send);  this.json = send;  } else {  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 = send;  }  return SUCCESS;  } catch (Exception 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/ISO10126Padding32 16 AES/ECB/NoPadding 16 不支持 09 AES/ECB/PKCS5Padding 32 16 AES/ECB/ISO10126Padding32 16 AES/OFB/NoPadding 16 原始数据长度 AES/OFB/PKCS5Padding 32 16 AES/OFB/ISO10126Padding32 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码表上的上一个字符或者下一个字符。

对称加密算法AES联合设备IMEI码设计的加密机制相关推荐

  1. python3 在线加密_Python3对称加密算法AES、DES3实例详解

    本文实例讲述了Python3对称加密算法AES.DES3.分享给大家供大家参考,具体如下: python3.6此库安装方式,需要pip3 install pycryptodome. 如有site-pa ...

  2. adb 命令获取安卓设备IMEI码

    adb 命令获取安卓设备IMEI码 ps:备份学习记录,如果侵权请联系删除 单卡设备获取IMEI(双卡设备只能返回第一个IMEI码,实测有效): adb shell service call ipho ...

  3. 对称加密算法(AES加密)以及对称算法与非对称算法的对比

    概述 对称加密算法就是传统的用一个密码进行加密和解密.例如,我们常用的WinZIP 和WinRAR对压缩包的加密和解密,就是使用对称加密算法:         从程序的角度着,所谓加密,就是这样一个函 ...

  4. 对称加密算法AES之GCM模式简介及在OpenSSL中使用举例

    AES(Advanced Encryption Standard)即高级加密标准,由美国国家标准和技术协会(NIST)于2000年公布,它是一种对称加密算法.关于AES的更多介绍可以参考:https: ...

  5. java加密算法之对称加密算法AES

    先上效果图 源码 package com.symmetric.aes.util;import org.apache.commons.codec.binary.Hex; import org.apach ...

  6. 对称加密算法AES简介及在OpenSSL中使用举例

    高级加密标准(AES, Advanced Encryption Standard)由美国国家标准和技术协会(NIST)于2000年公布,它是一种对称加密算法,用来替代DES.AES也称为Rijndae ...

  7. Java实现对称加密算法-AES加解密

    AES(Advanced Encryption Standard)意思是高级加密标准,是一种区块加密标准.这个标准用来替代原先的DES,且已经被广泛使用. DES使用56位密钥,所以比较容易被破解. ...

  8. 对称加密算法AES - ECB模式

    目录 什么是ECB模式? 如何使用Java 实现ECB模式的AES算法? 加密方法 解密方法 什么是ECB模式? ECB,Electronic Codebook,电码本.ECB模式是分组算法的一种基本 ...

  9. JAVA加密解密→术语、密码分类、OSI与TCP/IP安全体系、Base64、消息摘要算法MD/SHA/MAC、对称加密算法DES/AES/PBE、非对称加密算法DH/RSA/EIGamaI

    术语 密码分类 OSI与TCP/IP安全体系 JAVA安全 Base64算法 消息摘要算法MD 消息摘要算法MD图解 消息摘要算法SHA 消息摘要算法SHA图解 消息摘要算法MAC 消息摘要算法MAC ...

最新文章

  1. atom编辑器的安装
  2. 阿里云服务器配置开发环境第一章:Centos7.3安装git 和 zsh
  3. spring的发展||springboot和微服务的介绍
  4. 自己添加ODBC数据源的Access驱动
  5. STM32寄存器与输入捕获
  6. 光纤收发器不同品牌之间的兼容性互通
  7. 【CodeForces - 124C】Prime Permutation(数学,思维,小结论)
  8. 排序学习之---插入排序
  9. 小程序是否转发群还是个人(转发功能)
  10. GCC编译静态库和动态库
  11. ubuntu无法激活输入法,Zendstudio无法激活中文输入法问题
  12. Dreamweaver CS6 完全自学教程 (一)
  13. VBA代码片之计算加权平均分
  14. 机器学习基础:台大李宏毅的线性代数视频公开课
  15. 我谈 Markdown
  16. Python:实现pollard rho大数分解算法(附完整源码)
  17. IPV4的特殊地址(包括私网地址)
  18. 如何加密文件及文件夹
  19. 一文集齐几大硬核Linux技术公众号,不是精品不推荐
  20. linux 绝对路径root,绝对路径和相对路径及cd、pwd、mkdir、rmdir、tree命令

热门文章

  1. 3.5 函数的极值与最大值和最小值
  2. Python搭建简单的web服务器
  3. 华为OD机试真题 Python 实现【模拟商场优惠打折II】【2023 Q1 | 100分】
  4. android 正在检查更新,关于在app启动android上检查更新的新手问题
  5. [毕业设计]基于springboot线上教学平台的管理系统
  6. JVM堆内存释放不及时问题
  7. 【科研技巧】Mac下使用SciDavis绘制科研论文图教程(安装及使用)
  8. CentOS7-查看和设置日期时间
  9. Java POI SXSSFWorkbook 读取模板,输出
  10. JVM--Java堆外内存--使用/作用