Nadesłany przez Mateusz Płaczek, 20 lutego 2013 18:32
Kod przedstawiony poniżej przedstawia główną część rozwiązania problemu.Pobierz pełne rozwiązanie.
xor.php:
<?PHP
/*
* PHP v. 5
*
* @autor: Mateusz Płaczek <mateusz.placzek@gmail.com>
* @category: Cryptography (XOR)
* @date: 13.02.2013
*
* www.algorytm.org
*
* Plik zawiera trzy funkcje potrzebne do szyfrowania i
* deszyfrowania plików algorytmem xor
*
*/
// przykład wykorzystania
#$haslo = 'vpQR0%FAoHKvlJMi';
// szyfrowanie i deszyfrowanie plików
#if ( ! xor_file ( 'plik.txt' , $haslo , 'plik.coded' ) ) echo "PROBLEM podczas szyfrowania pliku!";
#if ( ! xor_file ( 'plik.coded' , $haslo , 'plik2.txt' ) ) echo "PROBLEM podczas deszyfrowania pliku!";
// Szyfruje pojedyńczy znak za pomocą algorytmu Xor
function xor_char ( $char , $hash )
{
return chr ( ord ($char) ^ ord ( $hash ) );
}
// Xoruje ciąg znaków za pomocą hasła
function xor_string ($string , $password)
{
$password = str_split ($password);
$string = str_split ($string);
$length = count ( $password );
foreach ( $string as $key => $char )
{
$string [$key] = xor_char ( $char , $password [ ($key % $length) ] );
}
unset( $password , $length );
$string = implode ( '' , $string );
return $string;
}
// Szyfruje i deszyfruje plik za pomocą algorytmu Xor
# $plik - Plik do zakodowania
# $password - hasło kodujące
# $new_file - (Opcjonalne) - nazwa dla pliku wynikowego. W przypadku false plik oryginalny jest zastąpiony przez plik wynikowy.
function xor_file ( $plik , $password , $new_file = false )
{
if ( ! file_exists ( $plik ) ){
echo "Plik do szyfrowania nie istnieje.";
return false;
}
if ( ! $read = file_get_contents($plik, FILE_BINARY ) ){
echo "Nie można odczytać zawartości pliku albo jest pusty.";
return false;
}
// Xorowanie zawartości pliku
$write = xor_string ( $read , $password);
if ( strlen($read) != strlen($write) ){
echo "wystąpił błąd podczas Xorowania pliku.";
return false;
}
unset ($read); // czyszczenie pamięci
// otwarcie nowego pliku do zapisu
$handle = fopen ( $plik.".coded" , 'w' );
if ( ! fwrite ( $handle , $write) ){
echo "Błąd podczas zapisu danych.";
return false;
}
// dalsze czyszczenie pamięci
fclose ( $handle );
unset ( $write );
// ustalanie nazwy nowego pliku
// wykonanie tego na koniec całej funkcji maksymalnie zabezpiecza
// plik oryginału przed przypadkowym usunięciem w wypadku gdy coś pójdzie nie tak.
if ( $new_file === false )
{
unlink ( $plik );
$new_file = $plik;
}
return rename ( $plik.".coded" , $new_file );
}
?>


warto zamienić na:
Cytat:
aby zaznaczyć, że pracujemy z plikiem binarnym.
Ma to szczególne znaczenie. PHP ma wbudowane dużo udogodnień i to które dotyczy automatycznego zmieniania znaków końca linii dla Windows może sprawić że plik nie będzie do odszyfrowania.
Dlatego dostawiłem flagę b dla pliku binarnego. Żadnych zmian znaków końca linii ;)
Znaki końca linii w różnych systemach operacyjnych:
nix: \n
win: \r\n
mac: \r