编辑:我发现密钥不是我在评论中所说的问题。我可以毫无问题地使用它们来加密和解密OpenSSL上的数据。
但我需要解密以前通过Crypto ++加密的OpenSSL上的字符串 那不起作用。
稍后我会发布其他详细信息。
嗨,我使用使用Crypto ++生成的RSA公钥加密了一个字符串,现在我正在尝试(仍然不成功)通过PHP和OpenSSL解密它。
这就是我正在做的事情:
步骤1:通过以下方式加载私钥:$key = file_get_contents("rsa-private.key");
步骤2:使用以下功能将密钥转换为PEM格式:
<?php
function pkcs8_to_pem($der) {
static $BEGIN_MARKER = "-----BEGIN PRIVATE KEY-----";
static $END_MARKER = "-----END PRIVATE KEY-----";
$value = base64_encode($der);
$pem = $BEGIN_MARKER . "\n";
$pem .= chunk_split($value, 64, "\n");
$pem .= $END_MARKER . "\n";
return $pem;
}
$PEMprivatekey = pkcs8_to_pem($key);
?>
(stackoverflow.com/questions/1357569/)
步骤3:准备密钥以供OpenSSL进一步使用:(没有任何问题)
<?php
$privateKey = openssl_get_privatekey($PEMprivatekey);
if (!$privateKey) {
echo "Cannot get public key";
}
?>
步骤4:使用以下函数获取消息并解码消息:
<?php
function hex_to_str($hex){
for ($i=0; $i < strlen($hex)-1; $i+=2) {
$string .= chr(hexdec($hex[$i].$hex[$i+1])); }
return $string;
}
$message = file_get_contents("message.txt");`
$encryptedstring = hex_to_str($message);
?>
第5步:解密字符串:(不起作用)
<?php
openssl_private_decrypt($encryptedstring, $decrypteddata, $privateKey);
if (!$decrypteddata) {
echo "........"; } else { echo $decrypteddata; }
?>
$ decrypteddata总是空的。
我无法弄清楚它为什么不起作用。有人注意到我做错了吗?
答案 0 :(得分:1)
phpseclib与OpenSSL完全可互操作,通常被认为更容易使用。以下URL提供了几个如何与OpenSSL进行交互的示例:
答案 1 :(得分:0)
好的,我不知道这是否是问题,但我想在这一点上任何事情都有帮助。
我已经创建了一个小的openssl / php测试脚本,并且用于测试建议2个公钥 - 私钥对。
openssl genrsa -des3 -out private.pem 1024
openssl rsa -in private.pem -out public.pem -outform PEM -pubout
openssl genrsa -out master.key 1024
openssl rsa -in master.key -pubout -out master.pub
第一对使用短语“短语”
使用此脚本的两个对来测试输出
$source = "FAIL";
echo "<pre>Source: $source";
$fp=fopen("./keys/master.pub","r");
$pub_key=fread($fp,8192);
fclose($fp);
openssl_get_publickey($pub_key);
openssl_public_encrypt($source,$crypttext,$pub_key);
echo "\n\nString crypted: $crypttext";
flush();
$fp=fopen("./keys/master.key","r");
$priv_key=fread($fp,8192);
fclose($fp);
// phrase is required if your key is encoded (suggested)
$res = openssl_get_privatekey($priv_key, 'phrase');
openssl_private_decrypt($crypttext,$newsource,$res);
while($error = openssl_error_string()) {
echo "\n" , $error;
}
echo "\n\nString decrypt : $newsource";
旁边的error:0906D06C:PEM routines:PEM_read_bio:no start line
错误消息一切正常
但是当我混合键时(只是为了看看会创建什么错误信息)猜猜错误openssl_error_string
会返回:
error:0906D06C:PEM routines:PEM_read_bio:no start line
error:0407106B:rsa routines:RSA_padding_check_PKCS1_type_2:block type is not 02
error:04065072:rsa routines:RSA_EAY_PRIVATE_DECRYPT:padding check failed
这样您就可以检查您的邮件是否使用正确的公钥进行加密