客户端 (JS) 和服务器 (PHP) 中的 AES 256

2023-11-24

我尝试使用相同类型的操作(即 AES-256)在服务器端和客户端上加密和解密数据。

在服务器上我使用 PHP,客户端我使用 CryptoJS 到目前为止我只能在服务器上加密和解密客户端,请参阅代码:

JS

<script src="http://crypto-js.googlecode.com/svn/tags/3.1.2/build/rollups/aes.js"></script>
<script src="http://crypto-js.googlecode.com/svn/tags/3.1.2/build/rollups/pbkdf2.js"></script>
<script>
    var salt = CryptoJS.lib.WordArray.random(128/8); 
    var key256Bits500Iterations = CryptoJS.PBKDF2("Secret Passphrase", salt, { keySize: 256/32, iterations: 500 });
    var iv  = CryptoJS.enc.Hex.parse('101112131415161718191a1b1c1d1e1f');

    var encrypted = CryptoJS.AES.encrypt("Message", key256Bits500Iterations, { iv: iv });  
    var data_base64 = encrypted.ciphertext.toString(CryptoJS.enc.Base64); 
    var iv_base64   = encrypted.iv.toString(CryptoJS.enc.Base64);       
    var key_base64  = encrypted.key.toString(CryptoJS.enc.Base64);
</script>

PHP

<?php
    $encrypted = base64_decode("data_base64"); // data_base64 from JS
    $iv        = base64_decode("iv_base64");   // iv_base64 from JS
    $key       = base64_decode("key_base64");  // key_base64 from JS

    $plaintext = rtrim( mcrypt_decrypt( MCRYPT_RIJNDAEL_128, $key, $encrypted, MCRYPT_MODE_CBC, $iv ), "\t\0 " );

如何在双方(客户端和服务器)上加密和解密数据,以便使用 PHP 和 CryptoJS 以相同的语言进行通信?


除了填充不匹配之外,您的代码看起来不错。 CryptoJS 默认使用 PKCS#5/PKCS#7 填充,而 MCrypt 仅支持 ZeroPadding。

如果您只发送文本明文,那么您可以安全地使用

CryptoJS.AES.encrypt("Message", key, { iv: iv, padding: CryptoJS.pad.ZeroPadding });

如果没有,那么你应该使用PHP 中正确的 pkcs7unpad:

$plaintext = pkcs7unpad( mcrypt_decrypt( MCRYPT_RIJNDAEL_128, $key, $encrypted, MCRYPT_MODE_CBC, $iv ), 16 );

您的代码的其他问题是您直接使用CryptoJS.AES.encrypt(...).toString()。这将创建一个 OpenSSL 格式的字符串,它不是纯粹的密文。你需要使用

CryptoJS.AES.encrypt(...).ciphertext.toString(CryptoJS.enc.Base64);

还要确定编码。


现在,这只是混淆,因为您将密钥与密文一起发送。我怀疑您也想在 PHP 中导出密钥。如果是,那么您只需要在服务器知道密码的情况下发送随机盐和密文。

PHP 提供了一个PBKDF2 实施从5.5版本开始。


不涉及 PBKDF2 的完整 JavaScript 部分:

var message = 'My string - Could also be an JS array/object';
var iv = 'a1a2a3a4a5a6a7a8b1b2b3b4b5b6b7b8';
var key = 'c1c2c3c4c5c6c7c8d1d2d3d4d5d6d7d8c1c2c3c4c5c6c7c8d1d2d3d4d5d6d7d8'; // 256-bit hex encoded

var keyBytes = CryptoJS.enc.Hex.parse(key);
var ivBytes = CryptoJS.enc.Hex.parse(iv);

var encrypt = CryptoJS.AES.encrypt(message, keyBytes, {
    iv: ivBytes, 
    padding: CryptoJS.pad.ZeroPadding 
}).ciphertext.toString(CryptoJS.enc.Base64);

产生:

j86KHBVRsDGKUnOiYdkEotsFL/lY/1tzz/h3Ay+vlEX11fC055m7vaF6q7w13eUj

