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);

Сделайте это, и вы получите исходный текст обратно. Но вы должны использовать закрытый ключ, чтобы вернуть этот текст, а не открытый ключ.

Другие вопросы по тегам