RSA PKCS#8格式的关键

时间:2015-02-25 20:06:33

标签: php openssl phpseclib

OpenSSL PHP代码不会生成PKCS#8格式的加密私钥

    $passphrase = 'Hello World';

    $config = array ("digest_alg" => "sha256","private_key_bits" => 2048,"private_key_type" => OPENSSL_KEYTYPE_RSA );

    // Create the private and public key
    $res = openssl_pkey_new ( $config );

    /* Extract the private key from $res to $privKey */
    openssl_pkey_export ( $res, $priv_key, $passphrase );

    /* Extract the public key from $res to $pubKey */
    $pub_key = openssl_pkey_get_details ( $res );
    $pub_key = $pub_key["key"];
    $pkey_pair = array ('priv_key' => $priv_key,'pub_key' => $pub_key );

    /* Print it */
    var_dump($pkey_pair);

但是PhpSeclib可以:

<?php
include('Crypt/RSA.php');

$rsa = new Crypt_RSA();

$rsa->setPrivateKeyFormat(CRYPT_RSA_PRIVATE_FORMAT_PKCS8);

extract($rsa->createKey());

echo $privatekey;

现在,是否可以使用phpseclib将openssl_pkey_new()生成的私钥转换为PKCS#8。

我没有使用phpseclib进行签名和加密,因为与php openssl函数相比,它速度要慢得多。我的客户端期望加密的私钥是PKCS#8格式。

1 个答案:

答案 0 :(得分:1)

phpseclib应该使用OpenSSL(并且库和标题版本不匹配;你应该使用最新版本0.3.10,因为匹配的要求略有放松)。

那就是说,你可以这样转换RSA密钥:

<?php
include('Crypt/RSA.php');

$rsa = new Crypt_RSA();
//$rsa->setPassword('password'); 
$rsa->loadKey('...');

//$rsa->setPassword(); // clear the password if there was one
$privatekey = $rsa->getPrivateKey();
$publickey = $rsa->getPublicKey();
?>

默认情况下,getPrivateKey()返回PKCS1格式的私钥。您可以通过执行$rsa->getPrivateKey(CRYPT_RSA_PRIVATE_FORMAT_PUTTY);

使其以其他格式返回密钥