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