2013-08-16 10 views
0

Я использую phpseclib для RSA шифрование http://phpseclib.sourceforge.net/.php rsa функция шифрования, возвращающая ничего

Это мой PHP код:

include('Math/BigInteger.php'); 
include('Crypt/RSA.php'); 


$message="123456"; 
$private_modulus = "272435F22706FA96DE26E980D22DFF67"; 
$private_exponent = "158753FF2AF4D1E5BBAB574D5AE6B54D"; 

$rsa = new Crypt_RSA(); 

$message = new Math_BigInteger(base64_decode($message), 256); 
$private_modulus = new Math_BigInteger(base64_decode($private_modulus), 256); 
$private_exponent = new Math_BigInteger(base64_decode($private_exponent), 256); 


$rsa->loadKey(array('n' => $private_modulus, 'e' => $private_exponent)); 
$encryptedText=$rsa->encrypt($message); 
echo $encryptedText; 

Однако encryptedText пустым. Любая помощь?

+0

RSA ключи для меня странные. Откуда у вас этот пример? И да, '$ encryptedText' не пуст, это' FALSE'. –

ответ

0

У вас есть некоторые проблемы с открытыми/закрытыми ключами. По внешнему виду функции $rsa->loadKey() комментарий, первый параметр строки, но вы назначили какой-то странный массив ...

/** 
* Loads a public or private key 
* 
* Returns true on success and false on failure (ie. an incorrect password was provided or the key was malformed) 
* 
* @access public 
* @param String $key 
* @param Integer $type optional 
*/ 
function loadKey($key, $type = false) 

Пример работы шифровать/дешифровать со случайными государственных/частных ключей:

include('_seclib/Math/BigInteger.php'); 
include('_seclib/Crypt/RSA.php'); 

$rsa = new Crypt_RSA(); 
extract($rsa->createKey()); 

# encrypt 
$message = '123456'; 
$rsa->loadKey($publickey); 
$ciphertext = $rsa->encrypt($message); 
var_dump($ciphertext); 

# decrypt 
$rsa->loadKey($privatekey); 
var_dump($rsa->decrypt($ciphertext)); 

См. documentation для получения дополнительной информации.

+0

Хотя документация на самом деле не упоминает его phpseclib, похоже, что phpseclib может поддерживать необработанные ключи RSA в том формате, в котором OP пытается их использовать. Например, см. «CRYPT_RSA_PUBLIC_FORMAT_RAW». – neubert

+0

Правда, я только что посмотрел на следующий метод 'function _parseKey ($ key, $ type)' где '$ key' по-прежнему помечен/комментирован как строка, но также используется как массив в этом методе. –

0

Если режим шифрования не определен явно, по умолчанию используется OAEP. OAEP требует, чтобы ключ был не менее 2 * хэш-размера + 2. Хэш-настройки по умолчанию для phpseclib - это sha1, длина которого составляет 20 байтов. Таким образом, ключ должен иметь длину не менее 22 байтов или 176 бит.

Ваш размер составляет 16 байт или 128 бит.

Вам нужно либо использовать более крупный ключ, либо изменить режим шифрования для использования дополнения PKCS1. Для заполнения PKCS1 требуется, чтобы по модулю было не менее 11 байт.

Возможно, было бы полезно, если бы phpseclib отображала ошибку, когда длина выбранного модуля была недостаточной. Я постараюсь предложить это ему.

Кроме того, FWIW, учебник RSA не накладывает никаких требований минимальной длины, но phpseclib в настоящее время не реализует учебник RSA. Я думаю, вы можете получить его, вызвав _exponentiate напрямую, но это единственный способ.

Учебник RSA плохой, потому что он уязвим для определенных типов атак, которые рандомизированное дополнение, например PKCS1/OAEP, защищает.

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