不涉及 PBKDF2 的完整 PHP 部分:

<?php

$iv = 'a1a2a3a4a5a6a7a8b1b2b3b4b5b6b7b8';
$key = 'c1c2c3c4c5c6c7c8d1d2d3d4d5d6d7d8c1c2c3c4c5c6c7c8d1d2d3d4d5d6d7d8';
$ct = 'j86KHBVRsDGKUnOiYdkEotsFL/lY/1tzz/h3Ay+vlEX11fC055m7vaF6q7w13eUj';

$ivBytes = hex2bin($iv);
$keyBytes = hex2bin($key);
$ctBytes = base64_decode($ct);

$decrypt = rtrim(mcrypt_decrypt(MCRYPT_RIJNDAEL_128, $keyBytes, $ctBytes, MCRYPT_MODE_CBC, $ivBytes));

echo $decrypt;

产生:

我的字符串 - 也可能是 JS 数组/对象

使用 OpenSSL 扩展也可以实现同样的效果:

<?php
$iv = 'a1a2a3a4a5a6a7a8b1b2b3b4b5b6b7b8';
$key = 'c1c2c3c4c5c6c7c8d1d2d3d4d5d6d7d8c1c2c3c4c5c6c7c8d1d2d3d4d5d6d7d8';
$ct = 'j86KHBVRsDGKUnOiYdkEotsFL/lY/1tzz/h3Ay+vlEX11fC055m7vaF6q7w13eUj';

$ivBytes = hex2bin($iv);
$keyBytes = hex2bin($key);
$ctBytes = base64_decode($ct);

$decrypt = openssl_decrypt($ctBytes, "aes-256-cbc", $keyBytes, OPENSSL_RAW_DATA | OPENSSL_ZERO_PADDING, $ivBytes);
echo($decrypt);
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

客户端 (JS) 和服务器 (PHP) 中的 AES 256 的相关文章

