PHP与Node.js Blowfish CBC兼容解密指南

PHP与Node.js Blowfish CBC兼容解密指南

本文深入探讨了在PHP中实现与Node.js Crypto模块使用Blowfish CBC算法加密的数据兼容解密的关键技术与常见问题。通过详细分析PHP openssl_decrypt函数在循环条件、子字符串处理、初始化向量格式以及OpenSSL标志位设置上的潜在错误,文章提供了修正后的PHP代码示例,旨在帮助开发者解决跨语言加密互操作性挑战,并强调了Blowfish算法及IV使用的安全最佳实践。

在现代分布式系统中,跨语言的数据加密与解密互操作性是常见的需求。当node.js应用程序使用其内置的crypto模块进行数据加密,而php应用程序需要解密这些数据时,开发者常会遇到参数不匹配或行为差异导致的问题。本教程将以node.js使用blowfish cbc模式加密为例,详细讲解如何在php中实现精确兼容的解密逻辑。

Node.js 加密逻辑概述

Node.js的crypto模块提供了强大的加密功能。在给定的场景中,Node.js代码采用分块处理的方式,并仅对每第三个2048字节的数据块进行bf-cbc(Blowfish-CBC)模式解密,同时关闭了自动填充(setAutoPadding(false)),并使用了固定的密钥和初始化向量(IV)。

// Node.js 示例解密逻辑片段decrypt(encryptedBuffer) {    const PASSPHRASE = ""; // 示例中Node.js原始代码为空,但PHP示例中为非空    let decryptedBuffer = Buffer.alloc(encryptedBuffer.length);    let chunkSize = 2048;    let progress = 0;    while (progress < encryptedBuffer.length) {        if ((encryptedBuffer.length - progress) < 2048) {            chunkSize = encryptedBuffer.length - progress;        }        let encryptedChunk = encryptedBuffer.slice(progress, progress + chunkSize);        // Only decrypt every third chunk and only if not at the end        if (progress % (chunkSize * 3) === 0 && chunkSize === 2048) {            let cipher = crypto.createDecipheriv('bf-cbc', PASSPHRASE, Buffer.from([0, 1, 2, 3, 4, 5, 6, 7]));            cipher.setAutoPadding(false); // 禁用自动填充            encryptedChunk = Buffer.concat([cipher.update(encryptedChunk), cipher.final()]);        }        decryptedBuffer.write(encryptedChunk.toString('binary'), progress, encryptedChunk.length, 'binary');        progress += chunkSize;    }    return decryptedBuffer;}

PHP openssl_decrypt 兼容性问题与修正

要在PHP中实现与上述Node.js代码兼容的解密,需要精确匹配加密算法、密钥、IV、填充模式以及数据处理逻辑。以下是PHP代码中常见的错误点及其修正方法:

1. 循环条件与数据块截取错误

原始PHP代码在处理循环条件和子字符串截取时存在逻辑错误:

循环条件: while ($progress > strlen($encryptedBuffer)) 应该为 $progress substr() 参数: substr($encryptedBuffer, $progress, $progress + $chunkSize) 的第三个参数应为长度,而非结束位置。正确的写法是 substr($encryptedBuffer, $progress, $currentChunkSize)。

2. openssl_decrypt 参数与标志位设置

openssl_decrypt 函数的第四个参数(flags)是实现兼容性的关键,同时IV的格式也至关重要。

立即学习“PHP免费学习笔记(深入)”;

初始化向量(IV)格式: Node.js中使用的IV是字节数组[0, 1, 2, 3, 4, 5, 6, 7],这表示一个二进制的8字节IV。PHP中不能直接使用字符串’01234567’,因为它会被解释为ASCII字符。正确的做法是使用 hex2bin() 将十六进制字符串转换为对应的二进制数据,即 hex2bin(‘0001020304050607’)。数据填充与输出格式:Node.js的setAutoPadding(false)对应PHP的OPENSSL_ZERO_PADDING,表示不使用PKCS7等标准填充,而是零填充或无填充(取决于数据长度是否为块大小的倍数)。openssl_decrypt 默认会对输入数据进行Base64解码,并对输出数据进行Base64编码(如果未指定OPENSSL_RAW_DATA)。由于Node.js的crypto模块通常处理原始二进制数据,PHP中必须使用 OPENSSL_RAW_DATA 标志来确保输入被视为原始数据,输出也是原始二进制数据,避免不必要的Base64转换。密钥零填充问题 (OPENSSL_DONT_ZERO_PAD_KEY): 当密钥长度小于算法要求(如Blowfish为16字节)时,PHP的OpenSSL扩展可能会自动用零填充密钥。如果Node.js端没有进行这种填充,或者PHP的默认填充行为与Node.js不一致,就会导致解密失败。OPENSSL_DONT_ZERO_PAD_KEY 标志(PHP 7.1.8+版本可用)可以禁用这种自动零填充,确保密钥严格按照提供的方式使用。

