相关文章推荐
发财的熊猫  ·  专业化与产业化整合唱主角 ...·  1 年前    · 
私奔的酱牛肉  ·  5 ...·  1 年前    · 
愤怒的手术刀  ·  怪异伪装电影 - 抖音·  1 年前    · 
奔放的松树  ·  国机汽车:预计Finoba公司后续将正式进入 ...·  1 年前    · 
粗眉毛的丝瓜  ·  潮汕商会有多大实力_潮汕商会有哪些大佬_潮汕 ...·  1 年前    · 
Code  ›  JAVA与PHP之间进行aes加密解密开发者社区
string aes php解密 摘要算法
https://cloud.tencent.com/developer/article/2035759
冷冷的小笼包
1 年前
作者头像
BUG弄潮儿
0 篇文章

JAVA与PHP之间进行aes加密解密

前往专栏
腾讯云
开发者社区
文档 意见反馈 控制台
首页
学习
活动
专区
工具
TVP
文章/答案/技术大牛
发布
首页
学习
活动
专区
工具
TVP
返回腾讯云官网
社区首页 > 专栏 > JAVA乐园 > JAVA与PHP之间进行aes加密解密

JAVA与PHP之间进行aes加密解密

作者头像
BUG弄潮儿
发布 于 2022-06-30 14:37:49
1.4K 0
发布 于 2022-06-30 14:37:49
举报

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 .

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

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

hmac = hash_hmac('sha512', secert_str,

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

secert_str = hmac .

return urlencode($secert_str);

解密举例

str=rawurldecode( str);

len = mb_strlen( secert_str);

ori_hmac = substr( secert_str, 0, 128);

data = substr( secert_str, 128,

//2.验证摘要

local_hmac = hash_hmac('sha512', data,

$diff = 0;

for ( i = 0; i < 128;

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

}

if ($diff !== 0) {

return FALSE;

}

//3.分离iv

len = mb_strlen( data);

iv = substr( data, 0, 16);

data = substr( data, 16,

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

}

}

}

本文参与 腾讯云自媒体分享计划 ,分享自微信公众号。
原始发表:2017-12-08 ,如有侵权请联系 cloudcommunity@tencent.com 删除
javascript
编程算法
java

本文分享自 BUG弄潮儿 微信公众号, 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划 ,欢迎热爱写作的你一起参与!

javascript
编程算法
java
评论
登录 后参与评论
0 条评论
热度
最新
登录 后参与评论
关于作者
BUG弄潮儿
架构师
0
文章
0
累计阅读量
0
获赞
前往专栏
领券
  • 社区

    • 专栏文章
    • 阅读清单
    • 互动问答
    • 技术沙龙
    • 技术视频
    • 团队主页
    • 腾讯云TI平台
  • 活动

    • 自媒体分享计划
    • 邀请作者入驻
    • 自荐上首页
    • 技术竞赛
  • 资源

    • 技术周刊
    • 社区标签
    • 开发者手册
    • 开发者实验室
  • 关于

    • 社区规范
    • 免责声明
    • 联系我们
    • 友情链接

腾讯云开发者

扫码关注腾讯云开发者

扫码关注腾讯云开发者

领取腾讯云代金券

热门产品

  • 域名注册
  • 云服务器
  • 区块链服务
  • 消息队列
  • 网络加速
  • 云数据库
  • 域名解析
  • 云存储
  • 视频直播

热门推荐

  • 人脸识别
  • 腾讯会议
  • 企业云
  • CDN加速
  • 视频通话
  • 图像分析
  • MySQL 数据库
  • SSL 证书
  • 语音识别

更多推荐

  • 数据安全
  • 负载均衡
  • 短信
  • 文字识别
  • 云点播
  • 商标注册
  • 小程序开发
  • 网站监控
  • 数据迁移

Copyright © 2013 - 2023 Tencent Cloud. All Rights Reserved. 腾讯云 版权所有

深圳市腾讯计算机系统有限公司 ICP备案/许可证号: 粤B2-20090059 深公网安备号 44030502008569

腾讯云计算(北京)有限责任公司 京ICP证150476号 | 京ICP备11018762号 | 京公网安备号11010802020287

问题归档 专栏文章 快讯文章归档 关键词归档 开发者手册归档 开发者手册 Section 归档

Copyright © 2013 - 2023 Tencent Cloud.

All Rights Reserved. 腾讯云 版权所有

登录 后参与评论
 
推荐文章
发财的熊猫  ·  专业化与产业化整合唱主角 央企控股上市公司重组好戏连台
1 年前
私奔的酱牛肉  ·  5 部关于闺蜜友情的小说推荐:我们才不是「塑料姐妹花」_生活
1 年前
愤怒的手术刀  ·  怪异伪装电影 - 抖音
1 年前
奔放的松树  ·  国机汽车:预计Finoba公司后续将正式进入破产程序
1 年前
粗眉毛的丝瓜  ·  潮汕商会有多大实力_潮汕商会有哪些大佬_潮汕商会都是潮汕人吗 - 抖音
1 年前
今天看啥   ·   Py中国   ·   codingpro   ·   小百科   ·   link之家   ·   卧龙AI搜索
删除内容请联系邮箱 2879853325@qq.com
Code - 代码工具平台
© 2024 ~ 沪ICP备11025650号