[PHP] Szyfrowanie RSA

0

Witam.
Chciałbym zrobić system backupu na bazę danych serwera. Jednak zastanawiam się jak go zabezpieczyć.
W jaki sposób można porządnie zaszyfrować dane kluczem publicznym, tak by dało się je odszyfrować tylko kluczem prywatnym?

//pozdrawiam pinokio999

EDIT:
poprawiłem temat.

0

użyj gotowego algorytmu szyfrowania asymetrycznego - RSA (dość wolny i względnie łatwy do złamania przy krótkich kluczach), DSA, ElGamal, ECC...

0

Coś o RSA czytałem. Ale czy przy każdym kodowanym tekście musi być tworzony nowy klucz? Bo tak zrozumiałem z tego przykładu.
http://eldoras.com/studia/algorytmy%20i%20struktury%20danych%20i/6/index.php

Potrzebuję mieć dwa klucze: jeden który siedzi na serwerze, i sobie szyfruje, a drugi który tylko ja znam. Więc nie potrzebuję każdorazowo kodować klucza, chyba że inaczej się nie da.

Dodatkowo z tego przykładu wynika, że aby odszyfrować jakiś tekst, oprócz klucza prywatnego potrzebuje też znać liczbę N..

0

musisz posiadac N (twoje modulo), E (klucz publiczny) i D (klucz prywatny).
Publiczne znane bedzie N i E. Przy kazdym kodowaniu nie musi byc tworzony nowy klucz. Wazne jest ze jak bedziesz mial E, D modulo N to nie mozesz miec innej pary E1 i D1 ktora uzywa tego samego modulo N.

DSA nie jest do szyfrowania!

0

Najlepiej po prostu skorzystaj z gotowej implementacji RSA, zadbaj tylko o to, żeby użyć możliwie długiego klucza. No i sam sobie go wygeneruj (są do tego narzędzia pod linuxa, pod windowsem pewnie też). Dostaniesz wtedy dwa gotowe klucze i nie będziesz musiał się przejmować, z czego się składają.

0

klucz nie musi byc dlugi. W praktyce spotyka sie bardzo czesto jako klucz publiczny 65537 i jest to czwarta liczba fermata ktora jest tez liczba pierwsza.Jest ten klucz czesto uzywany bo w zapisie binarnym ma tylko 2 jedynki i szybko sie poteguje. Wystarczy obejrzec zainstalowane certyfikaty w przegladarce. Spotkalem sie nawet z kluczem publicznym ktory wynosi 3.
Wazne zeby modulo N bylo dlugie.

0

Tak, czy inaczej, N też jest elementem klucza. Pytający sam stwierdza, że "coś tam czytał" i chce gotowego rozwiązania, więc raczej nie ma sensu go zarzucać szczegółami technicznymi.

Wystarczy, jak generując klucz gotowymi narzędziami wybierze klucz 2048bit, a jak jest paranoikiem to 4096.

0

Czyli sobie wygeneruję czymś klucze, dostanę to "N" i tylko szyfrować i rozszyfrowywać na luzie? :D Dzięki.

A znacie jakieś implementacje RSA pod php?

raczej nie ma sensu go zarzucać szczegółami technicznymi

Chętnie posłucham.

0
mwili napisał(a)

DSA nie jest do szyfrowania!
Racja - znowu bzdury w wiki :/ http://pl.wikipedia.org/wiki/Digital_Signature_Algorithm

@Pinokio: http://www.google.com/search?q=php+rsa, już na pierwszej stronie masz kilka implementacji. szukałeś w ogóle?
szczegóły techniczne masz na angielskiej wiki, ale nawet najprostszy algorytm RSA jest ciężki do zrozumienia, a co dopiero algorytmy oparte o krzywe eliptyczne - bez odpowiednich "podstaw" matematycznych po prostu się nie da.

0

Próbowałem utworzyć hasła programem pgp na Linuxie, jednak w pewnym momencie poprosił o hasło. Muszę to hasło wpisywać? Do czego ono służy? Dlaczego też potrzeba mu informacji o mojej osobie(tak jak by był podpisywany)? I skąd mam wziąć to N o którym mówiliśmy wcześniej?

0

PGP/GPG z tego co wiem, nie służą do tworzenia haseł, ale do szyfrowania. Za pomocą kluczy. Tworzona jest para kluczy: klucz prywatny (chroniony hasłem) i klucz publiczny. Klucze te powiązane są z twoim adresem e-mail (lub JabberID na przykład).

Powiązanie z adresem e-mail i nazwisko użytkownika służą tylko temu, aby innym, było łatwiej zarządzać kluczami. Aby mogli w swoim programie wyświetlić, że klucz:

pub   1024D/C27E20F1 2007-09-11
uid                  Marcin Badurowicz <[email protected]>
sub   1024g/972516F0 2007-09-11
sub   4096g/C6A1FAD6 2009-11-22

należy do danej osoby, a nie musieli zgadywać "a czyj u licha jest klucz C27E20F1?" (plus możliwe jest automatyczne szyfrowanie e-maila jego kluczem publicznym, na podstawie adresu odbiorcy po prostu). Plus łatwiej jest się użytkownikowi posługiwać identyfikatorem adresu e-mail, a nie identyfikatorem klucza (patrz dalej).

Zasadniczo w twojej sytuacji dane podawane przy kluczach nie mają znaczenia - ale PGP ma nieco inne zastosowania (ogólnie - ochrona poczty elektronicznej). Zachęcam do zapoznania się, może do używania, w zależności od stopnia paranoi :-)

