Artykuły na każdy temat
[PHP] Szyfrowanie danych przy pomocy XOR
<?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:
<?php
// Randomly generated key
$key = array(26, 66, 102, 54, 81, 90, 50, 113, 109, 88, 81, 104, 121, 88, 46, 23, 67, 53, 118, 58, 85, 12, 21, 77, 124, 57, 55, 11, 67, 88, 71, 113);
// 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 Więcej o tym i owym można przeczytać u wuja G.
Komentarze
Dodaj komentarz
Qme
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