openssl_pkey_get_public返回0

ƒer*_*lle 5 php openssl codeigniter

我按照这里的教程:

我生成的密钥如下:

# 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
Run Code Online (Sandbox Code Playgroud)

当我尝试使用它们时:

$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);
Run Code Online (Sandbox Code Playgroud)

它回归:

Response does not contain any data.
Run Code Online (Sandbox Code Playgroud)

密码是:1234 //我设置1234进行测试

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-----
Run Code Online (Sandbox Code Playgroud)

mykey.public:

-----BEGIN PUBLIC KEY-----
MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDEhwuJ7clKxs9aoBWQAAuE0vmh
XYPNn/I4/OaFkaDqGjxsmzmMwcKWkGyJuBsheC12pibPLjQqOb7/dq2XMvL/I1hx
70NaWbafSF8MsCwXD2azm18Y1aachqXnrFcBEFdf2PPRxebqf5JPKKxqRV89fAS3
LrOYhx9YUMrVgd4WNwIDAQAB
-----END PUBLIC KEY-----
Run Code Online (Sandbox Code Playgroud)

注意:

这个测试对我有用:

$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; 
Run Code Online (Sandbox Code Playgroud)

Gui*_*nto 1

文件协议通常对于每个环境都有不同的工作方式

文件系统是 PHP 使用的默认包装器,代表本地文件系统。当指定相对路径(不以/\\\或 Windows 驱动器号开头的路径)时,提供的路径将应用于当前工作目录。在许多情况下,除非已更改,否则这是脚本所在的目录。使用 CLI sapi,默认为调用脚本的目录。

对于某些函数,例如fopen()file_get_contents()include_path也可以选择性地搜索相对路径。

return或退货resource或退货false。这看起来像一个自定义错误:Response does not contain any data.

在 Windows 中$_SERVER['DOCUMENT_ROOT']返回类似这样的内容E:/wamp/www/project,在 Like-unix 中返回类似这样的内容,如果不需要/var/etc/www/project时在 Codeigniter 文件夹中执行 php 脚本。...].'/codeigniter/...

首先尝试这个:

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

如果不起作用,请使用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));
Run Code Online (Sandbox Code Playgroud)

为了简化,您可以使用APPPATHCodeIgniter 中的常量,例如:

$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));
Run Code Online (Sandbox Code Playgroud)

注意:我认为正确的用法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);
Run Code Online (Sandbox Code Playgroud)