phpseclib在创建密钥期间使用openssl?

时间:2013-03-15 21:22:21

标签: php encryption rsa phpseclib

我的印象是,当我尝试以下代码时,phpseclib不需要openssl ...

$rsa = new Crypt_RSA();
$key = $rsa->createKey();

我得到以下错误,因为它使用的是openssl函数。有点困惑。

Warning: openssl_pkey_export(): cannot get key from parameter 1 in /RSA.php on line 509  

Warning: openssl_pkey_get_details() expects parameter 1 to be resource, boolean given in /RSA.php on line 510  

Warning: array_values() expects parameter 1 to be /RSA.php on line 513  

Warning: call_user_func_array() expects parameter 2 to be array, null given in /RSA.php on line 513  

Warning: array_values() expects parameter 1 to be array, boolean given in /RSA.php on line 514

Warning: call_user_func_array() expects parameter 2 to be array, null given in /RSA.php on line 514 

1 个答案:

答案 0 :(得分:0)

phpseclib使用OpenSSL,如果它可用,但不是必需的。

短期修复

在顶部define('CRYPT_RSA_MODE', CRYPT_RSA_MODE_INTERNAL);

长期修复

看看这会对你有什么影响很有趣:

#
#-----[ OPEN ]------------------------------------------
#
Crypt/RSA.php
#
#-----[ FIND ]------------------------------------------
#
            $rsa = openssl_pkey_new(array(
                'private_key_bits' => $bits,
                'config' => dirname(__FILE__) . '/../openssl.cnf'
            ));
#
#-----[ AFTER, ADD ]------------------------------------
#
echo dirname(__FILE__) . "/../openssl.cnf\r\n";
echo file_exists(dirname(__FILE__) . '/../openssl.cnf') ? "exists\r\n" : "doesn't exist\r\n";

这不会解决问题,但它会给我们一些线索来解决问题所在。特别是,我在想的问题是:

https://github.com/phpseclib/phpseclib/blob/0.3.1/phpseclib/Crypt/RSA.php#L503

phpseclib在定义CRYPT_RSA_MODE_OPENSSL时检查是否定义了OpenSSL扩展,但是在使用它时不检查openssl.cnf是否存在。可能是开发人员部分的疏忽,如果这是造成你的问题的原因,那么永久的长期修复将是让phpseclib检查文件的存在。