Проблема с RSA при использовании phpseclib в PHP

Я пытаюсь использовать реализацию RSA в phpseclib, я подумал, что будет проще сделать код один раз в функции и повторно использовать функцию. Когда я пытался написать код, я получаю сообщение об ошибке «Ошибка расшифровки». Тестирование также заставило меня понять, что зашифрованный текст каждый раз разный, поэтому я явно делаю что-то не так!


Код для функций:

require_once "Crypt/RSA.php";
require_once "Crypt/AES.php";

//Function for encrypting with RSA
function rsa_encrypt($string, $public_key)
{
    //Create an instance of the RSA cypher and load the key into it
    $cipher = new Crypt_RSA();
    $cipher->loadKey($public_key);
    //Set the encryption mode
    $cipher->setEncryptionMode(CRYPT_RSA_ENCRYPTION_PKCS1);
    //Return the encrypted version
    return base64_encode($cipher->encrypt($string));
}

//Function for decrypting with RSA 
function rsa_decrypt($string, $private_key)
{
    //Create an instance of the RSA cypher and load the key into it
    $cipher = new Crypt_RSA();
    $cipher->loadKey($private_key);
    //Set the encryption mode
    $cipher->setEncryptionMode(CRYPT_RSA_ENCRYPTION_PKCS1);
    //Return the decrypted version
    return $cipher->decrypt($string);
}

Я пытался протестировать его, используя следующее: (ключи предназначены только для тестирования, поэтому они жестко запрограммированы). Именно здесь каждый раз при запуске кода значение $ciphertext меняется каждый раз.

//Private key
$private_key = "-----BEGIN RSA PRIVATE KEY----- MIICXAIBAAKBgQCU+1bLfPmcY7qrF/dTbAtuJlv4R/FVc1WEH9HKU0jQjX/n/db9vz/x0i3te/bK LNEcwUhBu+PWPnOt/qVURG9BUT6RsCRFUn0CyGiUKoy45o9K/mJAHmbrNtrUB6ckrYLF75Y50nUN sBVHUDw8yQymmiOBT1gc/KM5s1xTz44LMwIDAQABAoGAGsiMtAyFu23ac0PdvOuhqm3O/vXAF0Ki zxwBVURfxM6LfiOOcRPe5RSKGTW+Cl7AQVEmMlsa/LtBhLhQ9LNQ5L/4oTmRhCGiZZEmccAdjKsx yMeaxkp+ZHvMxMKQNDgYg1CXqrCrpwwUuMUlA26tfxZ3xSFtFyDTaV9mgDQ1IGECQQCkX9Tum7D1 vQTwbhbYnu7eC4eUOaZeGWSEs2csK7U6vfZ3BzUZW/0tPqcSpQqcNxMtY9TiUsNRj1uM6jX3byp7 AkEA6Ab+wvOTNRtES77OAYG9gHGZZ+iXjQJ/6Z7JehN4p41UbDIf9nNUOLUPL9z5V1uOYnl1CWoo Cw95cdhKXxEAqQJBAIU5Or6tp250ZdVslM27ewSyuY9UblfkIsk/EscFIdzbbDAqwkmsefW6yvTc mU3lgYCPYlKRG8c19tCuX1ENY5MCQAz37x9YW975Ai01ofAFn2DheJCNOINCI4IcROiU1AaRaKmP d6fftFJjFFE5iZovXNr2LOt0yn4rxD7vtuBvY9kCQGyty6YCB6qaD7qXPMhLrLbGajAIWd6ETgxv frK/BJu+buPfDky/g1FhI5R9iMtL1xH0JYLJlaVocU+xSeA9DkY= -----END RSA PRIVATE KEY-----";
//Public key
$public_key = "-----BEGIN PUBLIC KEY----- MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCU+1bLfPmcY7qrF/dTbAtuJlv4R/FVc1WEH9HK U0jQjX/n/db9vz/x0i3te/bKLNEcwUhBu+PWPnOt/qVURG9BUT6RsCRFUn0CyGiUKoy45o9K/mJA HmbrNtrUB6ckrYLF75Y50nUNsBVHUDw8yQymmiOBT1gc/KM5s1xTz44LMwIDAQAB -----END PUBLIC KEY-----";


//Test out the rsa encryption functions
$plaintext = "This is some plaintext to encrypt";
$ciphertext = rsa_encrypt($plaintext, $public_key);
$decipheredtext = rsa_decrypt($ciphertext, $private_key);

//Echo out results
echo sprintf("<h4>Plaintext for RSA encryption:</h4><p>%s</p><h4>After encryption:</h4><p>%s</p><h4>After decryption:</h4><p>%s</p>", $plaintext, $ciphertext, $decipheredtext);

EDIT: Пример вывода:

Открытый текст для шифрования RSA:

Это какой-то открытый текст, который мы зашифруем

После шифрования:

