Openssl phpseclib仅使用公钥解密和加密数据

Openssl phpseclib仅使用公钥解密和加密数据,openssl,rsa,phpseclib,Openssl,Rsa,Phpseclib,您好,我想知道为什么在phpseclib中只能使用一个公钥执行RSA(加密/解密) $rsa是phpseclib/Crypt/rsa.php的一个实例(链接:) $publicKey这里的密钥是相同的 function encryptData($data, $publicKey) { $rsa = new Crypt_RSA(); $rsa->loadKey($publicKey); // public key $rsa->setEncryptionMode(

您好,我想知道为什么在phpseclib中只能使用一个公钥执行RSA(加密/解密)

$rsa是phpseclib/Crypt/rsa.php的一个实例(链接:) $publicKey这里的密钥是相同的

function encryptData($data, $publicKey) {
    $rsa = new Crypt_RSA();
    $rsa->loadKey($publicKey); // public key
    $rsa->setEncryptionMode(CRYPT_RSA_ENCRYPTION_PKCS1);
    $output = $rsa->encrypt($data);
    return base64_encode($output);
}

function decryptData($data, $publicKey) {
    $rsa = new Crypt_RSA();
    $rsa->setEncryptionMode(CRYPT_RSA_ENCRYPTION_PKCS1);
    $ciphertext = base64_decode($data);
    $rsa->loadKey($publicKey); // public key
    $output = $rsa->decrypt($ciphertext);
    // $output = $rsa->decrypt($data);
我不明白为什么上面的代码可以工作。
出于同样的原因,我不能在Ruby中实现它,因为Ruby需要一个密钥对来完成这样的操作。任何帮助都将不胜感激。

在最基本的形式中,RSA密钥所需的一切,无论是公开密钥还是私有密钥,都是指数和模。在实践中,私钥通常通过中国剩余定理具有额外的参数来加速计算,但在实践中,私钥并不需要这些参数

因此,在RSA最基本的形式中,公钥和私钥是无法区分的

这就是说,如果你想加密/解密,你仍然必须同时拥有这两者

我不明白为什么上面的代码可以工作

它不起作用。不像你期望的那样

嗯,现在,它实际上什么都没做。您只是有一个加密和解密函数,但没有向它传递任何参数,只是假设它对这两个函数使用相同的密钥。但事实并非如此,如下所示:

<?php

include('Crypt/RSA.php');


function encryptData($data, $publicKey) {
    $rsa = new Crypt_RSA();
    $rsa->loadKey($publicKey); // public key
    $rsa->setEncryptionMode(CRYPT_RSA_ENCRYPTION_PKCS1);
    $output = $rsa->encrypt($data);
    return base64_encode($output);
}

function decryptData($data, $publicKey) {
    $rsa = new Crypt_RSA();
    $rsa->setEncryptionMode(CRYPT_RSA_ENCRYPTION_PKCS1);
    $ciphertext = base64_decode($data);
    $rsa->loadKey($publicKey); // public key
    $output = $rsa->decrypt($ciphertext);
    // $output = $rsa->decrypt($data);
    return $output;
}

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

$ciphertext = encryptData('zzz', $publickey);
echo decryptData($ciphertext, $publickey);

这样做,你会得到原来的文本回来。但是您必须使用私钥来获取该文本,而不是公钥。

仅仅因为变量的名称是
$publicKey
并不意味着它是公钥。多亏指出了这一点,但我自己运行了代码,非常确定它与我的配置文件中的密钥相同。
echo decryptData($ciphertext, $privatekey);