Artykuły na każdy temat

[PHP] Szyfrowanie danych przy pomocy XOR

Dodano 23.10.2013r. o 02:21
Drobny wpis dla osób, które twierdzą, że w PHP nie ma praktycznego wykorzystania operatora bitowego XOR. W pierwszym przykładzie wykorzystany został pojedynczy znak jako klucz i wygląda to następująco:
Kod:
<?php
$key 0x61// ASCII -> a

// Example string (ASCII array)
for($h 0$h 128; ++$h)
{
 $data .= chr($h);
}

$crypted c($key$data);
$decrypted c($key$crypted);

if($decrypted === $data)
{
 echo 'Everything is ok';
 // var_dump($data, $crypted, $decrypted);
}

function c($key$data)
{
 if(empty($data))
 {
  return false;
 }
 else
 {
  // echo '<pre>';

  for($h 0$length strlen($data); $h $length; ++$h)
  {
   // echo '<span style="color: red">'.ord($data[$h]).'</span> - <span style="color: green">0x'.dechex(ord($data[$h])).'</span> - <span style="color: blue">'.$data[$h].'</span><br>';
   $c .= chr(ord($data[$h]) ^ $key);
  }

  // echo '</pre>';

  return $c;
 }
}
?>
oraz wersja lekko zmodyfikowana gdzie klucz składa się z 32 elementów:
Kod:
<?php
// Randomly generated key
$key = array(266610254819050113109888110412188462367531185885122177124575511678871113);

// abcdefghijklmnopqrstuvwxyz * 4
for($h 0$h 104; ++$h)
{
 $data .= chr(97 + ($h 26));
}

$crypted c($key$data);
$decrypted c($key$crypted);

if($decrypted === $data)
{
 echo 'everything is ok';
 var_dump($data$crypted$decrypted);
}

function c($key$data)
{
 if(empty($data))
 {
  return false;
 }
 else
 {
  for($h 0$length strlen($data), $how count($key); $h $length; ++$h)
  {
   $c .= chr(ord($data[$h]) ^ $key[$h $how]);
  }

  return $c;
 }
}
?>
Oczywiście można pójść jeszcze dalej i pokombinować np. z datą utworzenia pliku jako dodatkową zmienną, która komplikuje próby odczytania wiadomości metodą brute force. Możliwości jest tak wiele jak szeroka jest wyobraźnia. W przypadku przechowywania klucza to wygodnie będzie trzymać tą np. tablicę w jakimś pliku przy określonym formacie np. plain/text, JSON, XML, CVS lub wykorzystać SQL w zależności od potrzeb. Przy małych gabarytach szyfrowanych danych wystarczy file_get_contents() i file_put_contents() jednak przy większych mogą być problemy z memory_limit stąd polecam standardowo fopen(). Na potrzeby domowe skrypt PHP powinien dać radę. W przypadku grubszych danych warto jednak przerzucić kod na język z rodziny C. Oczywiście dla wymagających osób są ciekawsze metody szyfrowania danych Smile Więcej o tym i owym można przeczytać u wuja G.

Komentarze

Publikowane komentarze są prywatnymi opiniami użytkowników serwisu. Serwis nie ponosi odpowiedzialności za treść opinii. W trosce o zachowanie poziomu dyskusji wszystkie komentarze podlegają akceptacji przed ich publikacją dlatego proszę cierpliwie czekać aż komentarz zostanie opublikowany.

Qme

Dodano 01.11.2013r. o 09:33
Nie jest to algorytm super trudny i gdyby nie klucz zawierający niealfanumeryczne znaki to by był bardzo łatwy do złamania.

Problem jest głównie taki, że można odszyfrowywać wiadomość po kawałku, dobrze by było brać pod uwagę cały klucz lub szyfrować blokowo np. tak jak jest to w algorytmie blowfish

Lollipop

Dodano 31.10.2013r. o 22:07
Zastanawiam się na ile jest bezpieczne takie "szyfrowanie". Po przeczytaniu chociażby tego mam silne wątpliwości. Możesz to jakoś skomentować?

Dodaj komentarz

Zostaw komentarz jeżeli możesz! Nie bądź przysłowiowym botem! Nie bądź obojętny! Ciebie to nic nie kosztuje, a mi sprawi uśmiech na twarzy.
Zezwolono używać: BBCode
Zabroniono używać:
znaczników HTML

(Wymagany)

(Wymagany, niepublikowany)

(Nie wymagana)

Token:

Obrazek dla bota

(Przepisz tylko cyfry!)

(Wymagana)