Mam problem z zapisywaniem liczby typu Math_BigInteger do byte string.
Otwieram 2 pliki. Jeden taki z ktorego chce czytac po 64 bajty, kodowac je metoda RSA, konwertowac na bajty (metoda ->toBytes() ) i zapisywac do pliku.
Ten fragment kodu odpowiada za odczyt i zapis do drugiego pliku:
Kod
$nazwa_pliku = 'plik.txt';
$wskaznik_pliku = fopen ($nazwa_pliku, 'r');
$nazwa_pliku2 = 'zakodowane.txt';
$wskaznik_pliku2 = fopen ($nazwa_pliku2, 'w');
$ile_czytac = 64;
$ile_przeczytano = 0;
$rozmiar = filesize($nazwa_pliku);
while (!feof($wskaznik_pliku)){
if (($rozmiar - $ile_przeczytano) <= 0) break;
if (($rozmiar - $ile_przeczytano) < 64) $ile_czytac = ($rozmiar - $ile_przeczytano);
$word_bytes = fread($wskaznik_pliku, $ile_czytac);
$ile_przeczytano += $ile_czytac;
$word_int = new Math_BigInteger($word_bytes, '256');
// ..... tutaj odbywa się szyfrowanie i wynik jest w zmiennej $cipher_int
$cipher_bytes = $cipher_int->toBytes();
fwrite($wskaznik_pliku2, $cipher_bytes);
}
fclose($wskaznik_pliku);
fclose($wskaznik_pliku2);
$wskaznik_pliku = fopen ($nazwa_pliku, 'r');
$nazwa_pliku2 = 'zakodowane.txt';
$wskaznik_pliku2 = fopen ($nazwa_pliku2, 'w');
$ile_czytac = 64;
$ile_przeczytano = 0;
$rozmiar = filesize($nazwa_pliku);
while (!feof($wskaznik_pliku)){
if (($rozmiar - $ile_przeczytano) <= 0) break;
if (($rozmiar - $ile_przeczytano) < 64) $ile_czytac = ($rozmiar - $ile_przeczytano);
$word_bytes = fread($wskaznik_pliku, $ile_czytac);
$ile_przeczytano += $ile_czytac;
$word_int = new Math_BigInteger($word_bytes, '256');
// ..... tutaj odbywa się szyfrowanie i wynik jest w zmiennej $cipher_int
$cipher_bytes = $cipher_int->toBytes();
fwrite($wskaznik_pliku2, $cipher_bytes);
}
fclose($wskaznik_pliku);
fclose($wskaznik_pliku2);
Procedura czytania z pliku zakodowanego i zapisywania do pliku odkodowane.txt wyglada tak:
Kod
$nazwa_pliku3 = 'zakodowane.txt';
$wskaznik_pliku3 = fopen ($nazwa_pliku3, 'r');
$nazwa_pliku4 = 'odkodowane.txt';
$wskaznik_pliku4 = fopen ($nazwa_pliku4, 'w');
$ile_czytac = 64;
$ile_przeczytano = 0;
$rozmiar = filesize($nazwa_pliku3);
while (!feof($wskaznik_pliku3)){
if (($rozmiar - $ile_przeczytano) <= 0) break;
if (($rozmiar - $ile_przeczytano) < 64) $ile_czytac = ($rozmiar - $ile_przeczytano);
$cipher_bytes = fread($wskaznik_pliku3, $ile_czytac);
$ile_przeczytano += $ile_czytac;
$cipher_int = new Math_BigInteger($cipher_bytes,'256');
// ..... tutaj odbywa się deszyfrowanie i wynik jest w zmiennej $plain_int
$plain_bytes = $plain_int->toBytes();
fwrite($wskaznik_pliku4, $plain_bytes);
}
fclose($wskaznik_pliku3);
fclose($wskaznik_pliku4);
$wskaznik_pliku3 = fopen ($nazwa_pliku3, 'r');
$nazwa_pliku4 = 'odkodowane.txt';
$wskaznik_pliku4 = fopen ($nazwa_pliku4, 'w');
$ile_czytac = 64;
$ile_przeczytano = 0;
$rozmiar = filesize($nazwa_pliku3);
while (!feof($wskaznik_pliku3)){
if (($rozmiar - $ile_przeczytano) <= 0) break;
if (($rozmiar - $ile_przeczytano) < 64) $ile_czytac = ($rozmiar - $ile_przeczytano);
$cipher_bytes = fread($wskaznik_pliku3, $ile_czytac);
$ile_przeczytano += $ile_czytac;
$cipher_int = new Math_BigInteger($cipher_bytes,'256');
// ..... tutaj odbywa się deszyfrowanie i wynik jest w zmiennej $plain_int
$plain_bytes = $plain_int->toBytes();
fwrite($wskaznik_pliku4, $plain_bytes);
}
fclose($wskaznik_pliku3);
fclose($wskaznik_pliku4);
Plik zaszyfrowany ma zawsze rozmiar wielokrotnosci 64 bajtów i jest on mniejszy od pliku wejsciowego (plik.txt).
Np: plik.txt - 100 bajtow, zaszyfrowany.txt - 64 bajty
plik.txt - 150 bajtow, zaszyfrowany.txt - 128 bajtów
Dlaczego??
Dodam, że małe pliki ( < 64 bajty) szyfruje i deszyfruje mi dobrze.
Potrafi ktos pomóc?? Bede wdzieczny za kazda sugestie.