2013-06-12 7 views
4

У меня есть открытый ключPHP OpenSSL Public Key Encryption с Струнный Public Key

-----BEGIN PUBLIC KEY----- 
MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAwKMDEDjbP5v/9kcvpQKf 
IG3nU5Yid/tUNIeXBSDlxqhTEOKs8iQHXk0T17C4g7KHmrT2hxUomaAa2wwbfL+Z 
4ppqvZZ4cu7CO6jaA0HyoBCU96siSuE0mPt8kU/PRA9+nAwu9lu9oYZUiVVJ3D4f 
o2bc+jWWL4GGY+PdSlz81ZW5cW/LOmNs9D0jJIxbwNocHxGgJ+xTZ3JKp6AO4MvL 
zXyipXu562N8wVc7UIgYYnvr63zFU8vzRL180X5x5MiJbjTYbfLH3z7qINPMZZLv 
A5vzJ0HX3J8rG96tmFuUzopCnvf+WVLvaS2T5uMxieK9dfA32CFQp4i3cj39c2b7 
NwIDAQAB 
-----END PUBLIC KEY----- 

хранится в виде строки в кодировке Base64 (в MySQL, установить в качестве $ грести [ 'public_key'])

LS0tLS1CRUdJTiBQVUJMSUMgS0VZLS0tLS0KTUlJQklqQU5CZ2txaGtpRzl3MEJBUUVGQUFPQ0FROEFNSUlCQ2dLQ0FRRUF3S01ERURqYlA1di85a2N2cFFLZgpJRzNuVTVZaWQvdFVOSWVYQlNEbHhxaFRFT0tzOGlRSFhrMFQxN0M0ZzdLSG1yVDJoeFVvbWFBYTJ3d2JmTCtaCjRwcHF2Wlo0Y3U3Q082amFBMEh5b0JDVTk2c2lTdUUwbVB0OGtVL1BSQTkrbkF3dTlsdTlvWVpVaVZWSjNENGYKbzJiYytqV1dMNEdHWStQZFNsejgxWlc1Y1cvTE9tTnM5RDBqSkl4YndOb2NIeEdnSit4VFozSktwNkFPNE12TAp6WHlpcFh1NTYyTjh3VmM3VUlnWVludnI2M3pGVTh2elJMMTgwWDV4NU1pSmJqVFliZkxIM3o3cUlOUE1aWkx2CkE1dnpKMEhYM0o4ckc5NnRtRnVVem9wQ252ZitXVkx2YVMyVDV1TXhpZUs5ZGZBMzJDRlFwNGkzY2ozOWMyYjcKTndJREFRQUIKLS0tLS1FTkQgUFVCTElDIEtFWS0tLS0tCg== 

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

$success = openssl_public_encrypt($data, $encrypted, base64_decode($row['public_key'])); 

Когда выше запускаются, $success всегда ложно и $encrypted пустые. Я попытался запустить открытый ключ через openssl_pkey_get_public() и отправить ресурс openssl_public_encrypt() и не повезло. Запись в файл не является вариантом и не хранит закрытый ключ.

Кто-нибудь знает, как заставить это работать? (или это работает для всех остальных, и это просто странная проблема с сервером?)

EDIT: Поскольку, похоже, есть некоторая путаница в моей проблеме, вот код тестирования, который я использую, и его вывод. (Примечание: я удалил кодировку base64, просто чтобы увидеть, если это сделано никакой разницы)

$pubkey = openssl_get_publickey($row['public_key']); 
$publicKey = openssl_pkey_get_details($res); 
$encrypted = null; 
$success = openssl_public_encrypt($data, $encrypted, $pubkey); 
print "\npubkey1 " . $row['public_key']; 
print "\npubkey2 " . $pubkey; 
print "\npubkey3 " . $publicKey; 
print "\npubkey4 " . $publicKey["key"]; 
print "\nencryption " . ($success ? 'true' : 'false') . ' "' . $encrypted . '"'; 
$success = openssl_public_encrypt($data, $encrypted, $row['public_key']); 
print "\nencryption2 " . ($success ? 'true' : 'false') . ' "' . $encrypted . '"'; 

Выход:

pubkey1 -----BEGIN PUBLIC KEY----- 
MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA89FgfElm36q7iAf8frqa 
o58naoROsAljaFbmztfnqlmzXfyijK5CNJFdkUCgsu2zGxN7UlGiBOassTd4ijWm 
1rz6/ad9fGXplfMGxZxyPCz31VreSWXmTG/PeSIYs1Co+dibV3imYt5jTxfLs7BZ 
WsT8nuLxGPw/o/gyKut0Ru+jXI2GgT4s3SylXinn/IbIA497SohqYA7/ViQnBwSL 
ZKUysOx2QgBmc9m0viRqDSKNUtDw7+L7bjhlwgZUGr6fxfTuNj9PWo97aPSE74CD 
owYYl2ToTboKSjZUszeNwQKpUnlHY/DBkwmYUJ7SAYDY70VNooadN5dZ4ehjdaka 
6QIDAQAB 
-----END PUBLIC KEY----- 

pubkey2 Resource id #50 
pubkey3 
pubkey4 
encryption false "" 
encryption2 false "" 
+0

@halfer Ваш класс шифрования делает в основном то, что я уже делаю. – geoffreak

ответ

0

Таким образом, проблема связана с данными. PKI для php имеет очень небольшое ограничение длины и не может использоваться для шифрования больших объемов данных. Вместо этого вы должны использовать PKI для шифрования симметричного ключа, который затем используется для шифрования/дешифрования данных.

Подробнее @How to encrypt long strings in PHP?

+1

Это не проблема «PKI для php». Это проблема RSA. RSA с использованием дополнения PKCS1, только позволяет делать числа, которые являются длиной модуля (в байтах) - 11. Я ответил на другую тему. – neubert

2

Ключ, который вы должны перейти к этой функции является объект PHP ресурс , а не строковое представление самого ключа.

$pubkey = openssl_get_publickey(base64_decode($row['public_key'])); 
$success = openssl_public_encrypt($data, $encrypted, $pubkey); 
+0

К сожалению, это не имеет никакого значения. Смотрите мои правки. – geoffreak

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