AES-256 CBC 在 php 中加密并在 Java 中解密,反之亦然

2023-12-04

JAVA

import javax.crypto.Cipher;
import javax.crypto.spec.IvParameterSpec;
import javax.crypto.spec.SecretKeySpec;
import org.apache.commons.codec.binary.Base64;

class AES256JavaPhp{
        public static void main(String[] args) throws Exception {
                Base64 base64 = new Base64();
                Cipher ciper = Cipher.getInstance("AES/CBC/PKCS5Padding");
                SecretKeySpec key = new
                          SecretKeySpec("PasswordPassword".getBytes("UTF-8"),"AES");
                IvParameterSpec iv = new IvParameterSpec
                      ("dynamic@dynamic@".getBytes("UTF-8"),0,ciper.getBlockSize());
            //Encrypt
                ciper.init(Cipher.ENCRYPT_MODE, key,iv);
                byte[] encryptedCiperBytes = base64.encode
                                              ((ciper.doFinal("Hello".getBytes())));
                System.out.println("Ciper : "+new String(encryptedCiperBytes));
            //Decrypt
                ciper.init(Cipher.DECRYPT_MODE, key,iv);    
                byte[] text = ciper.doFinal(base64.decode(encryptedCiperBytes));
                System.out.println("Decrypt text : "+new String(text));
          }
    }

Java输出:

Ciper : KpgzpzCRU7mTKZePpPlEvA==
Decrypt text : Hello

PHP

<?php>    
        $cipherText = encrypt("Hello", 'aes-256-cbc');
        exit();

        function encrypt($data, $algo)
        {
            $key = 'PasswordPassword';
            //$iv = random_bytes(openssl_cipher_iv_length($algo));
            $iv = 'dynamic@dynamic@';
            $cipherText = openssl_encrypt(
                    $data,
                    $algo,
                    $key,
                    OPENSSL_RAW_DATA,
                    $iv
                );
        $cipherText = base64_encode($cipherText);
        printData("Ciper Text : $cipherText");

        $cipherText = base64_decode($cipherText);
        $plaintext = openssl_decrypt(
                    $cipherText,
                    $algo,
                    $key,
                    OPENSSL_RAW_DATA,
                    $iv
                );
        printData("Plain Text after decryption : $plaintext");
        }

        function printData($obj)
        {
            print_r($obj);
        }
?>

PHP 输出:

Ciper Text : ef/ENVlBn9QBFlkvoN7P2Q==
Plain Text after decryption : Hello

即使它们使用相同的密钥和 IV,生成的密码也是不同的。这怎么可能?


显然你必须使用相同的 AES 密钥和 IV进行安全会话。并且必须在客户之间正确、安全地传达这些信息。确实如此一点也不重要客户端是用什么语言编写的。您的问题是不了解密钥协商和会话建立的协议。

初始化向量是not受保护的值;即,在客户端之间通信时,您没有对其进行加密。必须是包装好的以明文形式使用加密的 AES 密钥(从某些密钥协商协议派生)。

CMS uses a KeyTransRecipientInfo来传递此信息。TLS还定义了四、设立跟随其握手。我强烈建议遵循 CMS 实现,而不是人为的、几乎肯定会包含安全错误的东西。


Update

现在很明显,您很困惑为什么生成的密文不是确定性的。这是因为 Java 实现默认采用 128 位加密,并且已提供 128 位密钥,butPHP 代码请求 256 位强度加密,并且仅提供相同的强度128位密钥。因此,PHP必须要padding这个键。


Update 2

根据您的以下评论,以下是使用 Java 生成 256 位密钥的示例:

KeyGenerator generator = KeyGenerator.getInstance("AES");
generator.init(256); // The AES key size in number of bits
SecretKey secKey = generator.generateKey();
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

