2013-02-23 3 views
1

У меня есть клиент (Android-устройство), который генерирует пару открытого и закрытого ключей. Он отправляет открытый ключ на сервер, и сервер должен зашифровать некоторые данные с помощью открытого ключа и вернуть его, чтобы клиент мог расшифровать его с помощью закрытого ключа позже. Мой php-код регистрирует предупреждение о том, что открытый ключ, который я ему предоставляю, недействителен.Android KeyPairGenerator + php openssl_public_encrypt

На стороне устройства, сгенерировать пару ключей следующим образом -

KeyPairGenerator kpg = KeyPairGenerator.getInstance("RSA"); 
kpg.initialize(256); 
KeyPair kp = kpg.generateKeyPair(); 
PublicKey publicKey = kp.getPublic(); 

Я тогда base64 кодирования и отправить его -

String urlParameters = "productID=" + productID + "&publicKey=" 
       + URLEncoder.encode(Base64.encodeToString(publicKey.getEncoded(), 
         Base64.DEFAULT)); // without the URLEncoder, the + signs 
              // are turned into spaces 

На стороне сервера, я извлечь PublicKey из POST и попытаться использовать его для кодирования некоторых данных -

$publicKey = $_POST['publicKey']; 
$encryptedData = ''; 
$productData = 'test test test'; 
openssl_public_encrypt($productData, $encryptedData, $publicKey); 

Это заканчивается ошибкой с помощью t он следующий в журнале -

PHP Warning: openssl_public_encrypt(): key parameter is not a valid public key 

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

$publicKey = "-----BEGIN PUBLIC KEY-----\r\n" . $publicKey . "\r\n-----END PUBLIC KEY-----"; 

сломал голову над этим на какое-то время, и ни одно из предложений, с которыми я столкнулся, похоже, помогает. Любые мысли были бы наиболее полезными!

+0

* вздыхает * ... как же PHP уйти с такой плохой документацией? На странице [manual page] (http://php.net/manual/en/function.openssl-public-encrypt.php) даже не указано, в каком формате должен находиться открытый ключ! –

+0

Обратите внимание, что отправка открытого ключа другой стороне недостаточна, чтобы избежать атаки людей в середине атаки; откуда вы знаете, что открытый ключ от правой стороны? Любой может отправить вам открытый ключ ... –

+0

@owlstead: у вас там хорошая точка. я отправлял открытый ключ на сервер, поэтому я мог избежать жесткого кодирования/связывания закрытого ключа на стороне устройства, создавая их на лету. если я вместо этого использую симметричный ключ и не передаю его, я обеспокоен тем, что ключ может быть извлечен из пакета android. нужно подумать об этом, я думаю ... – ashutosh

ответ

1

удалось решить этот вопрос, наконец, сделав 2 изменения -

  1. бы использовать Base64.NO_WRAP флаг вместо Base64.DEFAULT на стороне Java.
  2. Добавлен префикс/суффикс в PHP после чанка расщепления - $publicKey = "-----BEGIN PUBLIC KEY-----\r\n" . chunk_split($publicKey) . "-----END PUBLIC KEY-----";
Смежные вопросы