起因

群里有个小伙伴提了个关于AES加解密的问题。Java加密,php解密。
参考网上写的代码,发现解密总是失败。

结论

排查发现是因为链接里面代码使用的是16字节的KEY(博主没有说明),也就是AES-128方案,但是小伙伴使用的却是32字节的KEY,所以解密总是不成功。抄了一个32字节KEY的Demo代码来验证一下。

Demo环境

系统:Windows
JDK版本

java version "1.8.0_251"
Java(TM) SE Runtime Environment (build 1.8.0_251-b08)
Java HotSpot(TM) 64-Bit Server VM (build 25.251-b08, mixed mode)

PHP版本

PHP 7.4.1 (cli) (built: Dec 17 2019 19:23:59) ( NTS Visual C++ 2017 x64 )
Copyright (c) The PHP Group
Zend Engine v3.4.0, Copyright (c) Zend Technologies

AES-128 Demo

1.将AES-256 Demo中 Key的长度改为16个字节
2.将AES-256 Demo中的AES-256-ECB改为AES-128-ECB

AES-256 Demo

不多说,直接上代码
PHP代码

<?php
/*** Created by PhpStorm.* User: Shinelon* Date: 2018/7/19* Time: 14:22*/class AES
{public static function encrypt($data, $key) {$data =  openssl_encrypt($data, 'AES-256-ECB', $key, OPENSSL_RAW_DATA);return base64_encode($data);}public static function decrypt($data, $key) {$encrypted = base64_decode($data);return openssl_decrypt($encrypted, 'AES-256-ECB',$key, OPENSSL_RAW_DATA);}}$r = AES::decrypt('3pHJ2mb84CSTy9YTKBxH9A==','00112233440011223344001122334400');
$e = AES::encrypt('etstset','00112233440011223344001122334400');
echo $e . "\n";
echo $r . "\n";
?>

Java代码

public class TestMain {public static void main(String []args) throws Exception {Cipher cipher = Cipher.getInstance("AES/ECB/PKCS5Padding");cipher.init(Cipher.ENCRYPT_MODE, new SecretKeySpec("00112233440011223344001122334400".getBytes("utf-8"), "AES"));byte[] bytes = cipher.doFinal("helloworld".getBytes("utf-8"));System.out.println(new BASE64Encoder().encode(bytes));System.out.println(aesDecrypt("61gIBA+wmnHtx76YwLBF0A==","00112233440011223344001122334400"));}public static String aesDecrypt(String str, String key) throws Exception {if (str == null || key == null) return null;Cipher cipher = Cipher.getInstance("AES/ECB/PKCS5Padding");cipher.init(Cipher.DECRYPT_MODE, new SecretKeySpec(key.getBytes("utf-8"), "AES"));byte[] bytes = new BASE64Decoder().decodeBuffer(str);bytes = cipher.doFinal(bytes);return new String(bytes, "utf-8");}
}

上面代码经过测试,可以正常的加解密的,Java加密的数据,PHP可以解密;PHP加密的数据,Java也可以正常解密。

经过对比,如果AES KEY长度为16个字节,那PHP的解密方法要设置成AES-128-ECB;如果是32个字节,那PHP的解密方法需要设置成AES-256-ECB,还有另外一种KEY长度,就让小伙伴去探索了,估计代码差不了多少。

PS:
以上代码很多一部分是从网上百度过来的,原作者看到不要鄙视本人哈。

参考链接

1.Unable to replicate an encryption method from Java to PHP using AES/ECB/PKCS5Padding
2.PHP7 解决 java对应的 AES/ECB/PKCS5Padding 算法
3.一文详解AES最常见的3种方案_AES-128、AES-192和AES-256

