近期项目论坛,需要把网站的登陆注册用户这方面要全部走上面给的用户中心数据库的接口,接口文档中用到了AES加密,原以为用PHP的mcrypt_encrypt或者openssl_encrypt写就好了,没想到没那么简单,原来接口文档中秘钥又进行了一次SHA1PRNG算法的加密,话不多了上代码

Java代码
public static String encrypt(String content, String password) {try {if (StringUtils.isEmpty(content))return "";KeyGeneratorkgen = KeyGenerator.getInstance("AES");SecureRandom random = SecureRandom.getInstance("SHA1PRNG");random.setSeed(password.getBytes());kgen.init(128, random);SecretKeysecretKey = kgen.generateKey();byte[] enCodeFormat = secretKey.getEncoded();SecretKeySpec key = new SecretKeySpec(enCodeFormat, "AES");Cipher cipher = Cipher.getInstance("AES");byte[] byteContent = content.getBytes("utf-8");cipher.init(Cipher.ENCRYPT_MODE, key);byte[] result = cipher.doFinal(byteContent);String str = Base64.getEncoder().encodeToString(result);returnstr; } catch (NoSuchAlgorithmException e) {// e.printStackTrace();} catch (NoSuchPaddingException e) {// e.printStackTrace();} catch (InvalidKeyException e) {// e.printStackTrace();} catch (UnsupportedEncodingException e) {// e.printStackTrace();} catch (IllegalBlockSizeException e) {// e.printStackTrace();} catch (BadPaddingException e) {// e.printStackTrace();}return null;}public static String decrypt(String str, String password) {try {byte[] content = Base64.getDecoder().decode(str);KeyGeneratorkgen = KeyGenerator.getInstance("AES");SecureRandomsecureRandom = SecureRandom.getInstance("SHA1PRNG");secureRandom.setSeed(password.getBytes());kgen.init(128, secureRandom);SecretKeysecretKey = kgen.generateKey();byte[] enCodeFormat = secretKey.getEncoded();SecretKeySpec key = new SecretKeySpec(enCodeFormat, "AES");Cipher cipher = Cipher.getInstance("AES");cipher.init(Cipher.DECRYPT_MODE, key);byte[] result = cipher.doFinal(content);return new String(result,"UTF-8");} catch (NoSuchAlgorithmException e) {// e.printStackTrace();} catch (NoSuchPaddingException e) {// e.printStackTrace();} catch (InvalidKeyException e) {// e.printStackTrace();} catch (IllegalBlockSizeException e) {// e.printStackTrace();} catch (BadPaddingException e) {// e.printStackTrace();} catch (Exception e) {// e.printStackTrace();}return "";}

然后对应封装了一个PHP类

PHP代码class AES {//PKCS5Padding 补码方式private function _pkcs5Pad($text, $blockSize) {$pad = $blockSize - (strlen($text) % $blockSize);return $text . str_repeat(chr($pad), $pad);}private function _pkcs5Unpad($text) {$end = substr($text, -1);$last = ord($end);$len = strlen($text) - $last;if(substr($text, $len) == str_repeat($end, $last)) {return substr($text, 0, $len);}return false;}//加密public function encrypt($encrypt, $key) {$blockSize = mcrypt_get_block_size(MCRYPT_RIJNDAEL_128, MCRYPT_MODE_ECB);$paddedData = $this->_pkcs5Pad($encrypt, $blockSize);$ivSize = mcrypt_get_iv_size(MCRYPT_RIJNDAEL_128, MCRYPT_MODE_ECB);$iv = mcrypt_create_iv($ivSize, MCRYPT_RAND);$key2 = substr(openssl_digest(openssl_digest($key, 'sha1', true), 'sha1', true),0,16);$encrypted = mcrypt_encrypt(MCRYPT_RIJNDAEL_128, $key2, $paddedData, MCRYPT_MODE_ECB, $iv);return base64_encode($encrypted);}//解密public function decrypt($decrypt, $key) {$decoded = base64_decode($decrypt);$blockSize = mcrypt_get_iv_size(MCRYPT_RIJNDAEL_128, MCRYPT_MODE_ECB);$iv = mcrypt_create_iv($blockSize, MCRYPT_RAND);$key2 = substr(openssl_digest(openssl_digest($key, 'sha1', true), 'sha1', true), 0, 16);$decrypted = mcrypt_decrypt(MCRYPT_RIJNDAEL_128, $key2, $decoded, MCRYPT_MODE_ECB, $iv);return $this->_pkcs5Unpad($decrypted);}
}

附录:
感谢 php中关于AES加密对应Java中的SHA1PRNG方式加密的实例详解 文章的启发

Java的SHA1PRING方式AES加密对应的PHP写法相关推荐

  1. java实现RSA和AES加密(一)

    java实现RSA和AES加密(一) 由于公司要求接口安全升级,从自定义防篡改数据MD5加密验证,到使用RSA加密. 原始的MD5防数据篡改的方式: 将所有参数拼接起来,然后在某一字节后加入自定义的字 ...

  2. android开发 java与c# 兼容AES加密

    由于android客户端采用的是AES加密,服务器用的是asp.net(c#),所以就造成了不一致的加密与解密问题,下面就贴出代码,已经试验过. using System; using System. ...

  3. Java 环境下使用 AES 加密的特殊问题处理

    1. 密钥长度问题 默认 Java 中仅支持 128 位密钥,当使用 256 位密钥的时候,会报告密钥长度错误 Invalid AES key length 你需要下载一个支持更长密钥的包.这个包叫做 ...

  4. java实现双向RSA + AES加密

    本文主要讲解在APP上如何实现双向RSA + AES加密. 先上一张主要流程图: 场景预设: 由于客户端是APP而不是网页,APP在第一次加载的时候会生成一对RSA秘钥对(我们称它为APP公钥私钥,不 ...

  5. java aes 中文_从Java到Python的AES加密

    我试图对python和java中的一些字符串进行加密和解密,反之亦然,但是当我尝试用java加密和在python中使用相同的密钥解密时,我遇到了问题.在 这是我用来解密java输出的python算法f ...

  6. python加密方式-AES加密ECB模式

    安装所需包 pip install pycryptodome 编写代码 import base64from Crypto.Cipher import AES from Crypto.Util.Padd ...

  7. Java使用AES加密解密

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

  8. java代码实现python2中aes加密经历

    背景: 因项目需要,需要将一个python2编写的aes加密方式改为java实现. 1.源python2实现 from Crypto.Cipher import AES from binascii i ...

  9. Java中的AES加密和解密(CBC模式)

    通过有线方式传输诸如纯文本密码之类的机密数据总是容易受到安全性的影响,始终建议对此类信息进行加密并使用SSL传输这些机密数据.Java为此提供了多种加密算法.在本文中,我们将讨论Java中具有CBC模 ...

最新文章

  1. 蓝桥杯-组素数-java
  2. 大佬对大佬,史诗级面试现场!!!
  3. VS Code远程连接矩池云GPU主机
  4. 自己闲着没事整理的人工智能的思维导图
  5. caffe---验证码识别
  6. 慕课网 机器学习基础、任务、分类等笔记
  7. 使用GenyMotion模拟器+抓包工具SRSniffer分析网络请求
  8. Win10怎么提高显卡游戏性能
  9. 带左右箭头图片轮播的JS代码
  10. 用基带等效的方式仿真8-DPSK载波调制信号在AWGN信道下的误码率和误比特率,并与理论值相比较。
  11. 知到网课礼仪文化修养考试题库|真题试题(含答案)
  12. IJCAI 2022 | 鲁棒的Node-Node Level自对齐图对比学习
  13. 如何安装Tomcat 8.0
  14. 爬取6.6w+豆瓣电影之后,分析他们的故事
  15. 【新手入门硬件】分压电路中阻抗匹配问题
  16. Linux面试题完整修订附加答案
  17. 云服务器远程登录方法
  18. 【Elasticsearch】bulk的使用
  19. 快速画正弦波、方波、三角波——Visio制图总结(六)
  20. 通过一个大型项目来学习分布式算法(2)

热门文章

  1. php mysql问答系统_PHP+MYSQL问答系统V3.7
  2. PHPStudy(小皮)V8.1 中使用cmd进入MySQL命令行模式
  3. 网络-----------端口的认识
  4. DST 工况 FUDS 工况 DST工况
  5. python 常用代码段汇总(一) 判断数据类型 判断是否为整数(包括负数)
  6. 【微信小程序控制硬件16 】 安信可 ESP32-S 开发板实现移植腾讯物联开发平台蓝牙 llsync 协议,实现一键蓝牙快速配网+远程控制。(附带源码)
  7. TCP 几个字段含义
  8. 如何消除视频中的人声来制作配音视频
  9. 二、组件协作类设计模式
  10. Bethune 智能巡检平台,伴你度过运维平安夜