我无法在 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() 会给出一些错误/警告。请帮忙。
当在 JavaScript 中使用 Hybrid-crypto-js 加密密码时,您使用 OpenSSL 在 PHP 中进行 RSA 解密的问题可能是由多种因素造成的。
hybrid-crypto-js
进行加密。openssl_private_decrypt
进行解密。openssl_private_decrypt
默认使用 PKCS1 填充。不匹配的填充方案:确保
hybrid-crypto-js
中使用的填充方案与openssl_private_decrypt
期望的填充方案匹配。如果您在 JS 中使用 RSA-OAEP,则可能需要在 PHP 中使用 OPENSSL_PKCS1_OAEP_PADDING
。
Base64 编码/解码:在解密之前,确保数据在 JS 中正确进行 Base64 编码,并在 PHP 中进行适当解码。
密钥格式问题:确保JS中使用的公钥格式和PHP中使用的私钥格式兼容。 OpenSSL 需要 PEM 格式。
PHP 中的错误处理:使用
openssl_error_string()
读取 OpenSSL 错误队列,它可以提供有关解密失败原因的更多信息。
数据完整性:确保加密数据在JS到PHP传输过程中不被改变。
库版本兼容性:确保
hybrid-crypto-js
与OpenSSL的版本兼容。有时,不同的版本有不同的默认值或行为。
以下是如何修改 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 错误。如果这些步骤无法解决您的问题,请考虑进行其他调试或提供更详细的错误消息以供进一步分析。