algorytm.org

Implementacja w Php



Baza Wiedzy
wersja offline serwisu przeznaczona na urządzenia z systemem Android
Darowizny
darowiznaWspomóż rozwój serwisu
Nagłówki RSS
Artykuły
Implementacje
Komentarze
Forum
Bookmarki






Sonda
Implementacji w jakim języku programowania poszukujesz?

Algorytm XOR - Implementacja w Php
Ocena użytkownikóww: *****  / 0
SłabyŚwietny
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 );
}
?>
Komentarze
photo
0 # SiahAll 2013-04-27 22:04
Cytat:
$handle = fopen ( $plik.".coded" , 'w' );


warto zamienić na:

Cytat:
$handle = fopen ( $plik.".coded" , 'wb' );


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
Odpowiedz | Odpowiedz z cytatem | Cytować
Dodaj komentarz