简体   繁体   English

openssl_pkey_get_public返回0

[英]openssl_pkey_get_public return 0

I follow the tutorial here : 我按照这里的教程:

I generate the keys as follow: 我生成的密钥如下:

# generate a 1024 bit rsa private key, ask for a passphrase to encrypt it and save to file
openssl genrsa -des3 -out mykey.private 1024

# generate the public key for the private key and save to file
openssl rsa -in mykey.private -pubout -out mykey.pub

And when I will try to use they: 当我尝试使用它们时:

$folder = 'file://'.$_SERVER['DOCUMENT_ROOT'].'/codeigniter/application/third_party/RSA/';
$pubKey = openssl_pkey_get_public($folder.'mykey.pub');
return $pubKey;
//openssl_public_encrypt($sensitiveData, $encryptedData, $pubKey);

it retuns: 它回归:

Response does not contain any data.

the passphrase is: 1234 //I set 1234 for test 密码是:1234 //我设置1234进行测试

mykey.private: mykey.private:

-----BEGIN RSA PRIVATE KEY-----
Proc-Type: 4,ENCRYPTED
DEK-Info: DES-EDE3-CBC,656AAE01548C6B4A

qw0+DGFuoQDqLsaYTgaklEaNPMSpgmMoUZIWdawKVKxkebQXiGMHyajpwWyCjtV9
ru9iinDjDgG97T3q2+k1i60fwXECMMAb/ndHAa+ckqVOsyASmmO/57ulxeiKe70L
ThmU3BvYDUJCNgNgpumi8uOmzVeJJl9v6/qHc/pTPCVIlvQOHaMCBnxnxO1gI6yG
7PIWOWyakH+xW6LPOj6Wba7RQOtFYxtbB80EymTLX+kVJ6yHb63EYW48moe9GgzB
XZDSW0ICKmge5galdhvZ0hpobS1fBIpyswUW/zZz0Jf5QkIEjgZRzNuP5XKg4BT7
MH8aDT/ZV/0kwK9R83/W+Kp2rGb2SbtUqceCo//6wH1qqfXSKqDyKljTg4Vbwp3r
Ad4rkZUuvsPfS6Z9TvUFcGeFdZ06Mg4Xq5O673E1Ibam0Qc0+ZxyNzqo3m6yJqgG
gKmQpHUGc5OrA0ElqVDzRcabPm1MI/5dK7B1+jXyN7/af5LgHoPGUV8OvKIWwyCj
OUiRDS6YrxB3bIDUdAJTJyeINu8yGJstBmOw17EycyOZy/cMo900z2i1guyCfeHr
Qp+tw23FhtAoBPLEWBIR91/COxRud229al0XsU2axuAnBcHoYyyWz3MZ5Gci9q89
CuseDLvlQZw8Q54Z79b2UO2Klh18NMu4KRpiBPLoM3V+Q1Q4focqW/2/KDfCnxLs
yGv3OEm688ajq7wxYnH5nuxiBBnDlT364xmUoB0FCb5wNg2KPaZgLXqKpi7eXcZg
JfXZLuOc4EeXqHqgzTrLmG+CbLsG+i5rWuABdz0ZQ/eM8DI2KgLQeQ==
-----END RSA PRIVATE KEY-----

mykey.public: mykey.public:

-----BEGIN PUBLIC KEY-----
MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDEhwuJ7clKxs9aoBWQAAuE0vmh
XYPNn/I4/OaFkaDqGjxsmzmMwcKWkGyJuBsheC12pibPLjQqOb7/dq2XMvL/I1hx
70NaWbafSF8MsCwXD2azm18Y1aachqXnrFcBEFdf2PPRxebqf5JPKKxqRV89fAS3
LrOYhx9YUMrVgd4WNwIDAQAB
-----END PUBLIC KEY-----

NOTE: 注意:

this test worked for me: 这个测试对我有用:

$key = '-----BEGIN PUBLIC KEY-----
MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDEhwuJ7clKxs9aoBWQAAuE0vmh
XYPNn/I4/OaFkaDqGjxsmzmMwcKWkGyJuBsheC12pibPLjQqOb7/dq2XMvL/I1hx
70NaWbafSF8MsCwXD2azm18Y1aachqXnrFcBEFdf2PPRxebqf5JPKKxqRV89fAS3
LrOYhx9YUMrVgd4WNwIDAQAB
-----END PUBLIC KEY-----'; 

$res = openssl_pkey_get_public($key); 
openssl_public_encrypt("hello", $encryptedData, $key);

echo $encryptedData; 

The file protocol generally works differently for each environment 文件协议通常对每个环境的工作方式不同

Filesystem is the default wrapper used with PHP and represents the local filesystem. Filesystem是PHP使用的默认包装器,代表本地文件系统。 When a relative path is specified (a path which does not begin with / , \\ , \\\\ , or a Windows drive letter) the path provided will be applied against the current working directory. 指定相对路径(不以/\\\\\\或Windows驱动器号开头的路径)时,将对当前工作目录应用提供的路径。 In many cases this is the directory in which the script resides unless it has been changed. 在许多情况下,这是脚本所在的目录,除非它已被更改。 Using the CLI sapi, this defaults to the directory from which the script was called. 使用CLI sapi,默认为调用脚本的目录。

With some functions, such as fopen() and file_get_contents() , include_path may be optionally searched for relative paths as well. 对于某些函数,例如fopen()file_get_contents() ,也可以选择性地搜索include_path的相对路径。

Note return or return resource or return false . 注意return或返回resource或返回false This looks like a custom error: Response does not contain any data. 这看起来像一个自定义错误: Response does not contain any data.

In Windows $_SERVER['DOCUMENT_ROOT'] returns something like this E:/wamp/www/project , in Like-unix returns like this /var/etc/www/project , if php script is executed in Codeigniter folder when this ...].'/codeigniter/... is not needed. 在Windows $_SERVER['DOCUMENT_ROOT']返回类似这样的东西E:/wamp/www/project ,在Like-unix中返回如/var/etc/www/project ,如果php脚本在Codeigniter文件夹中执行时此...].'/codeigniter/...不需要。

First try this: 首先尝试这个:

$folder = 'file:///'.$_SERVER['DOCUMENT_ROOT'].'/application/third_party/RSA/';
$pubKey = openssl_pkey_get_public($folder.'mykey.pub');

If not work, use is_file and file_get_contents , eg.: 如果不起作用,请使用is_filefile_get_contents ,例如:

$folder = 'file:///'.$_SERVER['DOCUMENT_ROOT'].'/application/third_party/RSA/mykey.pub';

if (false === is_file(is_file))
    return 'File not found';
if (false === is_readable(is_file))
    return 'File not readable';
else
    return openssl_pkey_get_public(file_get_contents($folder));

For simplify, you can use APPPATH constant from CodeIgniter, eg.: 为简化起见,您可以使用CodeIgniter中的APPPATH常量,例如:

$folder = APPPATH . '/third_party/RSA/mykey.pub';

if (false === is_file(is_file))
    return 'File not found';
if (false === is_readable(is_file))
    return 'File not readable';
else
    return openssl_pkey_get_public(file_get_contents($folder));

Note: I think the correct use of openssl_public_encrypt is (example): 注意:我认为正确使用openssl_public_encrypt是(示例):

<?php
//Set $myResource var
$myResource = openssl_pkey_get_public('test.pem');

//Use $myResource var in third param
openssl_public_encrypt("hello", $encryptedData, $resource);

//Get response
var_dump($encryptedData);

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM