客户端 JavaScript 使用 Hybrid-crypto-js 加密并使用 PHP OpenSSL 解密失败

问题描述 投票:0回答:1

我无法在 PHP Openssl (v1.1.1w) 中进行 RSA 解密,该密码是使用 Hybrid-crypto-js (v4.2.0) 进行 RSA 加密的密码。

我已验证密钥对匹配。他们单独工作,例如在 JS 或 PHP 中。

下面是代码,我这里有什么遗漏的吗?

JavaScript:

const publicKey = "received-from-php";
const plainText = "my plain text here";
var crypt = new Crypt();
var encryptedText = crypt.encrypt(publicKey, plainText);
// send to php: JSON.parse(encryptedText).cipher

PHP:

$privateKey = file_get_contents("./private_key.pem");
$ret = openssl_private_decrypt(base64_decode($_GET['encrypted_text']), $decryptedText, $privateKey);
if (!$ret) echo "decryption failed";
else echo "Decrypted Text: " . ($decryptedText);

hybrid-crypto-js 似乎支持 2 种填充方案:RSA-OAEP、RSAES-PKCS1-V1_5。 如果我不在 openssl_private_decrypt() 中使用 OPENSSL_NO_PADDING,则 openssl_error_string() 会给出一些错误/警告。请帮忙。

cryptojs php-openssl
1个回答
0
投票

当在 JavaScript 中使用 Hybrid-crypto-js 加密密码时,您使用 OpenSSL 在 PHP 中进行 RSA 解密的问题可能是由多种因素造成的。

JavaScript(混合加密-js)

  • 您正在使用
    hybrid-crypto-js
    进行加密。
  • 该库支持两种填充方案:RSA-OAEP 和 RSAES-PKCS1-V1_5。
  • 确保在加密和解密中使用相同的填充方案非常重要。

PHP(OpenSSL)

  • 您正在使用
    openssl_private_decrypt
    进行解密。
  • 函数
    openssl_private_decrypt
    默认使用 PKCS1 填充。
  • 如果加密和解密之间的填充方案不匹配,则会失败。

常见问题及解决方案

  1. 不匹配的填充方案:确保

    hybrid-crypto-js
    中使用的填充方案与
    openssl_private_decrypt
    期望的填充方案匹配。如果您在 JS 中使用 RSA-OAEP,则可能需要在 PHP 中使用
    OPENSSL_PKCS1_OAEP_PADDING

  2. Base64 编码/解码:在解密之前,确保数据在 JS 中正确进行 Base64 编码,并在 PHP 中进行适当解码。

  3. 密钥格式问题:确保JS中使用的公钥格式和PHP中使用的私钥格式兼容。 OpenSSL 需要 PEM 格式。

  4. PHP 中的错误处理:使用

    openssl_error_string()
    读取 OpenSSL 错误队列,它可以提供有关解密失败原因的更多信息。

  5. 数据完整性:确保加密数据在JS到PHP传输过程中不被改变。

  6. 库版本兼容性:确保

    hybrid-crypto-js
    与OpenSSL的版本兼容。有时,不同的版本有不同的默认值或行为。

修改PHP代码

以下是如何修改 PHP 代码以指定填充的示例:

$privateKey = file_get_contents("./private_key.pem");
$encryptedText = base64_decode($_GET['encrypted_text']);
$ret = openssl_private_decrypt($encryptedText, $decryptedText, $privateKey, OPENSSL_PKCS1_OAEP_PADDING); // Or use OPENSSL_PKCS1_PADDING based on the JS padding scheme

if (!$ret) {
    while ($msg = openssl_error_string())
        echo "OpenSSL Error: " . $msg . "\n";
} else {
    echo "Decrypted Text: " . $decryptedText;
}

后续步骤

  • 验证
    hybrid-crypto-js
    中使用的填充方案并在 PHP 代码中进行匹配。
  • 检查密文的完整性并确保其正确发送和接收。
  • 使用
    openssl_error_string()
    调试 PHP 中的任何 OpenSSL 错误。

如果这些步骤无法解决您的问题,请考虑进行其他调试或提供更详细的错误消息以供进一步分析。

© www.soinside.com 2019 - 2024. All rights reserved.