【问题标题】:PHP: error when encrypting and decrypting with openSSLPHP:使用openSSL加密和解密时出错
【发布时间】:2014-02-17 00:59:26
【问题描述】:

我一直在尝试制作两个 PHP 页面,一个用于加密,一个用于解密。

加密页面的代码:

<form action="encrypt.php" method="post">
<input type="text" name="data">
<input type="submit">
</form>

<?php
    if($_SERVER["REQUEST_METHOD"] == "POST")
    {
        $config = array(
                "digest_alg" => "sha512",
                "private_key_bits" => 4096,
                "private_key_type" => OPENSSL_KEYTYPE_RSA,
                );
        $keys = openssl_pkey_new($config);
        openssl_pkey_export($keys, $privKey);    
        $pubKey = openssl_pkey_get_details($keys);
        $pubKey = $pubKey["key"];

        require "openssl.php";
        openssl_public_encrypt($_POST["data"],$encrypted, $pubKey);
        echo $encrypted;
        echo "<br><br>";
        echo $privKey;
    }

    ?>

这是解密的代码:

<form action="decrypt.php" method="post">
Encrypted Text: <textarea name="encrypted" rows="10" cols="100"></textarea><br><br>
Key: <textarea name="key" rows="10" cols="100"></textarea><br>
<input type="submit">
</form>

<?php
    if($_SERVER["REQUEST_METHOD"] == "POST")
    {
        openssl_private_decrypt($_POST["encrypted"],$decrypted,$_POST["key"]);
        echo $decrypted;
    }
?>

似乎可以很好地加密数据,但是当我尝试使用其他页面解密时,出现错误:

openssl_private_decrypt() [function.openssl-private-decrypt]:密钥参数不是有效的私钥

我直接从加密文件的输出中复制并粘贴了私钥。为什么我会收到错误消息?

【问题讨论】:

  • 在解密代码中是否需要在将私钥传递给 open_ssl_decrypt() 之前对私钥使用 openssl_get_privatekey() 函数,即使您没有使用密码对其进行编码?
  • 我试过这样做,但 openssl_get_privatekey() 返回 false。

标签: php encryption cryptography encryption-asymmetric php-openssl


【解决方案1】:

好像加密数据就好了,

首先要调试:你能立即在加密页面上解密你的加密消息并得到相同的明文消息吗?

openssl_private_decrypt() [function.openssl-private-decrypt]:密钥参数不是有效的私钥

您的代码包含:

openssl_private_decrypt($_POST["encrypted"],$decrypted,$_POST["key"]);

试试这个:

$private = openssl_pkey_get_private($_POST['key']);
openssl_private_decrypt($_POST["encrypted"], $decrypted, $private);

关于安全性的一句话:OpenSSL 的 RSA 加密默认设置are not secure

为获得最佳结果,在任何需要公钥加密的实际应用程序中,请考虑切换到 libsodium 并仅使用 the crypto_box_seal API

【讨论】:

    猜你喜欢
    • 2018-12-04
    • 2019-04-13
    • 2021-09-14
    • 2018-08-17
    • 1970-01-01
    • 2022-11-25
    • 2014-02-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多