Java AES/ECB/PKCS5Padding加密和PHP解密的实现相关推荐

  1. aesecbpkcs5 php_php AES/ECB/PKCS5Padding加密

    AES/ECB/PKCS5Padding加密 error_reporting(E_ALL^E_NOTICE^E_WARNING);//此句要加上,否则会报php错误当iv位空时 class encry ...

  2. Java使用AES/EBC/PKCS5Padding加密,CryptoJS解密错误

    const key = CryptoJS.enc.Utf8.parse('你的秘钥'); // 这里是需要注意的地方// 其次就是{mode: CryptoJS.mode.ECB},我用的是4.1.1 ...

  3. PHP7 openssl 实现 AES/ECB/PKCS5Padding加密

    class CryptAES {/*** var string $method 加解密方法,可通过openssl_get_cipher_methods()获得*/protected $method;/ ...

  4. java aes cfb 256_aes加密解密源码,包括aes128、aes192、aes256位,以及cbc、cfb、ecb、ofb、pcbc模式...

    AES加解密总共有以下这些 算法/模式/填充                 字节加密后数据长度       不满16字节加密后长度 AES/CBC/NoPadding                 ...

  5. java AES文件流加密

    java AES文件流加密 文章转载自:https://www.cnblogs.com/gne-hwz/p/14736496.html java工具类-对称加密算法AES 加密文件流 工具类出自jdk ...

  6. Java AES密码盐加密

    Java AES密码盐加密 import lombok.extern.slf4j.Slf4j; import org.apache.tomcat.util.codec.binary.Base64;im ...

  7. AES/ECB/PKCS7Padding 加密

    算法:AES 模式:ECB 密钥长度:128位 密钥:自定义 补码方式:PKCS7Padding 加密结果编码方式:base64 aes_base64("123456") func ...

  8. java aes ctr_AES CBC和CTR加解密实例

    http://www.metsky.com/archives/585.html 2012 AES(Advanced Encryption Standard,高级加密标准) 又叫Rijndael加密法, ...

  9. java pkcs1padding_RSA/ECB/PKCS1Padding加密

    由于近期经常被改犇,我的有些犇犇会使用RSA/ECB/PKCS1Padding加密.我的公钥: Modulus: 7749508816481769130958656717979283807090064 ...

  10. C++或C 实现AES ECB模式加密解密,支持官方验证

    本文主要介绍 AES 算法的加解密方法.本文使用的语言为 C++,调用的 AES 库为:cryptopp. 1 概述 AES 加密算法的介绍如下(摘自 WikiPedia): 高级加密标准(英语:Ad ...

最新文章

  1. 2021计算机技能高考考纲,2021年湖北省技能高考技能考试大纲(机械类).pdf
  2. iOS架构-制作静态库.a和.framework 的相互依赖(10)
  3. 高并发高流量网络架构
  4. python flask 设置个性化的响应体 响应头 状态码
  5. bzoj - 2038: [2009国家集训队]小Z的袜子(hose)
  6. 四年软件开发转行感受谈
  7. 数据结构与算法之循环队列的操作
  8. Lec 16 Projection matrices and least squares
  9. ps怎么做出针式打印机打印效果字体?
  10. Microsoft Office 2007 Beta 2 下载(含所有的CD-KEY)
  11. 大学计算机基础教程第12章软件技术基础
  12. 从零实现“百度网盘批量重命名”工具
  13. 漫天要价,就地还钱!
  14. BOF——Bag-of-Featrures
  15. Mac用Visual Studio Code编写C/C++安装配置教程
  16. matlab app designer使用心得
  17. 防止ARP欺骗的简单方法——静态绑定网关
  18. 『TinyOS』 nesC 1.1 语言参考手册
  19. 如何快速剪辑多个短视频,去除视频片尾
  20. 顾维灏谈百度地图数据采集:POI自动处理率达90%

热门文章

  1. PCL 实现 ICP 算法原理源码解析
  2. 四元数与三维向量相乘运算法则
  3. 学习日记day35 平面设计 作品练习字体设计
  4. 如何禁用电脑文件共享
  5. 明御运维审计与风险控制系统远程桌面(server2012、2016系统)报错error:NLA or TLS security negotiation failure, Please check...
  6. Gerrit代码检查工具
  7. 抖音上热门的小技巧,不看后悔
  8. logstash全量导入es
  9. 安卓ASO怎么做?有哪些工具平台?安卓aso工具有哪些
  10. axio请求获取网络数据