随机推荐

  • PHP 中的 RGB 到 HSV

    在 PHP 中 将 RGB 三元组转换为 HSV 值的最直接方法是什么 这是一个简单 直接的方法 它以度数和百分比的形式返回 HSV 值 这就是 Photoshop 的颜色选择器所使用的方法 请注意 返回值不会四舍五入 如果需要 您可以自行
  • 可以在 Excel VBA 中全局声明工作表对象吗?

    我正在重构 Excel 2003 工作簿中的多个模块 并且在每个模块的每个过程中声明相同的工作表集 我只想在全球范围内声明一次 我可以将工作表名称设置为文字 例如 Public Const xlwkGSModel gs model As S
  • Numpy:与唯一坐标位置对应的值的平均值

    所以 我已经浏览 stackoverflow 很长一段时间了 但我似乎找不到解决我的问题的方法 考虑一下这个 import numpy as np coo np array 1 2 2 3 3 4 3 4 1 2 5 6 1 2 value
  • Android的bulkTransfer在读取数据时返回-1,但缓冲区中确实有一些数据

    我在 Galaxy Tab p7300 中编写了一个应用程序 通过 otg 电缆与密钥 scsi 设备 进行通信 我第一次可以使用bulkTransfer 读取数据 但下次就不能了 然后我使用 Ellisys Visual USB 嗅探数据
  • Blazor 路线在同一页面发生变化

    我当前的设置 NET Core 3 预览版 6 Blazor 服务器端渲染 在 Blazor 页面中 我有类似以下内容 page page page page Id With Parameter public string Id get s
  • 如何在RDLC中设置参数值

    我在报告中添加了两个用于日期范围的文本框 为了填充文本框中的值 我为文本框设置了参数 现在 日期范围来自名为 DateRange 的表单 该表单具有两个 DateTimePickers 如何将rdlc中文本框的值设置为等于这些DataTim
  • NSInteger 计数乘以 4?

    我不明白为什么这个 NSInteger 计数器会增加到数据库行真实值的 4 倍 也许这很愚蠢 但我真的不明白 到目前为止谢谢 NSInteger i i 0 for NSDictionary teil in gText NSLog teil
  • 相当于连接 Sum 的字符串

    我想要一个查询在第一行输出左表中的 ID 和连接表中的描述 Schema person id int role id int description varchar 100 personrole personid int roleid in
  • jquery ui 对话框在按钮和内容 div 上使用相同的类打开多个对话框

    我想通过在按钮和内容 div 上使用相同的类来打开多个对话框 下面的方法有效 但仅适用于第一次 jQuery helpDialog hide jQuery helpButton click function jQuery this next
  • 如何阻止 g++ 链接不需要的异常处理代码?

    我正在使用为arm eabi 编译的GCC G 开发嵌入式应用程序 由于资源限制 我尝试禁用标准 C 异常处理 我正在用 fno exceptions 编译代码 nostartfiles ffreestand 当一个类的全局实例存在 并且该
  • 为什么 LINQ to SQL 实体关联在插入新记录时会创建新(重复)行?

    我正在尝试使用 LINQ to SQL 插入一个新实体 并且实体与用户实体关联 新实体的插入成功 但我现有的用户实体被插入 就好像它是新用户一样 代码如下所示 var someEntity new Entity someEntity Use
  • InterWorks 在其 Workbook SDK 中使用什么 Tableau API?

    InterWorks 有一个 Workbook SDK 作为其 Power Tools for Tableau 产品的一部分 有谁知道他们如何能够做到这一点 SDK 可以在没有 Tableau Server 的情况下访问工作簿 因此我认为它
  • 如何在iOS平台上实现快速图像滤镜

    我正在开发 iOS 应用程序 用户可以在其中应用一组特定的照片滤镜 每个滤镜基本上都是一组具有特定参数的 Photoshop 操作 这些行动是 级别调整 亮度 对比度 色相饱和度 单个和多个叠加 我在代码中使用循环遍历图像中所有像素的算术表
  • 转换 JSON 格式(分组依据)

    我有这样的 JSON 对象 name cat value 17 group animal name dog value 6 group animal name snak value 2 group animal name tesla val
  • 递归搜索非二叉树中的节点

    我想在非二叉树中搜索一个项目 任何节点都可以有 n 个子节点 并立即退出递归 所讨论的节点可以是任何节点 而不仅仅是叶子节点 这是我的代码 但我没有得到完整的搜索 private nNode recursiveSearch data gi
  • 在 Django 中运行 PHP

    有没有办法在 django 中运行 PHP 脚本 我在 TinyMCE 中有一个运行 PHP 脚本的插件 并且它能够使用 XAMPP 的 Apache 工作 然而 Django确实支持PHP脚本的运行 因此该插件无法工作 我想知道是否有办法
  • PHPExcel 合并单元格上的行自动高度/换行文本

    有没有在 PHP Excel 中设置行自动高度的好方法 到目前为止 我已经看到您可以使用固定高度 您可以预先指定您想要的行的高度 我还发现 如果您不使用合并单元格 则可以使用自动高度 PHPExcel 合并单元格的动态行高 如何在phpex
  • 修复生成条形码时“GDI+ 中发生一般错误”的问题

    我正在用 C 编写一个条形码生成器 我可以将条形码生成为位图 并可以在 Picturebox WindowsForms 中显示它们 另一方面 我无法将条形码保存为 gif 或 jpeg 文件 我的条形码是位图文件 这是我的代码 Bitmap
  • Safari/Chrome 开发者工具调试 CSS 覆盖

    Safari Chrome 开发者工具通过删除 CSS 规则来指示 CSS 规则被其他内容覆盖 如图所示 有时我发现自己无法从 CSS 文件中找出导致该规则被忽略的原因 但 Safari 本身肯定会在它击穿它时知道这一点 有没有办法知道什么
  • 客户端 (JS) 和服务器 (PHP) 中的 AES 256

    我尝试使用相同类型的操作 即 AES 256 在服务器端和客户端上加密和解密数据 在服务器上我使用 PHP 客户端我使用 CryptoJS 到目前为止我只能在服务器上加密和解密客户端 请参阅代码 JS