2013-05-31 13 views
5

Okay, cóż, po raz pierwszy pracuję z szyfrowaniem nad projektem. Korzystam z mojego dostawcy hostingu dla protokołu SSL, ale chcę również szyfrować fragmenty bazy danych, które są poufne. W tym celu powiedziano mi, aby korzystać z OpenSSL. Testuję to na moim lokalnym hoście (WAMP), i zainstalowałem OpenSSL i włączyłem modów PHP i Apache SSL. Okej, więc śledziłem tutoriale i, używając kilku sugerowanych metod, udało się wygenerować klucz publiczny i zapisać go jako plik. Z jakiegoś powodu nie mogę wygenerować klucza prywatnego. Ja po dwie wersje kodu Próbowałem:OpenSSL nie tworzy kluczy prywatnych?

// generate private key 
$privateKey = openssl_pkey_new(array(
    'private_key_bits' => 1024, 
    'private_key_type' => OPENSSL_KEYTYPE_RSA, 
)); 
// write private key to file 
openssl_pkey_export_to_file($privateKey, 'private.key'); 
// generate public key from private key 
$publicKey = openssl_pkey_get_details($privateKey); 
// write public key to file 
file_put_contents('public.key', $publicKey['key']); 
// clear key 
echo $privateKey; 

?> 

To generuje plik public.key, ale zapewnia mi ostrzeżenia „openssl_pkey_export_to_file(): nie można dostać klucz od parametru 1:” i "openssl_pkey_get_details () oczekuje, że parametr 1 będzie zasobem, boolowskim. "

Próbowałem również alternatywną metodę:

$config = array(
    "config" => "E:/wamp/bin/apache/apache2.2.22/conf/openssl.cnf", 
    "digest_alg" => "sha512", 
    "private_key_bits" => 1024, 
    "private_key_type" => OPENSSL_KEYTYPE_RSA, 
); 

// Create the private and public key 
$res = openssl_pkey_new($config); 

// Extract the private key from $res to $privKey 
openssl_pkey_export($res, $privKey, NULL); 
echo "Private Key: ".$privKey; 
// Extract the public key from $res to $pubKey 
$pubKey = openssl_pkey_get_details($res); 
$pubKey = $pubKey["key"]; 
echo "Public Key: ".$pubKey; 
$data = 'plaintext data goes here'; 
echo "Data: ".$data; 
// Encrypt the data to $encrypted using the public key 
openssl_public_encrypt($data, $encrypted, $pubKey); 
echo "Encrypted: ".$encrypted; 
// Decrypt the data using the private key and store the results in $decrypted 
openssl_private_decrypt($encrypted, $decrypted, $privKey); 

echo "Decrypted: ".$decrypted; 

Miało to echo wszystko, niestety mój wynik był pusty klucz prywatny, grzywna klucz publiczny, zwykłego tekstu, a zaszyfrowany tekst, a błąd podczas próby do odszyfrowania: "openssl_private_decrypt(): kluczowy parametr nie jest prawidłowym kluczem prywatnym"

Najwyraźniej mam problem z tworzeniem klucza prywatnego. Dokładnie przeszukałem internet i nie udało mi się go naprawić, mimo że zaimplementowałem prosty kod, który wydaje się działać dla wszystkich.

Dzięki z góry, Elie Zeitouni

+0

Czy sprawdziłeś wartość zwrotu funkcji? – doptimusprime

Odpowiedz

2

myślę, że masz łatwiej z phpseclib, a pure PHP RSA implementation. Poniższy przykład utworzy 1024-bitowy prywatny/publiczny klucz RSA:

<?php 
include('Crypt/RSA.php'); 

$rsa = new Crypt_RSA(); 

extract($rsa->createKey()); 

echo $privatekey . '<br/>' . $publickey; 
?> 
+0

Dzięki! Właśnie rozwiązałem mój problem :) –

5

wiem, że to było jakiś czas i może masz już rozwiązany, ale myślę, że moja odpowiedź może być pomocne dla innych ludzi, którzy borykają się z tym samym problemem (jak ja).

Jeśli więc spojrzysz na dokumentację openssl_pkey_export(), możesz zauważyć, że wymaga ona czterech różnych parametrów. Jeśli spojrzymy na twoją drugą implementację, zobaczymy, że dostarczyłeś tylko trzy.

openssl_pkey_export ($ res, $ privKey, NULL);

Byłoby równie dobrze, gdyby tylko twój serwer miał odpowiednie zmienne środowiskowe dla OPENSSL_CONF. Łączenie się z plikiem openssl.cnf, który jest podany w pliku README-SSL.txt, który jest pobrany za pomocą XAMPP, jest wymagany do korzystania z funkcji CSR i generowania kluczy z PHP.

Aby użyć funkcji CSR i generowania kluczy z PHP, należy zainstalować plik openssl.cnf. Zawarliśmy przykładowy plik, który można wykorzystać w tym celu w tym folderze obok tego pliku readme.

Z tego powodu, tak jak to było z openssl_pkey_new($config); należy utworzyć tablicę asocjacyjną zawierającą config => „/path/to/openssl.cnf”. Podobnie jak to:

openssl_pkey_export($res, $privKey, NULL, $config); 

Chciałbym również dodać, że ścieżka OpenSSL w moim przypadku jest wewnątrz:

C: \ xampp \ php \ Extras \ OpenSSL \ openssl.cnf

W tym miejscu można również znaleźć plik README-SSL.txt, który zawiera szczegółowe informacje na temat konfiguracji OPENSSL.

Mam nadzieję, że to pomaga. :)

3

Uderzyłem się wokół głowy, dzięki czemu mogłem pracować na Windows 10 z Xampp php 5.5. Ostatecznie uznano, że powyższa odpowiedź na tabone była we właściwym kierunku, Z WYJĄTKIEM formatu ścieżki, która ma być przekierowana do przodu!

C:/xampp/php/extras/openssl/openssl.cnf 

Mam nadzieję, że to komuś pomaga.

1

use: openssl_pkey_export_to_file ($ result, 'privkey.pem', null, $ config);

Powiązane problemy