phpseclib расшифровывает и шифрует данные только открытым ключом
Привет, я хотел бы знать, почему RSA может выполняться (шифровать / дешифровать) только с одним открытым ключом в phpseclib?
$ 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 ответ
В его основной форме все, что вам нужно для ключа 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);
Сделайте это, и вы получите исходный текст обратно. Но вы должны использовать закрытый ключ, чтобы вернуть этот текст, а не открытый ключ.