2013-04-01 2 views
2

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


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

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

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

//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: выхода Образца:

Plaintext для шифрования RSA:

Это некоторый открытый текст мы будем шифровать

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

'~! _æž|WýF|E × 9 & ùš!'jéÓb ÷ áåŠ € É7J + ۪߯ × ŽÈã © ¨É £ # (÷) ÃX ") ÷ O'Ë ± N @ Øv« ÓÌPƒ¹-Â!! ¢ |Á & Á½Á~ö ‰ ºŠCðJ «Vw {uAåoOÂXäÞ # ÷ ï`agÏ: УНО

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

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

+2

'rsa_encrypt' возвращает строку base64. Ожидает ли 'rsa_decrypt'? Кроме того, можете ли вы опубликовать пример вывода из прогона, а не суммировать его? –

+0

Хорошо, добавили пример запуска в редактирование. Я не знал, что он возвращает строку base64, это вызовет у меня проблемы? Могу ли я просто base64 закодировать результат в rsa_encrypt и декодировать его в начале rsa_decrypt? – MPainter

ответ

3

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

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

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

EDIT: Я получил его для работы после того, как я заменил пробелы в ваших ключах новыми строками. например.

$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-----"; 
+0

Хорошо, я добавил base64_decode() в функцию шифрования, а также base64_encode() в начале функции дешифрования. Зашифрованный текст на самом деле остается постоянным, но после того, что вы сказали, я не знаю, хорошо это или нет! Тем не менее, ничего не получаю от расшифровки fucntion :( – MPainter

+0

Я получил его для работы после того, как я заменил пробелы в ваших ключах новыми строками. Я отредактировал свое сообщение, чтобы отразить это. – 2013-04-01 20:13:13

+0

Хорошо, я просто сделал это, и у меня появилось сообщение об ошибке: «Ошибка дешифрования в C: \ wamp \ www \ JennasPhotographyWebsite \ phpseclib0.3.1 \ Crypt \ RSA.php в строке 2177" – MPainter

 Смежные вопросы

  • Нет связанных вопросов^_^