嗨,我想知道为什么仅用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中实现它。任何帮助将不胜感激。
答案 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);
执行该操作,您将获得原始文本。但是您必须使用私钥才能找回该文本,而不是公钥。