'˜!ˆ_枦WýF¦E×9&ùš!´jéÓb÷á劀É7J+۪߯׎È㩨ɣ#(÷)ÃX„)÷O'˱N@Øv«ÓÌPƒ¹—Âî!a¢¦a&Á½Á ˜ö‰ºŠCðJ«vW{uAåoOÂXäÞ#÷ï`agÏ:OŒ

После расшифровки:

//Ничего не возвращается, здесь пусто


person MPainter    schedule 01.04.2013    source источник
comment
rsa_encrypt возвращает строку base64. Ожидает ли rsa_decrypt один? Кроме того, можете ли вы опубликовать пример вывода из прогона вместо его обобщения?   -  person Mr. Llama    schedule 01.04.2013
comment
Хорошо, добавил пример запуска в редактировании. Я не знал, что он возвращает строку base64, это вызовет у меня проблемы? Могу ли я просто base64 закодировать результат в rsa_encrypt и декодировать его в начале rsa_decrypt?   -  person MPainter    schedule 01.04.2013


Ответы (1)


Я думаю, что ответ GigaWatt правильный. Что касается этого:

Тестирование также заставило меня понять, что зашифрованный текст каждый раз был другим, поэтому я явно делаю что-то не так!

Заполнение PKCS # 1 добавляет случайные байты, поэтому зашифрованный текст всегда будет другим. Однако алгоритм PKCS # 1 знает, когда заканчивается открытый текст и начинаются случайные байты, поэтому он может разделить их и вернуть вам желаемый результат.

РЕДАКТИРОВАТЬ: я заставил его работать после того, как заменил пробелы в ваших ключах новыми строками. например.

$private_key = "-----BEGIN RSA PRIVATE KEY-----
MIICXAIBAAKBgQCU+1bLfPmcY7qrF/dTbAtuJlv4R/FVc1WEH9HKU0jQjX/n/db9vz/x0i3te/bK
LNEcwUhBu+PWPnOt/qVURG9BUT6RsCRFUn0CyGiUKoy45o9K/mJAHmbrNtrUB6ckrYLF75Y50nUN
sBVHUDw8yQymmiOBT1gc/KM5s1xTz44LMwIDAQABAoGAGsiMtAyFu23ac0PdvOuhqm3O/vXAF0Ki
zxwBVURfxM6LfiOOcRPe5RSKGTW+Cl7AQVEmMlsa/LtBhLhQ9LNQ5L/4oTmRhCGiZZEmccAdjKsx
yMeaxkp+ZHvMxMKQNDgYg1CXqrCrpwwUuMUlA26tfxZ3xSFtFyDTaV9mgDQ1IGECQQCkX9Tum7D1
vQTwbhbYnu7eC4eUOaZeGWSEs2csK7U6vfZ3BzUZW/0tPqcSpQqcNxMtY9TiUsNRj1uM6jX3byp7
AkEA6Ab+wvOTNRtES77OAYG9gHGZZ+iXjQJ/6Z7JehN4p41UbDIf9nNUOLUPL9z5V1uOYnl1CWoo
Cw95cdhKXxEAqQJBAIU5Or6tp250ZdVslM27ewSyuY9UblfkIsk/EscFIdzbbDAqwkmsefW6yvTc
mU3lgYCPYlKRG8c19tCuX1ENY5MCQAz37x9YW975Ai01ofAFn2DheJCNOINCI4IcROiU1AaRaKmP
d6fftFJjFFE5iZovXNr2LOt0yn4rxD7vtuBvY9kCQGyty6YCB6qaD7qXPMhLrLbGajAIWd6ETgxv
frK/BJu+buPfDky/g1FhI5R9iMtL1xH0JYLJlaVocU+xSeA9DkY=
-----END RSA PRIVATE KEY-----";
//Public key
$public_key = "-----BEGIN PUBLIC KEY-----
MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCU+1bLfPmcY7qrF/dTbAtuJlv4R/FVc1WEH9HK
U0jQjX/n/db9vz/x0i3te/bKLNEcwUhBu+PWPnOt/qVURG9BUT6RsCRFUn0CyGiUKoy45o9K/mJA
HmbrNtrUB6ckrYLF75Y50nUNsBVHUDw8yQymmiOBT1gc/KM5s1xTz44LMwIDAQAB
-----END PUBLIC KEY-----";
person Community    schedule 01.04.2013
comment
Хорошо, я добавил base64_decode() в функцию шифрования, а также base64_encode() в начале функции расшифровки. Зашифрованный текст теперь фактически остается постоянным, но после того, что вы сказали, я не знаю, хорошо это или нет! Тем не менее, ничего не получаю от функции расшифровки :( - person MPainter; 02.04.2013
comment
У меня это заработало после того, как я заменил пробелы в ваших ключах новыми строками. Я отредактировал свой пост, чтобы отразить это. - person ; 02.04.2013
comment
Хорошо, я только что сделал это и получил сообщение об ошибке: Ошибка расшифровки в C:\wamp\www\JennasPhotographyWebsite\phpseclib0.3.1\Crypt\RSA.php в строке 2177. - person MPainter; 02.04.2013
comment
Перечитывая ваш комментарий... звучит так, будто вы дважды кодируете base64. Сохраните base64_encode в encrypt и удалите его из decrypt. И замените его на base64_decrypt. И сделайте это на $string. - person ; 02.04.2013
comment
Да, у меня внезапно возникла эта идея, и я как раз собирался добавить редактирование в свой комментарий, чтобы сказать, что я сделал, поскольку это сработало отлично! Спасибо за помощь! Это очень ценится! - person MPainter; 02.04.2013