You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

能否用Node.js crypto加密后通过PHP OpenSSL解密?

Node.js Crypto 加密后 PHP OpenSSL 解密方案

可以实现Node.js crypto非对称加密后用PHP OpenSSL解密,你的代码问题主要出在数据编码未处理和哈希算法/填充参数不匹配上,以下是修复方案和说明:

问题分析

  1. 未解码Base64数据:Node.js代码返回的是Base64编码的加密结果,PHP直接传入字符串解密必然失败,需要先转成二进制原始数据。
  2. 哈希算法不匹配:Node.js的publicEncrypt默认使用RSA_PKCS1_OAEP_PADDING填充,默认哈希算法为SHA-1;若你想改用SHA-256,需要两边明确指定一致的参数。
  3. OpenSSL支持SHA-256:OpenSSL完全支持SHA-256,PHP只是需要用正确的API来指定哈希算法。

修复后的Node.js加密代码

明确指定填充方式和哈希算法,避免版本默认值差异:

const crypto = require("crypto");
const fs = require("fs");

function encrypt(toEncrypt) {
  const publicKey = fs.readFileSync("../keys/public_key.pem", "utf8");
  const buffer = Buffer.from(toEncrypt, "utf8");
  // 明确配置OAEP填充和哈希算法(可选sha1/sha256/sha512)
  const encrypted = crypto.publicEncrypt(
    {
      key: publicKey,
      padding: crypto.constants.RSA_PKCS1_OAEP_PADDING,
      oaepHash: "sha256"
    },
    buffer
  );
  return encrypted.toString("base64");
}

module.exports = { encrypt };

对应PHP解密代码

情况1:Node.js使用SHA-1(默认)

使用openssl_private_decrypt,只需先解码Base64:

<?php
function decrypt($data) {
    $privateKey = file_get_contents("../keys/private_key.pem");
    $encryptedRaw = base64_decode($data);
    
    if (openssl_private_decrypt($encryptedRaw, $decrypted, $privateKey, OPENSSL_PKCS1_OAEP_PADDING)) {
        return $decrypted;
    } else {
        // 打印错误排查
        echo openssl_error_string();
        return false;
    }
}
?>

情况2:Node.js使用SHA-256

使用openssl_decrypt指定RSA-OAEP-SHA256算法:

<?php
function decrypt($data) {
    $privateKey = file_get_contents("../keys/private_key.pem");
    $encryptedRaw = base64_decode($data);
    
    $decrypted = openssl_decrypt(
        $encryptedRaw,
        "RSA-OAEP-SHA256",
        $privateKey,
        OPENSSL_RAW_DATA
    );
    
    if ($decrypted === false) {
        echo openssl_error_string();
    }
    return $decrypted;
}
?>

额外注意事项

  • 密钥对兼容性:确保密钥对是用OpenSSL生成的标准格式(比如openssl genrsa -out private_key.pem 2048生成私钥,openssl rsa -in private_key.pem -pubout -out public_key.pem生成公钥),避免格式不兼容问题。
  • 明文长度限制:RSA非对称加密的明文长度受密钥长度限制(2048位密钥+SHA-256 OAEP的话,最大明文约190字节),大文件建议用AES对称加密内容,再用RSA加密AES密钥。

内容的提问来源于stack exchange,提问作者desh

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.06 00:40:19