修正后的PHP解密实现

结合上述修正,以下是兼容Node.js Blowfish CBC解密逻辑的PHP代码示例:

p9`'yjmkhf";        // 正确的初始化向量 (IV): 必须是二进制数据,与Node.js的 Buffer.from([0, 1, 2, 3, 4, 5, 6, 7]) 匹配        $iv = hex2bin('0001020304050607');        $chunkSize = 2048;        $progress = 0;        $outputBuffer = ''; // 用于存储解密后的数据        // 正确的循环条件:当 $progress 小于加密数据长度时继续

以上就是PHP与Node.js Blowfish CBC兼容解密指南的详细内容,更多请关注创想鸟其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/1287795.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2025年12月11日 04:38:49
下一篇 2025年12月11日 04:38:57

相关推荐

  • mac json格式化工具

    使用 macOS 格式化 JSON 的方法包括:在线工具:JSONFormatter.org、JSONLint.com桌面工具:Visual Studio Code、Sublime Text(需安装插件)、BBEdit命令行工具:jq、python-json-formatter macOS 上 JS…

    2025年12月13日
    000
  • json几种标准格式转换对象

    JSON对象转换标准格式有5种:JSON.parse()、JSON.stringify()、Object.assign()、lodash的cloneDeep()和deep-clone NPM库。根据应用程序需求及性能考量,选择合适格式进行转换。 JSON 标准格式转换对象 JSON(JavaScri…

    2025年12月13日
    000
  • 可以格式化json的文本编辑器

    JSON 文本编辑器的优势:1. 增强可读性;2. 提高可维护性;3. 简化错误检测;4. 提供工具集成。常用编辑器包括:Visual Studio Code、Sublime Text、Atom、Notepad++、TextMate。使用步骤:1. 选择 JSON 文本编辑器;2. 打开 JSON …

    2025年12月13日
    000
  • json格式化浏览器插件推荐

    对于浏览器中 JSON 格式化的插件推荐,有以下几个选择:Google Chrome:JSON Formatter、JSON Editor、JSONViewMozilla Firefox:JSONView、RestClient、JSON FormatterMicrosoft Edge:JSON Fo…

    2025年12月13日
    000
  • json报文支持什么格式的数据

    JSON 报文支持以下数据格式:数字(整数和浮点数)字符串(使用引号引起来)布尔值(true 或 false)null (表示不存在或未知)数组(有序集合,用方括号和逗号分隔元素)对象(键值对集合,键用引号引起来,值可以是任何 JSON 格式) JSON 报文支持的数据格式 JSON 报文广泛用于数…

    2025年12月13日
    000
  • JSON格式转换的代码

    JSON 格式转换涉及将数据从一种格式转换为另一种格式。可以使用编程语言和库来完成此操作。具体步骤如下:1. Python:使用 json 模块加载和转换 JSON;2. JavaScript:使用 JSON.parse() 和 JSON.stringify() 方法;3. Java:使用 JSON…

    2025年12月13日
    000
  • 在线json数据生成

    在线生成 JSON 数据的方法有三种:在线工具:使用 JSON Editor Online 等工具轻松生成数据结构。编写脚本:使用 Python 的 json 模块或 JavaScript 的 JSON.stringify() 生成更复杂的数据。使用 JSON 库:使用 Newtonsoft.Js …

    2025年12月13日
    000
  • json代码怎么查看

    有五种查看 JSON 代码的方法:1. 文本编辑器;2. 浏览器;3. 在线 JSON 查看器;4. 命令行;5. Python。 如何查看 JSON 代码 JSON(JavaScript 对象表示法)是一种用于传输和存储数据的轻量级数据格式。查看 JSON 代码有几种方法: 1. 文本编辑器 打开…

    2025年12月13日
    000
  • json代码怎么编辑修改

    JSON 代码编辑和修改的步骤:打开 JSON 文件,其内容以键值对格式组织。修改键或值,或添加/删除键值对,遵循正确的 JSON 语法。保存文件以使修改生效。 JSON 代码的编辑和修改 如何编辑 JSON 代码? 编辑 JSON 代码的步骤很简单: 打开 JSON 文件:使用文本编辑器(如记事本…

    2025年12月13日
    000
  • 幸运的一类

    每周挑战 284 穆罕默德·s·安瓦尔 (mohammad s. anwar) 每周都会发出“每周挑战”,让我们所有人都有机会为每周两次的任务提出解决方案。我的解决方案首先用python编写,然后转换为perl。这对我们所有人来说都是练习编码的好方法。 挑战,我的解决方案 任务1:幸运整数 任务 给…

    2025年12月13日
    000
  • Docker Python Django 初始配置设置

    docker 工作流程 1. 确保您的 dockerfile 正确 确保您的 dockerfile 已准备好并位于项目的根目录中。根据前面的讨论,您的 dockerfile 可能如下所示: from python:3.11env pythondontwritebytecode=1env python…

    2025年12月13日
    000
  • 《数据科学终极指南》

    介绍 数据科学最终在我们这个技术驱动的世界中发挥着举足轻重的作用。这一切都是为了利用数学、计算机编程和特定主题的数据的混合,从庞大的数据集中找到有价值的数据。本课程将为您提供清晰的数据科学图表,计算您所需的主要想法、工作替代方案和关键能力。 什么是数据科学? 数据科学是一个结合多种方法从数据中获取有…

    2025年12月13日
    000
  • Pytest 和 PostgreSQL:每次测试的新数据库(第二部分)

    在上一篇文章中,我们创建了 pytest 夹具,它将在测试方法之前/之后创建/删除 postgres 数据库。在这一部分中,我想在 pytest 工厂固定装置的帮助下改进固定装置,使其更加灵活和可配置。 静态夹具的限制 例如,如果您有多个数据库要在测试中模拟 def test_create_user…

    2025年12月13日
    000
  • System Guard:保护服务器的简单工具

    系统卫士? systemguard 是您轻量级、用户友好且易于设置的服务器监控的首选工具。跟踪从 cpu 使用率和内存到网络速度和正在运行的进程的所有信息,全部集中在一处。 ✨ 主要特点 全面的服务器监控: 密切关注重要的服务器统计信息,例如 CPU、内存、磁盘和网络使用情况。 网速测试: 使用内置…

    2025年12月13日
    000
  • 使用 Python 时如何检查 Python 版本

    使用 Python 时,通常有必要了解您正在使用的确切版本,因为不同版本可能具有不同的功能、语法或行为。幸运的是,Python 使得以编程方式检查版本变得简单。当您编写需要兼容多种环境的脚本或对由于版本差异可能出现的问题进行故障排除时,这尤其有用。 检查 Python 版本:快速指南要检查当前环境中…

    2025年12月13日
    000
  • 第一篇文章和 AMA

    开发者们大家好!这是我的第一篇文章?? 在 AMA 会议之前简单介绍一下我: 直到两年前我才成为一名开发者经过几年的非技术自由职业后,我意识到我想要构建产品 – 不仅仅是创建宣传材料或作为产品经理进行管理。我爱上了编码并决定全力以赴。 7 月,我推出了 Creduse,这是一个 API,…

    2025年12月13日
    000
  • 周构建互动游戏

    第 2 周:构建互动游戏 第三课:游戏物理与运动 3.1 理解游戏物理 游戏物理涉及模拟现实世界的物理,使游戏更加真实和引人入胜。速度、加速度和重力等基本物理原理可以使游戏中的动作和交互感觉自然。 3.1.1 速度和加速度 速度是物体位置的变化率。加速度是速度的变化率。 示例:基本速度运动 impo…

    2025年12月13日
    000
  • 一只猫和一只狗与蟒蛇的发射CO

    嗨, 我发现了一篇关于宠物排放的小文章,因此我决定显示二氧化碳排放(如果它们不存在)。 代码:https://github.com/victordalet/kaggle_analysis/tree/feat/dog_co2 来源: https://www.lekaba.fr/article/l-em…

    2025年12月13日
    000
  • 好用的json可视化工具下载

    好用的 JSON 可视化工具包括:JSON Viewer:易用界面,便于浏览和探索 JSON 层次结构。JSON Formatter & Validator:格式化、验证和可视化 JSON,提供可折叠树形视图。JSON Viewer Chrome 扩展程序:在浏览器中查看和编辑 JSON 数…

    2025年12月13日
    000
  • 怎么用记事本转换json格式

    使用记事本将文本数据转换为 JSON 格式的步骤:打开记事本并粘贴文本数据。标记属性(双引号括起名称,冒号分隔值)。分隔数组元素(逗号分隔)。保存文件为 .json 扩展名。测试转换后的 JSON 文件。 如何用记事本转换 JSON 格式 简介 JSON(JavaScript Object Nota…

    2025年12月13日
    000

发表回复

登录后才能评论
关注微信