Potreboval by som poradiť ohľadom zápisu znakov formátu ASCII.
Mám súbor, do ktorého som si vygeneroval 255 znakov sústavy ASCII. A cez php skript načítavam iné znaky (bežné (napr. v obyčajnom texte)) a tie následovne porovnám číselnou metódou, aby som získal nejaký vygenerovaný znak v rozsahu 0-254 (255). A takýto vygenerovaný znak potom zapisujem do súboru. Teoreticky by to malo pracovať správne, pretože skript len hľadá náhradu určitého znaku, ktorý potom zapíše do súboru, aby vznikol zašifrovaný súbor.
Lenže som to odskúšal na EULe, ktorá mala 19 kB a vznikol z toho zašifrovaný súbor o veľkosti 5 kB.
Potom som skúšal rôzne spôsoby, ako by som to mohol opraviť, ale nič ma nenapadlo. Niektoré znaky proste vynechá a potom prestane zapisovať úplne.
PS: Pre čítanie i zápis súborov používam binárny mód.
<HTML>Binarni mod neslouzi k ucelum cteni/zapisu asii znaku
dej sem zdrojovy kod at jsme moudrejsi</HTML>
doporucuju v tomhle pripade se vyhnout prvnim 32 ascii znakum
problem je ze znak ^Z (ascii je to asi 26) je znak pro ukonceni souboru
Nemôžem sa vyhnúť zapisovaniu prvých 32 ascii znakov, pretože to mám prispôsobené tak, aby sa zapísal každý možný znak z rady ASCII a je to teda pre 255 znakov. Ak by som sa pokúšal zašifrovať súbor, ktorý by obsahoval znaky z rady prvých 32, tak dešifrovanie by bolo nemožné.
Richard,
ja som binárny mód zápisu/čítania nepoužil s úmyslom zapisovania ASCII zankov, ale kvôli tomu, že táto metóda je využiteľná na systémoch Windows, Unix "nerozoznáva textové a binárne súbory".
Myslel som si, že použitím binaárneho módu dosiahnem toho, aby každý zapisovaný znak sa zapísal, resp. prečítal správne (mám tým na mysli, aby nevznikali určité nezmyselnosti, s ktorými som sa počas vývoju tohoto skriptu stretol). Ale ako vidím, ani toto nepomohlo. Taktiež mám s týmto zápisom problém v C++, ale tam sa to našťastie dá riešiť hexadecimálnym zápisom.
<HTML>bez zdrojaku tu budu tezko spekulovat co mas spatne</HTML>
Richard,
ale zdroják má 2178 B a tak neviem, či by bolo vhodné ho celý uverejniť a navyše tie funkcie používam na šifrovanie, a tak by to nebolo vhodné ohľadom bezpečnosti mojich dát.
Ale ak to vážne potrebuješ k dedukcii, tak ho zverejním alebo pošlem na email.
<HTML>Ale pokud ctu spravne tak to pouzivas na nejake sifrovani a proto by bylo dobre pracovat se skutecne binarnim souborem.. hexadecimalni zapis neni problem ani v php stejne jako prace s binarnimi daty. Mrkni na funkce pack() a unpack()</HTML>
Tu je kompletný zdrojový kód:
<?php
if($fr = fread(fopen("!bd_on.dat","rb"), filesize("!bd_on.dat")))
{
function getFileLines($file)
{
if($fo = fopen($file,"rb"))
{
$fr = fread($fo, filesize($file));
fclose($fo);
$fr = str_replace("\r","",$fr);
return explode("\n",$fr);
}
else
{
return null;
}
}
function getCharPosInCrpt($char,$fr)
{
$toRet = -1;
for($i=0;$i<strlen($fr);$i++)
{
if($fr[$i] == $char)
{
$toRet = $i;
}
}
return $toRet;
}
function generateCrypt($chp,$lnp,$lip,$fr)
{
$lnp = isset($lnp) ? $lnp : 0;
$lip = isset($lip) ? $lip : 0;
if($chp != -1)
{
$x1 = $chp + $lnp + $lip;
$x2 = $x1 + floor($x1/strlen($fr))*strlen($fr);
return $x2;
}
else
{
return "";
}
}
function getCharInCrpt($chp,$fr)
{
$toRet = "";
for($i=0;$i<strlen($fr);$i++)
{
if($i == $chp)
{
$toRet = $fr[$i];
}
}
return $toRet;
}
function cryptFile($file,$lines,$fr)
{
if($fo = fopen($file,"wb"))
{
for($i=0;$i<count($lines);$i++)
{
$new_line = "";
for($y=0;$y<strlen($lines[$i]);$y++)
{
if(($crp = getCharPosInCrpt($lines[$i][$y],$fr)) != -1)
{
if(($chc = generateCrypt($crp,$i,$y,$fr)) != "")
{
$new_line .= getCharInCrpt($chc,$fr);
}
else
{
echo "Char ".$lines[$i][$y]." cannot be crypted (using space value)! (cannot create crypt char)<br />";
$new_line .= " ";
}
}
else
{
echo "Char ".$lines[$i][$y]." cannot be crypted (using space value)! (not found in crypt)<br />";
$new_line .= " ";
}
}
fwrite($fo,$new_line);
}
fclose($fo);
}
else
{
echo "Cannot open output file $file!";
}
}
cryptFile("zasifrovany.txt",getFileLines("normalny.txt"),$fr);
}
else
{
echo "Cannot open string file!";
}
?>
Trošku neprehľadné, ale čo už (po dlhšom náhľade sa tomu dá porozumieť, snažil som sa tie funkcie nazvať prijateľne :) ).
"
Autor: Matej Tomčík (matejtomcik.xf.cz)
Richard, ale zdroják má 2178 B
"
zdojak.php -> zdrojak.txt -> LINK zdrojak.txt :)
- chybi ti tam error_reporting, to ti vypise nejakou chybovou hlasku, kdyz neco nejde.
http://www.volny.cz/peter.mlich/www.htm#msub11
guestbook 5k .txt
(jak tam jsou zavinace pred prikazy, tak ty smazat. To je prave proti zobrazeni chyby u toho meho)
- "!bd_on.dat" nazev souboru s vykricnikem mi prijde jako nedobry, muze to vsak fungovat
"Lenže som to odskúšal na EULe, ktorá mala 19 kB a vznikol z toho zašifrovaný súbor o veľkosti 5 kB."
To je klasicky problem. Neco odradkuje, nektery znak je ridici, smaz cely radek a tak. Pak ti pulku odmaze :)
Kazdopadne pres file by se to melo zapsat dobre (kdyz to dokaze spravne zapsat obrazek v pri pouziti nahradni fukce pro copy/move_uploaded pres fopen). Videl bych spise problem v konstrukci retezce, mozna. Co treba pouzivat funkce ord() chr() pro zapis znaku po znaku?
Jinak na prvni pohled neumim rici. Jeste bych zkusil souboru vnutit nejakou header() , ale to by nemelo mit vliv, pokud to nechces zobrazit na obrazovku.
co treba prostudovat cz.php.net/fopen , fclose, fread, fwrite a priklady?
ta funkce z tech foto vypada takto:
function copy2($photo1,$photo2)
{
//$Xdir = get_cfg_var("upload_tmp_dir");
//upload_max_filesize
$f1 = fopen($photo1,"r");
$d1 = fread($f1, filesize($photo1));
$f2 = fopen($photo2,"w");
fwrite($f2, $d1, filesize($photo1));
fclose($f1);
fclose($f2);
}
kde pak zkousim
@move_uploaded_file($photo1,$photo2) || @copy($photo1,$photo2) || @copy2($photo1,$photo2);