Расшифровка RSA / ECB / PKCS1Padding в PHP 7.2 - PullRequest
0 голосов
/ 04 февраля 2019

Я пытался заставить это работать с сегодняшнего утра, но я застрял в этом часах.Это мой открытый ключ: https://pastebin.com/EBszJhSi У меня есть строка, которую мне нужно зашифровать.

String = "Hello"

Это мой код ниже ...

function RSAEncryption($text)
{

    $encrypted = 'hey';
    $publicKey = "file:/".PUBLIC_KEY;
    $plaintext = "Hello";
    $pubkey = openssl_pkey_get_public(file_get_contents(PUBLIC_KEY));
    openssl_public_encrypt($plaintext, $encrypted, re($publicKey), OPENSSL_PKCS1_PADDING);
    echo $encrypted;   //encrypted string
    return $encrypted;
}

Это ничего не возвращает.Это чистый пробел.

var_dump(openssl_public_encrypt($plaintext, $encrypted, re($publicKey), OPENSSL_PKCS1_PADDING));

Возвращает «ложь».Я пробовал несколько библиотек, таких как phpseclib, и это имеет другую проблему.Я пробовал обе версии phpseclib, 1.0 и 2.0.Проблема с phpseclib заключалась в том, что файлы и некоторые переменные отсутствовали, хотя я загружал их из официальных источников.

В любом случае, может кто-нибудь помочь мне с этим?

РЕДАКТИРОВАТЬ:

Значение PUBLIC_KEY равно /location/keys/publickey.pem.

re() Функция:

function re($key_file_path)
{
    $handle = fopen($key_file_path, "r");
    // echo "Key Contents : " . fread($handle, filesize($key_file_path)) . "<br>";
    return nl2br(fread($handle, filesize($key_file_path)));
}

Ответы [ 2 ]

0 голосов
/ 05 февраля 2019

С phpseclib:

$key = '---- BEGIN SSH2 PUBLIC KEY ----
Comment: "imported-openssh-key"
AAAAB3NzaC1yc2EAAAABJQAAAQEAgsYRVei5nVln0cX9D/x5OcscdO5WCsmyZUEN
dHhfgVD8UklasxcXElKoL0UEer9nvJWMILAU/ZMHbf0O1SaiYbhFmDFyHi/CfwT6
QHD2mu7qLbadXXs0OiGiTUPwZX2Sux2uoxm0ZwfxjSbO85rlJ7Yg0ZjXkRiw+4qT
OQNyYEq4Vt6R/BwIdf5Yt75+7Nzlm5HHi4TPNE63YJJTdazJQ1OWgdZWIZjk4M9K
Zl8x9qNRsKd2GC1G6CGq+L1DOgBbPVWPE7DGUVYJYYF609Iau11LXS6d2FBDUS3S
xna7mtmlZQNEvSRtctuojWfwWI2k1Ac/DW3RJ+M1ccN78dseEw==
---- END SSH2 PUBLIC KEY ----';

$key = preg_replace('#----.*?----#', '', $key);
$key = preg_replace('#Comment: .*#', '', $key);
$key = str_replace(["\r", "\n"], '', $key);

$key = 'ssh-rsa ' . $key;

$rsa = new RSA();
$rsa->loadKey($key);

echo $rsa;

Вывод ключа, как правило, довольно хороший способ проверить, успешно ли загружен ключ.Если вы закомментируете биты preg_replace, str_replace и 'ssh-rsa' . $key (т. Е. Если вы попытаетесь загрузить ключ напрямую), он не будет загружаться, но если они на месте, то это произойдет.

Этот метод не будет работать с OpenSSL, поскольку структура ключа в кодировке base64, в конечном счете, является ключом в формате SSH, а OpenSSL их не поддерживает.В отличие от этого, phpseclib работает не в том же формате, что и ваш ключ.phpseclib ожидает, что ключи будут в том же формате, что и в файле ~/.ssh/authorized_keys.

0 голосов
/ 04 февраля 2019
  1. Проверьте ваш путь к файлу: "file:/".PUBLIC_KEY;.Это должно быть с двумя слешами
  2. Вы пытаетесь получить содержимое файла по имени файла, а не по пути: file_get_contents(PUBLIC_KEY)
  3. Что делает re($publicKey)?Это не PHP встроенная функция
    function RSAEncryption($text)
    {
        $publicKeyContent = file_get_contents("file://".PUBLIC_KEY);
        $publicKey = openssl_pkey_get_public($publicKeyContent);

        openssl_public_encrypt($text, $encrypted, $publicKey, OPENSSL_PKCS1_OAEP_PADDING);

        return $encrypted;
    }
...