У меня есть клиент (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-----";
сломал голову над этим на какое-то время, и ни одно из предложений, с которыми я столкнулся, похоже, помогает. Любые мысли были бы наиболее полезными!
* вздыхает * ... как же PHP уйти с такой плохой документацией? На странице [manual page] (http://php.net/manual/en/function.openssl-public-encrypt.php) даже не указано, в каком формате должен находиться открытый ключ! –
Обратите внимание, что отправка открытого ключа другой стороне недостаточна, чтобы избежать атаки людей в середине атаки; откуда вы знаете, что открытый ключ от правой стороны? Любой может отправить вам открытый ключ ... –
@owlstead: у вас там хорошая точка. я отправлял открытый ключ на сервер, поэтому я мог избежать жесткого кодирования/связывания закрытого ключа на стороне устройства, создавая их на лету. если я вместо этого использую симметричный ключ и не передаю его, я обеспокоен тем, что ключ может быть извлечен из пакета android. нужно подумать об этом, я думаю ... – ashutosh