Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: szyfrowanie RC4
Forum PHP.pl > Forum > PHP
Cathan
Witam
Mam pytanie.
Musze zaszyfrowac string za pomoca RC4 - i nie bylo by tak zle, gdyby nie fakt - iz klucz jest szyfrowany sha1. php zwraca problem z dlugośćią stringa - sha daje 40 obslugiwany jest 32

a na php.net jestraczej srednia rada
Cytat
Avoid using string representations hashes - md5() or sha1() - because hex encoding uses a set of only 16 characters [0-9a-f], which is equivalent to 4 bits, and thus halve the strength of your encryption: 4 x 32 = 128-bit.


a koniecznie klucz musi byc szyfrowany przez sha1

Jak rozwiazać taki problem??
hawk
Może czegoś tu nie rozumiem, ale jeżeli klucz jest szyfrowany przez sha1, to nic się nie da zrobić. Bo sha1 to funkcja hashująca i nie da się już odzyskać tego klucza. A klucz, jak sama nazwa wskazuje, jest w szyfrowaniu kluczowy worriedsmiley.gif.
Cathan
No moj blad tongue.gif - w opisie postu napisane jest poprawnie. biggrin.gif Chodzi o to, ze klucz jest wlasnie tworzony przez sha1 ktora zdecydowanie jest funkcja hashujaca - jednak za kazdym razem zwraca identyczna wartosc dla danej zmiennej , jednak ja nie chce klucza odczytywac - bede korzystal z niego jush po hashowaniu - tylko to co za pomoca tego klucza zaszyfruje przez RC4

skrypt na php.net to jest cos takiego
  1. <?php
  2.    $key = &#092;"this is a secret key\";
  3.    $input = &#092;"Let us meet at 9 o'clock at the secret place.\";
  4.  
  5.    $td = mcrypt_module_open('tripledes', '', 'ecb', '');
  6.    $iv = mcrypt_create_iv (mcrypt_enc_get_iv_size($td), MCRYPT_RAND);
  7.    mcrypt_generic_init($td, $key, $iv);
  8.    $encrypted_data = mcrypt_generic($td, $input);
  9.    mcrypt_generic_deinit($td);
  10.    mcrypt_module_close($td);
  11. ?>


a klucz normalnie hashujemy zdaje sie tak

  1. <?php
  2.  
  3. $key = &#092;"fraza\";
  4. $key = sha1($key);
  5.  
  6. ?>



Jak przerobic kod z php.net , aby dał sobie rade z zaszyfrowaniem $input metoda RC4 z takim wlasnie kluczem generowanym za pomoca sha1?questionmark.gif

Delphi sobie dalo rade sad.gif i teraz musze sie meczyc tongue.gif
( zakladam oczywiscie ze wyniki szyfrowanie bede identyczne:P - prawda worriedsmiley.gif questionmark.gif )

Pozdrawiam
orson
witam ...

albo mi się wydaje albo zmiana key na sha1(key) wystarczy żeby szyfrować przez hasło w sha1 ... potem wystarczy zmienić wywołanie mcrypt_generic($td, $input); na mcrypt_generic(MCRYPT_RC4, $input); i teoretycznie to wystarczy ... wszystko jest opisane w manualu.

pozdrawiam
Cathan
Dla zainteresownaych - info

DLEPHI ZWRACA CO INNEGO NIZ php

sadsmiley02.gif

porazka

orson - teoretycznie tak, ale w praktyce php wali komunikatem:

Warning: mcrypt_generic_init() [function.mcrypt-generic-init]: Key size too large; supplied length: 40, max: 32 in

Natomiast w delphi wszystko jest ok.
Moral z tego taki - nie da sie dobrac do wpisow w bazie kodowanych przez delphi - a bynajmniej mnie ten temat przerosl sad.gif
Imperior
Nie ma czegoś takiego jak "DLEPHI ZWRACA CO INNEGO NIZ php". Program napisany w Delphi zwraca to co ma, czyli jak go zaprojektowano. Poszukaj innych implementacji algorytmów. (lub opcji w obecnych)
Cathan
Moje zalozenie bylo takie, ze jesli w delphi inicjujemy string dla klucza z jakiejs zmiennej z pomoca sha1 i szyfrujemy za jego pomoca przez RC4 to algorytmy zarowno sha1 oraz RC4 sa takie same zarowno w php jak i delphi. Fakt ze w Delphi zostal uzyty komponent, jednak wyniki zwraqcane sa całkowicie inne. w php dostajemy straszne krzaki cos jak "qJóŤełĹ])WJr -" natomiast zwroty w delphi sa "cywilizowane" biggrin.gif i wygladaja np. tak "F9zx==", jak dla mnie sa to całkowicie inne rzeczy i nie ma opcji zeby jakkolwiek je porownac.
Po przeanalizowaniu dokladnie wszystkich procedur w komponentach w deplphi prawdopodobnie dalo by sie uzyskac taki sam wynik w php jednak nie niestety na to czasu, (ani chyba wiedzy tongue.gif )

Na szczescie pojawil sie plan B rozwiaznia problemu i jush wszystko jest O.K tongue.gif

Pozdrawiam
orson
witam ...

ale w przykładzie który podałeś użyto innego szyfrowania niż RC4 ... może długość klucza jest uwarunkowana algorytmem (raczej na pewno) ... zmień funkcję na rc4 zaszyfruj coś (string 123) krótkim hasłem (string 123) i sprawdz czy to samo dostaniesz w delphi ... jeżeli tak to sprawdź na długim haśle (np. sha1('123'); ) i jeżeli nadal będzie że za długie to ... obcinaj biggrin.gif ... przecież jeżeli w delphi obetniesz i w php obetniesz do 32 znaków to hasło jest takie samo ... więc wynik również będzie identyczny (musi - zasada szyfrowania: żeby dało się odszyfrować winksmiley.jpg ) a że wycinasz ileś znaków to przecież nie szkodzi ...

pozdrawiam
Cathan
Sprawdzałem
wlasnie w tym byl ze tak powiem główny problem
klucz, który byl krotki dawał doskonale rade, nie waliło błedami itd. Problemy powstawały przy hashowaniu poprostu string robil sie za dozy jak dla klucza prywatnego, ktorego php ustaliło na nie wiecej niz 32 znaki.

A co do Delphi to problem byl juz z przechwyceniem samego klucza. Dziwny ten jezyk tongue.gif
Nie moowiac jush o ograniczaniu go tongue.gif

Kod ktory zacytowalem na poczatku, jak napisalem pochodzil z php.net
nie chcialem w nim nic mieszac - z racji tego, ze wszystkie moje prooby obalenia 32 znakowego ograniczenia klucza padly na twarz tongue.gif

Ciekaw jestem czy da sie cos takiego wogoole zrobic w php- tak ja w delphi z kluczem hashowanym - ale bez ograniczania stringa (co mimo wszystko jest dosc sprytne musze przyznac biggrin.gif ).


Pozdrawiam
hwao
Stary temat ale trafia się na niego przez google przy specificznym problemie, więc daje rozwiązanie:

Korzystając z:
http://pear.php.net/package/Crypt_RC42/doc...ptRC42.php.html

  1. <?php
  2.  
  3. $key = "klucz";
  4.  
  5. $message = file_get_contents( 'input.txt' );
  6.  
  7. include '/Crypt/RC42.php';
  8. $rc4 = new Crypt_RC42();
  9.  
  10. $key = ( sha1( $key, true ) );
  11.  
  12. $rc4->key($key);
  13.  
  14. $message = $rc4->encrypt($message);
  15. file_put_contents( 'output.txt', $message );
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.