PHP openssl加密解密错误?无效的公钥/私钥?

PHP openssl加密解密错误?无效的公钥/私钥?,php,encryption,openssl,Php,Encryption,Openssl,我用php编写了以下测试代码: function genPGP() { // Create the keypair $res=openssl_pkey_new(); // Get private key openssl_pkey_export($res, $prK, bin2hex(mcrypt_create_iv(100, MCRYPT_DEV_URANDOM))); // Get public key $puK = openssl_pkey_g

我用php编写了以下测试代码:

function genPGP() {
    // Create the keypair
    $res=openssl_pkey_new();
    // Get private key
    openssl_pkey_export($res, $prK, bin2hex(mcrypt_create_iv(100, MCRYPT_DEV_URANDOM)));
    // Get public key
    $puK = openssl_pkey_get_public($prK);
    return array($prK,$puK);
}

function prKeyDecrypt($data,$key){
    if (openssl_private_decrypt($data, $r, $key)) {
       return $r;
    }
}

$keys = genPGP();
$prK = $keys[0];
$puK = $keys[1];
$data = 'abc123';
openssl_public_encrypt($data,$encrypted,$puK); 
echo prKeyDecrypt($encrypted,$prK);
我得到两个错误,它们都相似,它们是:

Warning: openssl_public_encrypt(): key parameter is not a valid public key in test2.php on line 23

Warning: openssl_private_decrypt(): key parameter is not a valid private key in test2.php on line 14

我不确定什么是“有效的……钥匙”。有没有其他的方式可以让我拿到钥匙?根据手册和我读到的内容,这似乎是准确的。

你很接近。首先,不要用密码短语加密私钥。第二,直接从资源获取公钥。即:

function genPGP0() {
    // Create the keypair
    $res=openssl_pkey_new();
    // Get private key
    openssl_pkey_export($res, $prK);
    // Get public key
    $puK = openssl_pkey_get_details($res)["key"];
    return array($prK,$puK);
}
如果要使用密码短语(您将存储私钥),可以使用以下内容:

function genPGP() {
    // Create the keypair
    $res=openssl_pkey_new();
    // Get private key
    $pass = bin2hex(mcrypt_create_iv(100, MCRYPT_DEV_URANDOM));
    openssl_pkey_export($res, $prK_encrypted, $pass);
    $prK = openssl_pkey_get_private($prK_encrypted, $pass);
    // Get public key
    $puK = openssl_pkey_get_details($res)["key"];
    return array($prK,$puK);
}

请注意:您的代码与PGP无关。谢谢您的澄清。它也不是真正的“安全套接字层”。我一直将公钥/私钥加密称为PGP。这本质上是PGP(特别是在它的实现方式上),我认为,它只是以不同的方式进行管理,不使用相同的验证/信任系统(per)。我希望有一个更简单的术语来描述公钥/私钥加密。作为这个问题的扩展,如果允许的话,我如何将
$prK
存储在会话变量中,例如
$\u session['prK']
。简单赋值
$\u SESSION['prK']=$keys[0]
存储数字0,并且在将其分配为引用时会发生相同的情况,例如
$\u SESSION['prK']=&$keys[0]
。您应该问一个新问题。我不使用PHP——我更喜欢Ruby,所以我不熟悉PHP中的会话变量。干杯