如何为openssl_private_decrypt()提供私钥

时间:2014-01-04 10:06:19

标签: php encryption base64

我用公钥加密了一些值。但我不能用我的私钥解密它。 我的代码有什么问题吗?

这是我的剧本:

<?php

$encrypted = "Q4tmeBDTS+M2UriF6zNBJYrWcXJuyclWVAFLZaOSNwTS0FOkqd/7yQ9KrwLe1IOT15DIB11694mfjLSjWL+yar/KnwrNVJUnUV3eRENr5nRQcBUxyI9Hst88wNs9UBTH+U0aiUgitWWNZIL2YwlAbvjB3YuLLM75IT2VG+ElTKY=";

$decrypted = "";

$privateKey = <<<EOD
MIICeQIBADANBgkqhkiG9w0BAQEFAASCAmMwggJfAgEAAoGBAK92ohKTxz/njXNX
5DV5EL1qlj+wh3O9AobufxyMpyU2WCxfFFgqUF6fBGos3QelSR75f5XvpoiYDrdB
ADKUmpkjKrYGOLSTYN5fyCmi7C4poQWsXpT4VVSYJQkwZhtI9XoxXwycfvRNKqTf
FdihYqDJ3z2uHmWoV4KSu6PZrqzJAgMBAAECgYEAmwvShWXuQErlVFILBzFWmHoy
EE92MdCIBiGDUv/6xsgxu+u8d3fUkvgjF4tTOOlWJrfDhQNCfhsXjdkzSn7D6Cqb
NFBSbBf+kr/IaBX/mDA34HroGlewYchgS0SRMz+SE24+5gmA6QL31FkLI+OnADtl
LnKkkFd8l7Kvv7GWfR0CQQDv2peFblMa3OujQFbdEuH5ChiDeu+5knZx0acB+0s8
dAYyTtyalThjiOfUP12BJLZRegSls8KqBjvjTAWYR8B7AkEAu0ZmDn9qLo+G3S0D
Ex81TQbet/nu1LwiFhEF/aW5/b5yvm/3h0XwyIN3Bn/DR431tKViO8HPfsHzjPrl
RmReiwJBAMAMnARHuR0qRTbbHnI3W16n2cb1GZvSDSrHftzUVIKcOBXyFStlTdhM
16uX7Qup1J3agHwZOkYfZbZyuYwb758CQQCImuCFAMI2dnF80oGkqCYcKr+5WbGy
Mg13JTHGhOX3xr0yVsArR4RM70CaWAXdIxswi1btmgE+SEHc+4LU5w/jAkEA734/
UEszK8EZkcY/I0RI+WBUo0S9g3CvlgmMKewQkU8boi3AjFTzECMqBxfYAZHfOTr5
WCHS8ImF4xhmXSTTdQ==
EOD;
$encrypted = base64_decode($str); // decode the encrypted query string
if (!openssl_private_decrypt($encrypted, $decrypted, $privateKey))
die('Failed to decrypt data');
echo "Decrypted value: ". $decrypted; ?>

4 个答案:

答案 0 :(得分:4)

openssl_private_decrypt()的第一条评论中,您可以找到一个示例。在此示例中,您可以看到关键参数是方法openssl_get_privatekey()的结果,该方法是openssl_pkey_get_private()的别名。

openssl_pkey_get_private()说明key的手册可以是以下之一:

  1. 格式为file://path/to/file.pem的字符串。 指定的文件必须包含PEM编码的证书/私钥 (它可能包含两者)。

  2. PEM格式的私钥。

  3. 在你的情况下2适用。因此,将这些已删除的密钥行放回去并使用openssl_get_privatekey()

    $privateKey = <<<EOD
    -----BEGIN PRIVATE KEY-----
    MIICeQIBADANBgkqhkiG9w0BAQEFAASCAmMwggJfAgEAAoGBAK92ohKTxz/njXNX
    [..]
    WCHS8ImF4xhmXSTTdQ==
    -----END PRIVATE KEY-----
    EOD;
    
    $res = openssl_get_privatekey($privateKey);
    
    openssl_private_decrypt($encrypted, $decrypted, $res)
    

答案 1 :(得分:1)

即使我使用openssl_pkey_get_private(),我也遇到了同样的错误。以下最终对我有用。当您使用openssl_pkey_get_private()时,请不要忘记放置&#39;文件://&#39;在路径字符串的开头:

// get the public-key-encrypted message
$encstr = $_POST['payload'];
$encbytes = base64_decode($encstr);  // (I've base 64 encoded my encrypted string, in order to pass it over http)

// get the private key
$privkey = openssl_pkey_get_private('file:///opt/shavsoft/sg/privkey.pem');

// decrypt the message with the private key and log it out
$dectext = "";
openssl_private_decrypt($encbytes,$dectext,$privkey); //,OPENSSL_NO_PADDING);
LogMessage("dectext: $dectext");

答案 2 :(得分:1)

您是否尝试过使用openssl_private_decrypt的不同PADDING选项?

http://php.net/manual/en/function.openssl-private-decrypt.php

答案 3 :(得分:0)

  

我的代码有问题吗?

是的。您需要将第一行的变量从$encrypted更改为$str。在还修复了私钥的PEM格式之后,脚本将起作用并返回:

Decrypted value: 28366584-04/01/2014:03.02|2|Transaction is completed|10|EXP_TRAVEL_MERCHANT|20140104000034