php

{//初始化向量

private $iv = '84195bd96a8a2e7f';//Mcrypt算法

private $cipher =MCRYPT_RIJNDAEL_128;//Mcrypt支持的加密模型 特别适用于对文件进行加密。 相比 ECB, 它的安全性有明显提升。

private $mode =MCRYPT_MODE_CBC;public function encrypt($str, $key = '')

{$str = $this->addPKCS7Padding($str);$encrypted = mcrypt_encrypt($this->cipher, $key, $str, $this->mode, $this->iv);return $encrypted;

}public function decrypt($code, $key = '')

{$decrypted = mcrypt_decrypt($this->cipher, $key, $code, $this->mode, $this->iv);$decrypted = $this->stripPKSC7Padding($decrypted);return $decrypted;

}protected function addPKCS7Padding($source)

{$block = mcrypt_get_block_size($this->cipher, $this->mode);$pad = $block - (strlen($source) % $block);$char = chr($pad);$source .= str_repeat($char, $pad);return $source;

}public function stripPKSC7Padding($source)

{$char = substr($source, -1);$num = ord($char);$source = substr($source, 0, -$num);return $source;

}

}

注意:php 的 mcrypt_簇 在 7.1.0 版本中开始 deprecated,并在 7.2.0 版本中彻底废弃 ,可以增加@来抑制报错

mcrypt always pads data will the null ('\0') character to fill out to n * blocksize

mcrypt_簇 和 openssl_族对应关系

注意 MCRYPT_RIJNDAEL_256 并不是 AES-256,如果想使用mcrypt_簇 实现 AES-256,则你应该使用 MCRYPT_RIJNDAEL_128 算法 + 32 位的 key

MCRYPT_RIJNDAEL_128 & MCRYPT_MODE_CBC + 16位Key = openssl_encrypt(AES-128-CBC, 16位Key) = AES-128MCRYPT_RIJNDAEL_128& MCRYPT_MODE_CBC + 24位Key = openssl_encrypt(AES-192-CBC, 24位Key) = AES-192MCRYPT_RIJNDAEL_128& MCRYPT_MODE_CBC + 32位Key = openssl_encrypt(AES-256-CBC, 32位Key) = AES-256

java

/*** AES加解密 for原创php代码

* 非PHP重构代码不要使用该方法*/@Slf4jpublic classOgnvAesCrypt {/*** 使用固定长度密钥*/

private static final int KEY_LENGTH = 16;/*** 算法/模式/填充方式*/

private static final String AES_CIPHER = "AES/CBC/PKCS7Padding";private static final String AES_ALGORITHM = "AES";private static final IvParameterSpec IV = new IvParameterSpec("84195bd96a8a2e7f".getBytes());static{//support PKCS7Padding

if (Security.getProvider(BouncyCastleProvider.PROVIDER_NAME) == null) {

Security.addProvider(newBouncyCastleProvider());

}

}/*** aes解密

*@paramdata 加密数据

*@paramkey 解密密钥

*@returnnull 参数不符合要求或解密失败*/

public static byte[] decrypt(byte[] data, byte[] key) {if (data == null || key == null) {return null;

}if (key.length !=KEY_LENGTH) {throw new RuntimeException("Invalid AES key length (must be 16 bytes)");

}try{

SecretKeySpec secretKey= newSecretKeySpec(key, AES_ALGORITHM);byte[] enCodeFormat =secretKey.getEncoded();

SecretKeySpec seckey= newSecretKeySpec(enCodeFormat, AES_ALGORITHM);

Cipher cipher=Cipher.getInstance(AES_CIPHER);

cipher.init(Cipher.DECRYPT_MODE, seckey, IV);returncipher.doFinal(data);

}catch(Exception e) {

log.error("OgnvAesCrypt decrypt fail:{}", e.getMessage(), e);

}return null;

}/*** aes加密

*@paramdata 需要加密的内容

*@paramkey 加密密钥

*@return参数不符合要求或加密失败*/

public static byte[] encrypt(byte[] data, byte[] key) {if (data == null || key == null) {return null;

}if (key.length !=KEY_LENGTH) {throw new RuntimeException("Invalid AES key length (must be 16 bytes)");

}try{

SecretKeySpec secretKey= newSecretKeySpec(key, AES_ALGORITHM);byte[] enCodeFormat =secretKey.getEncoded();

SecretKeySpec seckey= newSecretKeySpec(enCodeFormat, AES_ALGORITHM);

Cipher cipher=Cipher.getInstance(AES_CIPHER);

cipher.init(Cipher.ENCRYPT_MODE, seckey, IV);returncipher.doFinal(data);

}catch(Exception e) {

log.error("OgnvAesCrypt encrypt fail:{}", e.getMessage(), e);

}return null;

}

}

AES 是  Rijndael 子集

AES has a fixed block size of 128 bits and a key size of 128, 192, or 256 bits,

whereas Rijndael can be specified with block and key sizes in any multiple of 32 bits, with a minimum of 128 bits and a maximum of 256 bits.

BouncyCastle 是一个提供了很多 Java标准库 哈希算法和加密算法的第三方库

PKCS5Padding是不支持AES算法的,当Cipher.getInstance("AES/CBC/PKCS5Padding") 时实际使用的是PKCS7Padding,可能是历史遗留问题

pkcs5 vs pkcs7

pkcs5是pkcs7的子集算法

pkcs5: blockSize固定为8byte

