aes加密解密过程

用户数据应经过加密再传输,此文档为aes128加密(cbc模式)的说明 摘要算法为SHA-512

加密:

生成16位iv向量,使用该iv以及密钥加密原文

将加密后的真实密文与iv拼接: iv+真实密文

将与iv拼接后的密文用SHA-512 HMAC生成摘要信息(128位),与密文拼接: HMAC+base64后的密文,得到最终的密文

解密:

分离出hmac与密文,可以自行进行摘要检测,可以防止时序攻击.

得到拼接了iv的原文.分离出iv以及真实原文

使用密钥以及iv进行解码,得到原文

加密举例 php版本

/*****加密过程*****/

$str = "Hello World";

//1.使用16位密钥

$key = '12345678901234ab';

//2.生成16位iv 算法自定,示例中直接指定

//$iv = openssl_random_pseudo_bytes(16); //12345678ss1234ab

$iv="12345678ss1234ab";

//3.加密      IvdA7oP8BInWa5shY+LCyQ==

$secert_str = openssl_encrypt($str, 'AES-128-CBC', $key, 0, $iv);

$secert_str = $iv . $secert_str;        //4.将iv与密文拼接    12345678ss1234abIvdA7oP8BInWa5shY+LCyQ==

//5.base64_encode   考虑语言兼容性问题,该步骤取消

//6.用SHA-512生成摘要 128位16进制   3b2106c05b46b603969c2b1bc7503c8233d209dcd204b098b33ba704507315480e03e499e0082e8842b60baa01f522d7c0342d75196d18d3514d37c58e31d733

$hmac = hash_hmac('sha512', $secert_str, $key, false);

//7.拼接摘要,得到密文

$secert_str = $hmac . $secert_str;

return urlencode($secert_str);

解密举例

$str=rawurldecode($str);

$len = mb_strlen($secert_str);

$ori_hmac = substr($secert_str, 0, 128);

$data = substr($secert_str, 128, $len);

//2.验证摘要

$local_hmac = hash_hmac('sha512', $data, $key, false);

$diff = 0;

for ($i = 0; $i < 128; $i++) {

$diff |= ord($ori_hmac[$i]) ^ ord($local_hmac[$i]);

}

if ($diff !== 0) {

return FALSE;

}

//3.分离iv

$len = mb_strlen($data);

$iv = substr($data, 0, 16);

$data = substr($data, 16, $len);

//4.解密,获得原文

$data = openssl_decrypt($data, 'AES-128-CBC', $key, 0, $iv);

java加解密类

package main;

import javax.crypto.Cipher;

import javax.crypto.spec.IvParameterSpec;

import javax.crypto.spec.SecretKeySpec;

import javax.crypto.Mac;

import org.apache.commons.codec.binary.Base64;

import org.bouncycastle.util.encoders.Hex;

public class AESUtil {

/**

* aes/128/cbc加密

* @param sSrc  明文

* @param sKey  密钥

* @param sIv   向量

* @return

* @throws Exception

*/

public static String Encrypt(String sSrc, String sKey, String sIv) throws Exception {

if (sKey == null) {

System.out.print("Key为空null");

return null;

}

// 判断Key是否为16位

if (sKey.length() != 16) {

System.out.print("Key长度不是16位");

return null;

}

//1.加密

byte[] raw = sKey.getBytes();

SecretKeySpec skeySpec = new SecretKeySpec(raw, "AES");

Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");//aes-cbc-pkcs5(pkcs5与pkcs7通用)

IvParameterSpec iv = new IvParameterSpec(sIv.getBytes());//使用CBC模式,需要一个向量iv,可增加加密算法的强度

cipher.init(Cipher.ENCRYPT_MODE, skeySpec, iv);

byte[] encrypted = cipher.doFinal(sSrc.getBytes("UTF-8"));

String encryptedString = new String(Base64.encodeBase64(encrypted));

//2.拼接iv

encryptedString = sIv + encryptedString;

//3.sha512

String hmac = encodeHmacSHA512(encryptedString, sKey);

//4.拼接摘要

encryptedString = hmac+encryptedString;

//5.urlencode

encryptedString = URLEncoder.encode(encryptedString);

return encryptedString;

}

// 解密

/**

*

* @param sSrc  密文

* @param sKey  密钥

* @return

* @throws Exception

*/

public static String Decrypt(String sSrc, String sKey) throws Exception {

try{

//0.urldecode

sSrc=URLDecoder.decode(sSrc);

//1.分离摘要

System.out.println(sSrc);

String hmac=sSrc.substring(0,128);

String data=sSrc.substring(128,sSrc.length());

//2.验证摘要

//3.分离iv

String sIv=data.substring(0,16);

String str=data.substring(16,data.length());

//4.解密

byte[] raw = sKey.getBytes("UTF-8");

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);

byte[] encrypted1 = Base64.decodeBase64(str.getBytes());

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;

}

}

/**

* HmacSHA512消息摘要

*

* @param data 待做摘要处理的数据

* @param key  密钥

* @return

*/

public static String encodeHmacSHA512(String data, String key) throws Exception {

byte[] bytesKey = key.getBytes();

SecretKeySpec secretKey = new SecretKeySpec(bytesKey, "HmacSHA512");

Mac mac = Mac.getInstance(secretKey.getAlgorithm());

mac.init(secretKey);

final byte[] macData = mac.doFinal(data.getBytes());

byte[] hex = new Hex().encode(macData);

String result = new String(hex, "ISO-8859-1");

return result;

}

}

