AES 加解密 JAVA 与 PHP、Python 互通

本贴最后更新于 2207 天前,其中的信息可能已经时异事殊

直接上代码,拿来就能用那种!
Java 端 aes 加密代码,如下:

import javax.crypto.Cipher; import javax.crypto.spec.IvParameterSpec; import javax.crypto.spec.SecretKeySpec; import org.apache.commons.codec.binary.Base64; /** * * @ClassName: AESToPhpUtil * @Description: AES与php互通加解密工具类 * @author: Stone * @date: 2019年4月17日 * */ public class AESToPhpUtil { // 约定加密规则 private static final String KEY_ALGORITHM = "AES"; private static final String DEFAULT_CIPHER_ALGORITHM = "AES/CBC/NoPadding"; /** * AES加密 * * @param data 待加密数据 * @param key 算法要求16位 * @param iv 算法要求16位 * @return */ public static String encryptData(String data, String key, String iv) { try { Cipher cipher = Cipher.getInstance(DEFAULT_CIPHER_ALGORITHM); int blockSize = cipher.getBlockSize(); byte[] dataBytes = data.getBytes(); int plaintextLength = dataBytes.length; if (plaintextLength % blockSize != 0) { plaintextLength = plaintextLength + (blockSize - (plaintextLength % blockSize)); } byte[] plaintext = new byte[plaintextLength]; System.arraycopy(dataBytes, 0, plaintext, 0, dataBytes.length); SecretKeySpec keyspec = new SecretKeySpec(key.getBytes(), KEY_ALGORITHM); IvParameterSpec ivspec = new IvParameterSpec(iv.getBytes()); cipher.init(Cipher.ENCRYPT_MODE, keyspec, ivspec); byte[] encrypted = cipher.doFinal(plaintext); return new String(Base64.encodeBase64(encrypted)); } catch (Exception e) { e.printStackTrace(); } return null; } /** * AES解密 * * @param data 待加密数据 * @param key 算法要求16位 * @param iv 算法要求16位 * @return */ public static String decryptData(String data, String key, String iv) { try { byte[] encrypted = Base64.decodeBase64(data.getBytes()); Cipher cipher = Cipher.getInstance(DEFAULT_CIPHER_ALGORITHM); SecretKeySpec keyspec = new SecretKeySpec(key.getBytes(), KEY_ALGORITHM); IvParameterSpec ivspec = new IvParameterSpec(iv.getBytes()); cipher.init(Cipher.DECRYPT_MODE, keyspec, ivspec); byte[] original = cipher.doFinal(encrypted); String originalString = new String(original); return originalString; } catch (Exception e) { e.printStackTrace(); } return null; } public static void main(String[] args) { String secret = "1GStYafrhv7cBJ4KzXQPmEui63DO258N"; String key = secret.substring(0, 16);// key值取密钥前16位(可以任意截取其中16位,只要和对接方约定好即可) String iv = secret.substring(16, 32);// 随机iv值取密钥后16位(可以任意截取其中16位,只要和对接方约定好即可) String data = "AES加解密JAVA与PHP互通"; String enStr = AESToPhpUtil.encryptData(data, key, iv); System.out.println("加密后:" + enStr); String deStr = AESToPhpUtil.decryptData(enStr, key, iv); System.out.println("解密后:" + deStr); } }

运行效果,如下:

加密后:I0E/I/D3xXJI18cfqJP8023ml6dC/F62IRJ8qVEh2Ew= 解密后:AES加解密JAVA与PHP互通

php 端加解密,如下:

<?php $secret = "1GStYafrhv7cBJ4KzXQPmEui63DO258N"; $privateKey = substr($secret,0,15); // key值取密钥前16位(可以任意截取其中16位,只要和对接方约定好即可) $iv = substr($secret,16,32); // 随机iv值取密钥后16位(可以任意截取其中16位,只要和对接方约定好即可) $data = "AES加解密JAVA与PHP互通"; //加密 $encrypted = mcrypt_encrypt(MCRYPT_RIJNDAEL_128, $privateKey, $data, MCRYPT_MODE_CBC, $iv); echo(base64_encode($encrypted)); echo '<br/>'; //解密 $encryptedData = base64_decode(base64_encode($encrypted)); $decrypted = mcrypt_decrypt(MCRYPT_RIJNDAEL_128, $privateKey, $encryptedData, MCRYPT_MODE_CBC, $iv); echo($decrypted); ?>

python 端加解密,如下:

# -*- coding:utf-8 -*- import base64 from Crypto.Cipher import AES import json # 秘钥 key = "1GStYafrhv7cBJ4K" iv = "zXQPmEui63DO258N" def add_to_16(s): """ 判断str不是16的倍数,不足就补足为16的倍数 :param s: 传入的原始字符串 :return: 返回是16倍的字符串 bytes """ while len(s) % 16 != 0: s += '\0' return str.encode(s) def aes_encrypt(s): """ AES加密 :param s: 传入的原始字符串 :return: 加密后字符串 """ aes = AES.new(add_to_16(key), AES.MODE_CBC, add_to_16(iv)) # 初始化加密器 en = str(base64.encodebytes(aes.encrypt(add_to_16(s))), encoding='utf8').replace('\n', '') return en def aes_descrypt(s): """ AES解密 :param s: 传入的原始字符串 :return: 解密后字符串 """ aes = AES.new(add_to_16(key), AES.MODE_CBC, add_to_16(iv)) # 初始化加密器 de = str(aes.decrypt(base64.decodebytes(bytes(s, encoding='utf8'))).rstrip(b'\0').decode("utf8")) return de if __name__ == '__main__': data_str = "{'pageNo': 1, 'pageSize': 20}" # 字符串 data_dict = json.dumps(data_str) # 字典 en = aes_encrypt(data_dict) print("加密后的数据: " + en) de = aes_descrypt(en) print("解密后的数据: " + de)

有任何问题欢迎跟帖交流 0.0

  • AES
    7 引用
  • Java

    Java 是一种可以撰写跨平台应用软件的面向对象的程序设计语言,是由 Sun Microsystems 公司于 1995 年 5 月推出的。Java 技术具有卓越的通用性、高效性、平台移植性和安全性。

    3200 引用 • 8216 回帖
  • PHP

    PHP(Hypertext Preprocessor)是一种开源脚本语言。语法吸收了 C 语言、 Java 和 Perl 的特点,主要适用于 Web 开发领域,据说是世界上最好的编程语言。

    180 引用 • 408 回帖 • 484 关注
  • Python

    Python 是一种面向对象、直译式电脑编程语言,具有近二十年的发展历史,成熟且稳定。它包含了一组完善而且容易理解的标准库,能够轻松完成很多常见的任务。它的语法简捷和清晰,尽量使用无异义的英语单词,与其它大多数程序设计语言使用大括号不一样,它使用缩进来定义语句块。

    556 引用 • 675 回帖
1 操作
Stone 在 2019-04-22 10:36:16 更新了该帖

相关帖子

欢迎来到这里!

我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。

注册 关于
请输入回帖内容 ...

推荐标签 标签

  • 前端

    前端技术一般分为前端设计和前端开发,前端设计可以理解为网站的视觉设计,前端开发则是网站的前台代码实现,包括 HTML、CSS 以及 JavaScript 等。

    245 引用 • 1338 回帖 • 1 关注
  • Eclipse

    Eclipse 是一个开放源代码的、基于 Java 的可扩展开发平台。就其本身而言,它只是一个框架和一组服务,用于通过插件组件构建开发环境。

    76 引用 • 258 回帖 • 628 关注
  • V2Ray
    1 引用 • 15 回帖
  • Flume

    Flume 是一套分布式的、可靠的,可用于有效地收集、聚合和搬运大量日志数据的服务架构。

    9 引用 • 6 回帖 • 655 关注
  • Linux

    Linux 是一套免费使用和自由传播的类 Unix 操作系统,是一个基于 POSIX 和 Unix 的多用户、多任务、支持多线程和多 CPU 的操作系统。它能运行主要的 Unix 工具软件、应用程序和网络协议,并支持 32 位和 64 位硬件。Linux 继承了 Unix 以网络为核心的设计思想,是一个性能稳定的多用户网络操作系统。

    952 引用 • 944 回帖 • 1 关注
  • BND

    BND(Baidu Netdisk Downloader)是一款图形界面的百度网盘不限速下载器,支持 Windows、Linux 和 Mac,详细介绍请看这里

    107 引用 • 1281 回帖 • 33 关注
  • RIP

    愿逝者安息!

    8 引用 • 92 回帖 • 399 关注
  • IDEA

    IDEA 全称 IntelliJ IDEA,是一款 Java 语言开发的集成环境,在业界被公认为最好的 Java 开发工具之一。IDEA 是 JetBrains 公司的产品,这家公司总部位于捷克共和国的首都布拉格,开发人员以严谨著称的东欧程序员为主。

    181 引用 • 400 回帖
  • ngrok

    ngrok 是一个反向代理,通过在公共的端点和本地运行的 Web 服务器之间建立一个安全的通道。

    7 引用 • 63 回帖 • 648 关注
  • 心情

    心是产生任何想法的源泉,心本体会陷入到对自己本体不能理解的状态中,因为心能产生任何想法,不能分出对错,不能分出自己。

    59 引用 • 369 回帖 • 1 关注
  • abitmean

    有点意思就行了

    37 关注
  • Maven

    Maven 是基于项目对象模型(POM)、通过一小段描述信息来管理项目的构建、报告和文档的软件项目管理工具。

    188 引用 • 319 回帖 • 252 关注
  • 小说

    小说是以刻画人物形象为中心,通过完整的故事情节和环境描写来反映社会生活的文学体裁。

    32 引用 • 108 回帖
  • Scala

    Scala 是一门多范式的编程语言,集成面向对象编程和函数式编程的各种特性。

    13 引用 • 11 回帖 • 159 关注
  • 开源中国

    开源中国是目前中国最大的开源技术社区。传播开源的理念,推广开源项目,为 IT 开发者提供了一个发现、使用、并交流开源技术的平台。目前开源中国社区已收录超过两万款开源软件。

    7 引用 • 86 回帖 • 2 关注
  • danl
    164 关注
  • App

    App(应用程序,Application 的缩写)一般指手机软件。

    91 引用 • 384 回帖
  • BookxNote

    BookxNote 是一款全新的电子书学习工具,助力您的学习与思考,让您的大脑更高效的记忆。

    笔记整理交给我,一心只读圣贤书。

    1 引用 • 1 回帖
  • SEO

    发布对别人有帮助的原创内容是最好的 SEO 方式。

    35 引用 • 200 回帖 • 31 关注
  • Latke

    Latke 是一款以 JSON 为主的 Java Web 框架。

    71 引用 • 535 回帖 • 830 关注
  • Hibernate

    Hibernate 是一个开放源代码的对象关系映射框架,它对 JDBC 进行了非常轻量级的对象封装,使得 Java 程序员可以随心所欲的使用对象编程思维来操纵数据库。

    39 引用 • 103 回帖 • 726 关注
  • MySQL

    MySQL 是一个关系型数据库管理系统,由瑞典 MySQL AB 公司开发,目前属于 Oracle 公司。MySQL 是最流行的关系型数据库管理系统之一。

    693 引用 • 537 回帖
  • Hprose

    Hprose 是一款先进的轻量级、跨语言、跨平台、无侵入式、高性能动态远程对象调用引擎库。它不仅简单易用,而且功能强大。你无需专门学习,只需看上几眼,就能用它轻松构建分布式应用系统。

    9 引用 • 17 回帖 • 633 关注
  • 创造

    你创造的作品可能会帮助到很多人,如果是开源项目的话就更赞了!

    184 引用 • 1018 回帖 • 1 关注
  • Outlook
    1 引用 • 5 回帖 • 4 关注
  • CentOS

    CentOS(Community Enterprise Operating System)是 Linux 发行版之一,它是来自于 Red Hat Enterprise Linux 依照开放源代码规定释出的源代码所编译而成。由于出自同样的源代码,因此有些要求高度稳定的服务器以 CentOS 替代商业版的 Red Hat Enterprise Linux 使用。两者的不同在于 CentOS 并不包含封闭源代码软件。

    239 引用 • 224 回帖
  • TensorFlow

    TensorFlow 是一个采用数据流图(data flow graphs),用于数值计算的开源软件库。节点(Nodes)在图中表示数学操作,图中的线(edges)则表示在节点间相互联系的多维数据数组,即张量(tensor)。

    20 引用 • 19 回帖 • 2 关注