pkcs7: blockSize固定为 1~255byte

生成指定长度密钥

口令可以为任意长度,但是不同加密算法对密钥长度有严格要求

//口令

String password = "jksong";//密钥生成器

KeyGenerator keyGenerator = KeyGenerator.getInstance("AES");//SHA1PRNG随机算法为:原始秘钥经过两次sha1加密//php对应代码: substr(openssl_digest(openssl_digest($key, 'sha1', true), 'sha1', true), 0, 密钥位数);

SecureRandom secureRandom = SecureRandom.getInstance("SHA1PRNG");

secureRandom.setSeed(password.getBytes());//设置密钥的大小和随机源

keyGenerator.init(128, secureRandom);//生成唯一秘钥

SecretKey secretKey =keyGenerator.generateKey();byte[] encoded =secretKey.getEncoded();

System.out.println(Hex.encodeHexString(encoded));

参考

php aes java_AES php java 互转相关推荐

  1. AES加密算法在Java中的应用

    1.加密算法 一两个月没写过博客了,上次把尚筹网的博客补了一波,然后就在找工作,这不,这个月刚入职,领导给了个代码优化的任务,使用SornarQube对项目代码进行分析,然后根据分析出来的点逐点优化. ...

  2. [JAVA实战篇] AES加密的JAVA实现及AES算法讲解

    AES加密算法原理 1. S-P结构加密 AES加密算法是2001年由美国提出的互联网加密算法,从密码学的角度来讲,AES是典型的S-P结构加密.什么是S-P结构加密呢,手残博主画了一张图帮助大家理解 ...

  3. aes加密算法 java实现,AES加密算法的java实现

    AES加密算法的java实现 package com.encryp; import java.security.InvalidKeyException; import java.security.No ...

  4. 前端使用CryptoJS的AES解密,Java后端加密实现

    前端使用CryptoJS的AES解密,Java后端加密实现.CryptoJS的AES输出使用的是openssl格式,所以处理起来有一些不一样,详细代码如下: import org.bouncycast ...

  5. Delphi与JAVA互加解密AES算法

    搞了半天终于把这个对应的参数搞上了,话不多说,先干上代码: package com.bss.util;import java.io.UnsupportedEncodingException; impo ...

  6. java aes php_php和java的aes默认加密算法有点区别及解决方法。

    1.php和java的aes默认加密算法有点区别,php能解密java加密的密文,但java不能解密php加密的密文.原因在于: 1.Java中AES加密与解密默认使用AES/ECB/PKCS5Pad ...

  7. delphi7aes加密解密与java互转_惊呆了!不改一行Java代码竟然就能轻松解决敏感信息加解密|原创

    前言 出于安全考虑,现需要将数据库的中敏感信息加密存储到数据库中,但是正常业务交互还是需要使用明文数据,所以查询返回我们还需要经过相应的解密才能返回给调用方. ❝ ps:日常开发中,我们要有一定的安全 ...

  8. 关于AES算法及JAVA中的实现

    为什么80%的码农都做不了架构师?>>>    什么是AES 密码学中的高级加密标准(Advanced Encryption Standard,AES),又称Rijndael加密法, ...

  9. javascript 解密_Javascript中的AES加密和Java中的解密

    javascript 解密 AES代表高级加密系统,它是一种对称加密算法,很多时候我们需要在客户端加密一些纯文本,例如密码,然后将其发送到服务器,然后由服务器解密以进行进一步处理.AES加密和解密更加 ...

最新文章

  1. 如何使用pyecharts中自带的数据集?
  2. wxpython是什么_请问wxpython中 event传递的什么参数?
  3. 集训队脱单大法:这是一道只能由学姐我自己出数据的水题
  4. 关于 TypeScript 联合类型 union type 赋值的一个错误消息
  5. 宝骏530中控屏怎么安装软件_试驾2020款宝骏530:大屏加六座,就这么直接
  6. 面向小姐姐的编程——java面相对象之抽象
  7. linux利用内存加快读盘速度,Linux性能优化从入门到实战:10 内存篇:如何利用Buffer和Cache优化程序的运行效率?...
  8. Node.js之Stream可读流readable
  9. Virtualbox中Ubuntu与windows共享文件夹设置
  10. 功能强大的云打印组件-接口文档
  11. Linux 镜像文件ISO下载
  12. sha256算法_以太坊2.0将弃用Keccak256,而启用SHA256哈希算法?
  13. Chrome启动参数最全集合
  14. 固态硬盘是什么接口_电脑固态硬盘和机械硬盘有什么区别-电脑固态硬盘和机械硬盘区别介绍...
  15. 多元思维模型——全学科及其核心思维模型
  16. Vue定义全局常量,全局方法
  17. 吐槽一下程序员职场那些令人迷惑的行为
  18. gitlab流水线自动部署流程
  19. sdk是什么_动态贴纸在美颜sdk中起着什么作用
  20. Visual Studio Codec#

热门文章

  1. matlab struct 结构体
  2. 【笔试/面试】—— 网络
  3. utilities(C++)——枚举
  4. 豆瓣python网络数据采集器代理_Python 网络数据采集1
  5. atop用法_atop 使用详情
  6. python下载-python下载及安装
  7. python有趣的代码-趣味至上主义:这5个有趣的Python库带你花式编码
  8. python练手经典100例-10 个最值得 Python 新人练手的有趣项目
  9. python 菜鸟-python菜鸟教程
  10. python怎么读写文件-python读写文件