我用公钥加密了一些值。但我不能用我的私钥解密它。 我的代码有什么问题吗?
这是我的剧本:
<?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; ?>
答案 0 :(得分:4)
在openssl_private_decrypt()
的第一条评论中,您可以找到一个示例。在此示例中,您可以看到关键参数是方法openssl_get_privatekey()
的结果,该方法是openssl_pkey_get_private()
的别名。
openssl_pkey_get_private()
说明key
的手册可以是以下之一:
格式为file://path/to/file.pem的字符串。 指定的文件必须包含PEM编码的证书/私钥 (它可能包含两者)。
PEM格式的私钥。
在你的情况下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