Hasło klucza prywatnego służy do tego, by zabezpieczyć go. Nie zaszyfrujesz/odszyfrujesz niczego, dopóki nie znasz hasła klucza prywatnego. Dodatkowe zabezpieczenie na wypadek "wycieku" klucza prywatnego. Gdy taki klucz zostanie zgubiony, a nie ma hasła, ktoś może bez problemów czytać zaszyfrowaną Twoim kluczem publicznym korespondencję. Z wymaganiem hasła - ma dodatkowy problem.


Co do Twojej aplikacji - można wygenerować sobie klucz prywatny i publiczny, a następnie na serwerze szyfrować backup kluczem publicznym na przykład przez wywołanie odpowiedniego polecenia gpg z parametrami:

echo test | gpg -e -r [email protected] --armor > test.txt

generuje

-----BEGIN PGP MESSAGE----[ciach]
Version: GnuPG v1.4.9 (MingW32)

hQQOA7/FV0vGofrWEA//bVorNuEQm1VnVhYjqB2v9BWZlz8+0UYTOb5srPVaQhip
[ciach]
-----END PGP MESSAGE-----

które po rozszyfrowaniu (gpg -d test.txt) daje "test" który został wysłany przez echo. Po wpisaniu hasła klucza prywatnego oczywiście ;-)

Pod Linuksem szyfrowanie pliku możesz zrealizować przez wysłanie go do procesu PGP/GPG poleceniem cat. Nie wymaga to w ogóle interwencji użytkownika. --armor dodany tylko dla większej czytelności końcowego wyniku, nie jest niezbędny.

0

Dziękuję za te wyjaśnienia. A po co jesst chronienie klucza publicznego hasłem?
Wydaje mi się że
pgp -kg
generuje klucze. Jak wpisać klucze do tego polecenia:
echo test | gpg -e -r [email protected] --armor > test.txt
Tylko skąd mam wziąć to "N" które potrzebne jest mi do deszyfrowania? I ogólnie wolałbym robić to (szyfrować/deszyfrować) z poziomu php, bo nie wiem czy na serwerze są dostępne komendy unixowe.

0

Chronienie klucza publicznego hasłem jest bez najmniejszego sensu.

Po wygenerowaniu pary kluczy swój klucz publiczny możesz eksportować do pliku i wysłać (gdzieś). Tam się go importuje do "keyringa", nigdzie się go nie podaje na sztywno (przynajmniej tak jest w GPG, nie wiem jak w PGP dokładnie) i odwołujesz się do niego po przypisanym adresie e-mail.

Ale w ogóle - użycie PGP/GPG nie ma sensu jeżeli nie masz dostępu do odpowiedniego programu na serwerze. A "N" nie jest w przypadku tego programu istotne, jest "zaszyte" w kluczu publicznym/prywatnym i niewidoczne dla użytkownika.

Jeżeli chcesz szyfrować (kluczami) z poziomu PHP możesz na przykład spróbować użyć klasy http://pear.php.net/package/Crypt_RSA (ale ona dość prehistoryczna jest), która też ukrywa przed tobą zawiłości implementacji i potrafi używać kluczy w formacie PEM (tj. eksportować parę kluczy do formatu PEM). Nie testowałem, ale wydaje się nietrudna do użycia.

0

Przepraszam, chodziło mi o hasło dla klucza prywatnego.Czemu ono służy?
Co rozumiesz przez to że klasa "dość prehistoryczna jest".

0

Wersja stabilna ma 5 lat. Od tego czasu dużo się w PHP zmieniło. Można by się martwić o kompatybilność z przyszłymi wersjami PHP na przykład. Wersja "aktualna" jest sprzed półtora roku. Oczywiście, możliwe, że wszystko działa jak trzeba, więc nie trzeba poprawiać nic, ale można też przyjąc, że ktoś się znudził projektem ;-)

1.0.0 (stable) was released on 2005-05-11

1.2.1 (beta) was released on 2009-01-05

Niemniej, jeśli spełnia wymagania - używaj, ja tylko tak dodatkowo to zauważyłem.

A hasło klucza prywatnego chroni przed jego niepowołanym użyciem. Ktoś posiadający twój klucz prywatny mógłby czytać skierowaną do ciebie korespondencję bez problemów. Z drugiej strony - mógłby użyć twojego klucza prywatnego do podszycia się pod ciebie (podpis cyfrowy). Z hasłem - nawet jak klucz by wyciekł (mniejsza o to w jaki sposób - na przykład zgubiłeś go, bo nosisz na karteczce w portfelu) to agresor aby z niego skorzystać musi pokonać jeszcze jedną przeszkodę - hasło. U mnie na przykład ponad 20-znakowe.

0

Czyli podsumujmy. Tworząc skrypt php do odszyfrowywania oprócz klucza prywatnego muszę podać jeszcze hasło do niego?

Co myślisz o tym skrypcie?
http://eldoras.com/studia/algorytmy%20i%20struktury%20danych%20i/6/6.rar

0

Czyli podsumujmy. Tworząc skrypt php do odszyfrowywania oprócz klucza prywatnego muszę podać jeszcze hasło do niego?

Zależy od używanego systemu. PGP/GPG tak może działać, SSL tak może działać. Czy na przykład wspomniany Crypt_RSA w ogóle takie coś umożliwia, nie wiem.

Ten skrypt z eldoras.com opiera się o Crypt_RSA i jest bardziej dla celów demonstracyjnych bym powiedział. Jeśli chcesz zrozumieć jak działa RSA to przejrzenie go jest dobrym pomysłem. Ale do faktycznego zastosowania chyba wybrałbym Crypt_RSA.

1 użytkowników online, w tym zalogowanych: 0, gości: 1