AES-256 CBC 在 php 中加密并在 Java 中解密,反之亦然 的相关文章

  • Spring 在使用 JUnit 的单元测试中不自动装配

    我使用 JUnit 测试以下 DAO Repository public class MyDao Autowired private SessionFactory sessionFactory Other stuff here 正如您所看到
  • POST 数据加密 - HTTPS 足够吗?

    考虑一个场景 其中用户身份验证 用户名和密码 由用户在页面的表单元素中输入 然后提交 POST 数据通过 HTTPS 发送到新页面 其中 php 代码将检查凭据 现在 如果黑客位于网络中 并说可以访问所有流量 那么在这种情况下应用程序层安全
  • 将 SQL 查询的 SELECT 子句解析为 PHP 数组

    这更多的是用于分析 PHP 中的查询before它被发送到服务器 我这样做的原因非常复杂 所以我不想深究其原因 在 PHP 中 我需要将字段选择存储到 PHP 数组中 以这个查询为例 SELECT user id username DATE
  • PHP Remedy API 调用创建带有附件的条目不起作用(使用 Postman Works!)

    当我尝试创建带有 PDF 附件的条目时 我已经为此工作了好几天 但没有成功 使用补救 REST API 我每次都会收到超时错误 500 或错误请求 这是文档 https docs bmc com docs ars2002 example o
  • java.util.Currency.getInstance 抛出 IllegalArgumentException

    我只是想尝试一下java util Currency 但对于少数货币代码来说它让我困惑java lang IllegalArgumentException 这是我的简单代码 java util Currency c java util Cu
  • PHP curl 获取标头参数

    我将curl 与PHP 结合使用来获取API 调用的标头响应 这是我的代码 curl curl init curl setopt curl CURLOPT URL http localapi com v1 users curl setopt
  • Java 8 元空间垃圾收集

    我正在运行的 java 进程在运行的第一个小时左右始终表现良好 然而 性能会迅速下降 在分析时 我发现元空间垃圾收集相当频繁地发生 直到小时标记 然后失去控制 我相当确定我能够使用 XX MaxMetaspaceSize 选项来解决此问题
  • ViewCompat.setOnApplyWindowInsetsListener使状态栏颜色消失

    这是我用来检测何时的代码Keyboard Height变化 唯一的问题是Statur Bar当此代码运行时 颜色消失并变为白色 ViewCompat setOnApplyWindowInsetsListener this getWindow
  • 如何在 Laravel 8 中实现记住我?

    我有一个登录表单和一个记住我复选框 我希望如果用户在上次登录时选中 记住我 复选框 则自动填写用户名和密码 但目前不起作用 我正在使用 Laravel 中构建的 LoginController 登录控制器
  • Active Record 库的 CodeIgniter 挂钩

    我需要一些帮助来理解 CodeIgniter 的钩子逻辑 以使代码适应我的需要 这一页 https www codeigniter com user guide general hooks html https www codeignite
  • Gradle 将多个依赖项提取到不同的目录

    我正在尝试将多个依赖项提取到不同的目录中 我尝试了以下方法 configurations cppDependencies dependencies cppDependencies com group artifact1 1 0 cppDep
  • hibernate中映射到数据库表的bean的默认继承策略是什么?

    这是我在 stackoverflow 中的第一个查询 我想我正在提供所有必要的输入 我已经提供了我的 Java bean 和数据库表详细信息如下 Java Bean 类 import java sql Timestamp import ja
  • 在 OpenCV 中将 `BufferedImage` 转换为 `Mat`

    我怎样才能转换BufferedImage to a Mat in OpenCV 我正在使用 JAVA 包装器OpenCV not JavaCV 由于我是新手OpenCV我在理解如何做时遇到一些问题Mat works 我想做这样的事情 基于
  • PHP 构建/集成工具:您使用它们吗? [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • PayPal REST API:通过重定向 URL 或 Webhook 调用履行订单/付款?

    我正在致力于将 PayPal REST API 集成到我的 Symfony 2 Web 应用程序中 我不确定完成订单 付款的正确时间 地点 与金额 客户数据等其他参数一起 我将两个 URL 传输到 PayPal API 一个是接受付款时用户
  • 使用 Appengine 进行多线程处理

    既然Appengine不允许java多线程 那么我们如何将现有的多线程代码迁移到该平台呢 例如我有以下代码 Thread t new Thread public boolean alive true public void run whil
  • 发帖到 FB 粉丝专页时如何解决“不支持的发帖请求”?

    我有一个可以执行 ff 的脚本 发布指向用户时间线 墙的链接 以管理员身份发布指向用户页面的链接 发布到用户的个人资料页面工作正常 然而 发布到粉丝页面的行为很奇怪 我我能够发帖但我回来了 不支持的发布请求 错误 我已经搜索过这个问题并尝试
  • ImagickException 并显示消息 Postscript delegate 在 MAMP 3.0.5 上失败

    我正在尝试使用 MAMP 3 0 5 将 PDF 转换为 png 文件 我知道我的 PHP 代码可以在我们的 Linux 服务器上正常运行 我在 Mac OSX 10 8 5 上安装了 MAMP 3 0 5 当我运行脚本将 PDF 转换为
  • 如何更改 Java 中不同类的变量?

    如何更改 Java 中不同类的变量 我正在尝试更改另一个类中的变量 然后在第一个类中使用它 我在 First 类中创建了一个变量 并将其值设置为 1 然后我尝试在 Second 类中将同一变量的值更改为 2 但是当我在 First 类中使用
  • 从 Eclipse 启动时创建新的 JFrame 时 Java 将关闭。没有抛出异常

    我正在开发一个在 Eclipse 中开发的 Java 项目 直到今天一切都很好 昨天 在完成我的项目之前 我最后一次运行它以检查一切是否正常并且运行正常 但是今天 当我启动该项目并按下 运行 时 我的应用程序就神秘地关闭了 没有崩溃 没有消

随机推荐

  • VBA 查找和替换

    我正在使用 Excel VBA 从电子表格生成 Word 文档 作为最后一步的一部分 我想找到所有双段落并将其替换为单段落 基本代码 Dim objWord Dim objDoc Dim objSelection Set objWord C
  • 表视图中的单元格没有响应

    我正在开发一个待办事项列表应用程序 每当我在simulator并尝试打印我的项目array 其他单元格项目被打印 这是我的代码 import UIKit class TodoListViewController UITableViewCon
  • 递归时变量意外更改?

    Context 我目前正在尝试 Reddit 的 r 每日程序员挑战 这个想法是找到 ASCII 迷宫的解决方案 不幸的是 递归的工作方式与我的预期不同 程序检查是否有空间可以移动到当前空间的右侧 左侧 下方或上方 如果存在 则将空间移动到
  • Android 中平板电脑的布局

    我想在 Android 中为平板电脑和手机创建不同的布局 我应该将布局资源放在哪里才能实现这种差异化 我知道这是一个老问题 但为了它 根据文档 您应该像这样创建多个资产文件夹 res layout main activity xml For
  • 如何提高数据严重偏差的养猪工作的绩效?

    我正在运行一个 Pig 脚本 该脚本执行 GROUP BY 和嵌套 FOREACH 由于一两个减少任务 该脚本需要几个小时才能运行 例如 B GROUP A BY fld1 fld2 parallel 50 C FOREACH B U A
  • 像蜗牛一样在路径上进行 SVG 动画

    I have the following SVG and I would like to draw the circles pixel by pixel on the path after moveing It s like when th
  • 使用 JQuery 和 AJAX 刷新 div 以显示 Django 中的新评级

    我是 django 的新手 找不到仅刷新 div 的方法 并且 div 显示了当前的星级评级 我的想法是 用户可以通过单击星星来查看平均评分并对某些内容进行评分 点击后我希望星星显示新的平均评分 而无需刷新整个页面 这是div div di
  • 如何编写最能利用 CPU 缓存来提高性能的代码?

    这听起来像是一个主观问题 但我正在寻找的是特定的实例 您可能遇到过与此相关的实例 如何使代码 缓存有效 缓存友好 更多的缓存命中 尽可能少的缓存未命中 从两个角度来看 数据缓存 程序缓存 指令缓存 即代码中与数据结构和代码构造相关的哪些内容
  • 与 0b 的按位或运算将给定数字转换为负数

    我需要使用按位运算符执行某些操作 假设我们有这个 40 位无符号整数 1071698660929当我申请它时OR运算符和无符号右移运算符我得到这个负整数 Input 1071698660929 gt gt gt 0 0b0 Output 2
  • java.lang.IllegalArgumentException:Jetty ALPN/NPN 尚未正确配置

    Getting java lang IllegalArgumentException Jetty ALPN NPN has not been properly configured 同时使用gRPC google pub sub 发布 消费
  • Mono.Cecil - 如何获取方法体的简单示例

    我一直在寻找新手问题 但找不到简单的例子 谁能给我一个简单的例子 如何将 MethodBody 放入最可用的字符串结果中 喜欢 using Mono Cecil using Mono Cecil Cil namespace my publi
  • Jhipster4,Angular2:如何在html中包含静态图像

    你能帮我在 html 模板中包含静态图像吗 我使用 jhipster 生成器 选择 Angular 2 生成了项目 现在我尝试在组件的 html 模板中包含静态图像 例如导航栏组件 into navbar component html 我将
  • 可以按模型中的属性进行排序吗?

    可以按模型中的属性进行订购吗 class PlayerModel Base tablename players alliances id Column Integer ForeignKey alliances id nullable Tru
  • 如何传递凭据来重命名命令?

    我在 PowerShell 脚本中运行以下命令来简单地重命名计算机 该脚本将由计算机启动脚本 GPO 执行 因此我需要在命令中传递凭据 由于我无法看到脚本在启动时执行时发生了什么 因此我通过以普通用户身份登录时运行脚本来测试它 Get Wm
  • 如何在 PyQt5 GUI 中运行两个无限循环?

    我正在尝试使用 pyqt5 构建 GUI 在 GUI 中 我需要通过 WiFi 从树莓派摄像头传输视频 我需要将游戏手柄输入发送到树莓派 我的代码如下 import sys time math import cv2 import numpy
  • 在 64 位 x 64 位乘法中使用 Karasuba 算法真的有效吗?

    我在 AVX2 上工作 需要计算 64 位 x64 位 gt 128 位加宽乘法 并以最快的方式获得 64 位高位部分 既然AVX2没有这样的指令 那么我使用Karatsuba算法来提高效率和获得速度是否合理 不会 在现代架构中 Karat
  • 当结果错误时从函数返回默认值

    有没有类似的东西 当出现错误时 该快捷方式不是返回函数的结果 而是返回预定义的值 基本上我想知道是否可以在一行中执行以下操作 fn index gt String let temp some func pass some func retu
  • 在 Java 桌面应用程序中打开 PDF

    是否可以像创建文本文件一样在 Java 桌面应用程序中打开或创建 PDF 文件 从我的搜索中我发现只有使用 web java 才有可能 真的吗 要在桌面默认阅读器中打开现有的 PDF 文件 您可以使用以下代码 File pdf new Fi
  • 使用具有两个表的 SQL 视图在 MS-Access 表单上编辑数据的任何方法

    根据我的阅读 如果要修改的数据仅代表一个表并且数据中包含唯一标识符字段 则应该可以编辑视图描述的数据 据微软称 任何修改都必须仅引用一个基表中的列 当底层记录集基于视图或存储过程合并来自两个表的数据时 是否有人有幸创建了可编辑的 MS Ac
  • AES-256 CBC 在 php 中加密并在 Java 中解密,反之亦然

    JAVA import javax crypto Cipher import javax crypto spec IvParameterSpec import javax crypto spec SecretKeySpec import o