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

时间:2018-08-20 11:27:08

标签: openssl rsa phpseclib

嗨,我想知道为什么仅用phpseclib中的一个公钥就能执行RSA(加密/解密)?

$ rsa是phpseclib / Crypt / RSA.php的实例(链接:https://github.com/phpseclib/phpseclib/blob/master/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中实现它。任何帮助将不胜感激。

1 个答案:

答案 0 :(得分:1)

以最基本的形式,您需要的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);

这会产生解密错误。

现在,如果您用以下内容替换最后一行:

echo decryptData($ciphertext, $privatekey);

执行该操作,您将获得原始文本。但是您必须使用私钥才能找回该文本,而不是公钥。