java实例

import main.AESUtil;

public class Main {

public static void main(String[] args) {

//key

String cKey = "12345678901234ab";

// 需要加密的字串

String cSrc = "Hello World";

//iv 16位  算法自定 实例中直接指定

String sIv = "12345678ss1234ab";

String enString;

String deString;

try {

enString = AESUtil.Encrypt(cSrc, cKey, sIv);

System.out.println("加密后的字串是:" + enString);

deString = AESUtil.Decrypt("3b2106c05b46b603969c2b1bc7503c8233d209dcd204b098b33ba704507315480e03e499e0082e8842b60baa01f522d7c0342d75196d18d3514d37c58e31d73312345678ss1234abIvdA7oP8BInWa5shY+LCyQ==", cKey);

System.out.println("解密后的字串是:" + deString);

} catch (Exception e) {

e.printStackTrace();

}

}

}

更多技术

JAVA与PHP之间进行aes加密解密相关推荐

  1. jquery java aes_[代码全屏查看]-java、js之间使用AES加密通信数据

    [1].[代码] java AES加密解密辅助类 package com.zoki.security; import ch.qos.logback.classic.Logger; import jav ...

  2. java nodejs aes_Java与Node.js利用AES加密解密出相同结果的方法示例

    前言 工作中遇到nodejs端通过aes加密,安卓客户端Java解密,同样nodejs也需要解密安卓客户端加密过来的内容,发现两个加密结果不一样,查询资料发现java端需要对密钥再MD5加密一遍,以下 ...

  3. java php aes加密解密_php aes 加密解密可与java对接

    php aes 加密解密可与java对接 博主:liu1693 发表时间:2017-02-23 16:52:27 浏览量:100 class Encrypt{ //加密方法 public static ...

  4. android、ios、php之间AES加密解密

    使用原因: 因为在项目中,需要在与客户端(IOS,Android)交互的时候,保存一些私有信息,不被别人看到,所以,使用了比较流行的可以反向加解密的AES. PHP 源码 <?php$aes = ...

  5. AES加密解密算法Java实现

    AES加密算法是密码学中的高级加密标准(Advanced Encryption Standard,AES),又称Rijndael加密法,是美国联邦政府采用的一种区块加密标准.这个标准用来替代原先的DE ...

  6. ios java aes_PHP7 AES加密解密函数_兼容ios/andriod/java对等加解密

    **PHP7.0 7.1 7.2 7.3 AES对等加解密类 函数文件_兼容ios/andriod/java等** 由于新项目规划要求使用PHP7.2开发环境,但在部分新系统中仍需使用AES加解密方式 ...

  7. aes加密算法python语言实现_C#, Java, PHP, Python和Javascript几种语言的AES加密解密实现[转载]...

    原文:http://outofmemory.cn/code-snippet/35524/AES-with-javascript-java-csharp-python-or-php c#里面的AES加密 ...

  8. AES加密解密(java、web、app)

    AES加密解密(java.web.app) AES加密解密(java.web.app) java端 Web端 ios端 AES加密解密(java.web.app) java端 package com. ...

  9. Java AES 加密解密工具类

    maven 引入一个依赖 <!-- https://mvnrepository.com/artifact/commons-codec/commons-codec --> <depen ...

最新文章

  1. Android逆向之路---Faceu的登录功能真的只提交了用户名和密码吗
  2. mysql中find_in_set()函数的使用
  3. mybatis中传入String类型参数异常
  4. 关于HTML Object中三个Style实例的区别
  5. linux组类型,LINUX用户以及用户组
  6. “菜”鸟理解.NET Framework(CLI,CLS,CTS,CLR,FCL,BCL)
  7. net中的调试javascript脚本
  8. 计组之中央处理器:3、数据通路(单总线结构、专用通路结构)
  9. Oracle笔记 五、创建表、约束、视图、索引、序列、同义词、表空间
  10. 中国无人车第一案!百度状告景驰王劲:窃取机密,不还电脑,索赔5000万
  11. 【java笔记】自定义异常
  12. 力扣-102. 二叉树的层序遍历
  13. 腾讯产培课堂|产品经理岗位解析×面试指南
  14. 教务管理系统数据字典mysql_学校教务管理系统--数据库课程设计
  15. linux挂载iso5后如何安装,CentOS系统怎样挂载光盘镜像ISO文件
  16. Multiple primary key defined
  17. 通过创建Google快讯将定期搜索结果发送到Gmail信箱
  18. ardupilot-3.6.9 stabilize模式下(增稳模式)油门输入输出整理
  19. 电脑如何在线制作文件二维码?二维码怎么下载文件?
  20. 8种微信小程序赚钱方式

热门文章

  1. Nacos下载和安装-windows版本
  2. tpr、fpr和far、val含义及计算总结
  3. gcc编译 -I头文件目录 -L lib库目录 -l动态库文件
  4. Python+Vue计算机毕业设计车辆年检系统的设计与实现u7cih(源码+程序+LW+部署)
  5. [STM32F7] 【分享评测】移植JAM Player到Nucleo-STM32F767ZI-144
  6. PyCharm恢复初始设置
  7. 高仿QQ讨论组头像拼图
  8. 嗯呐..第一条博客....纪念石家庄培训的晚上....最简单的STL vector
  9. 使用 JPQL 和原生 SQL 查询 JPA 实体(转)
  10. android 修改 dpi_Android屏幕适配重点盘点