[PHP] Encrypten van een variabele corrumpeerd bestand

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • Koffie
  • Registratie: Augustus 2000
  • Laatst online: 13:26

Koffie

Koffiebierbrouwer

Braaimeneer

Topicstarter
Ik heb via google een soort encrypt/decrypt scriptje gevonden.
Dit scriptje is meer dan geboeg voor mij, dus wil ik deze gaan gebruiken.
Dit is het script:

PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
<?php

# $ralphabet = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz1234567890 \\!,.:;?~@#\$%^&*()_+-=][}{/><\"'`|";
$ralphabet = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz1234567890 \\!/_-,.";
$alphabet = $ralphabet . $ralphabet;

function encrypt ($password,$strtoencrypt) 
{

    $strtoencrypt = str_replace("\t","[tab]",$strtoencrypt);
    $strtoencrypt = str_replace("\n","[new]",$strtoencrypt);
    $strtoencrypt = str_replace("\r","[ret]",$strtoencrypt);

    global $ralphabet;
    global $alphabet;

    for( $i=0; $i<strlen($password); $i++ )
    {
        $cur_pswd_ltr = substr($password,$i,1);
        $pos_alpha_ary[] = substr(strstr($alphabet,$cur_pswd_ltr),0,strlen($ralphabet));
    }

    $i=0;
    $n = 0;
    $nn = strlen($password);
    $c = strlen($strtoencrypt);

    while($i<$c)
    {
        $encrypted_string .= substr($pos_alpha_ary[$n],strpos($ralphabet,substr($strtoencrypt,$i,1)),1);
 
        $n++;
        if($n==$nn) $n = 0;
        $i++;
    }

    return $encrypted_string;
}



function decrypt ($password,$strtodecrypt) 
{
    global $ralphabet;
    global $alphabet;

    for( $i=0; $i<strlen($password); $i++ )
    {
        $cur_pswd_ltr = substr($password,$i,1);
        $pos_alpha_ary[] = substr(strstr($alphabet,$cur_pswd_ltr),0,strlen($ralphabet));
    }

    $i=0;
    $n = 0;
    $nn = strlen($password);
    $c = strlen($strtodecrypt);

    while($i<$c) 
    {
        $decrypted_string .= substr($ralphabet,strpos($pos_alpha_ary[$n],substr($strtodecrypt,$i,1)),1);
 
        $n++;
        if($n==$nn) $n = 0;
        $i++;
    }

    $decrypted_string = str_replace("[tab]","\t", $decrypted_string);
    $decrypted_string = str_replace("[new]","\n", $decrypted_string);
    $decrypted_string = str_replace("[ret]","\r", $decrypted_string);

    return $decrypted_string;
}

?>


Vervolgens heb ik een FTP script geschreven.
Deze logt in op een local FTP server, vraagt de directory inhoud op, en plaatst deze op het scherm.
De bestandsnamen zijn klikbare links. Via de link geef ik een variable door aan hetzelfde script.
Deze leest dan het bestand in z'n geheugen , en stuurt deze door naar de client.

Echter, sinds ik dus gebruik maak van het encrypt gedeelte om de url c.q. bestandsnaam te 'versleutelen' komen de bestanden corrupt binnen :?
Zet ik de versleuteling weer uit, werkt het weer naar behoren :? :? :?

Het FTP scriptje:

PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
<?php

while(list($key,$val)=each($_POST)) {  $$key = $val; }
while(list($key,$val)=each($_GET)) {  $$key = $val; }
include("crypt.php");
$pass = "ftp passw0rd";

function array_remove_key($array, $item_to_remove) 
{
    $newarray = array();
    foreach ($array as $key => $val) 
    {
        if ($key != $item_to_remove) 
        {
            $newarray[$key] = $val;
        }
    }
    return $newarray;
}


function push_file($file_name) 
{

global $pass;

$file_name = decrypt($pass, $file_name);
$ext = explode(".", $file_name);
$first = explode("/", $file_name);
$prog = array_pop ($ext);
$name = array_pop ($first);


    header("Content-type: application/octet-stream");
    header("Content-Disposition: attachment; filename=$name");
    header("Content-Transfer-Encoding: binary");

    $ftp_server = "server";
    $ftp_user_name = "user";
    $ftp_user_pass = "pass";

    $conn_id = ftp_connect("$ftp_server"); 


    if (!$conn_id) 
    { 
        echo "Ftp connection has failed!<br>";
        die; 
    }

    $login_result = ftp_login($conn_id, "$ftp_user_name", "$ftp_user_pass");

    if (!$login_result) 
    { 
        echo "Ftp connection has failed! ($login_result)<br>";
        die; 
    }



    $temp = tmpfile();
    $fget_result=ftp_fget($conn_id, $temp, "$file_name", FTP_BINARY);
    rewind ($temp);
    fpassthru($temp);
    ftp_quit($conn_id); 
    exit;
}


function show_dir() 
{

global $pass;
    print "<html><head></head><body>";

    $ftp_server = "server";
    $ftp_user_name = "user";
    $ftp_user_pass = "pass";

    $conn_id = ftp_connect("$ftp_server"); 
    if (!$conn_id) 
    { 
        echo "Ftp connection has failed!<br>";
        echo "Attempted to connect to $ftp_server<br>"; 
        die; 
    }
    else
    {
        echo "Connected to $ftp_server<br>";
    }


    $login_result = ftp_login($conn_id, "$ftp_user_name", "$ftp_user_pass");

    if (!$login_result) 
    { 
        echo "Ftp connection has failed! ($login_result)<br>";
        echo "Attempted to login to $ftp_server for user $ftp_user_name<br>"; 
        die; 
    }
    else
    {
        echo "Logged into $ftp_server, for user $ftp_user_name<br>";
    }

    $pwd = ftp_pwd($conn_id);
    echo "Present working directory is $pwd<br>";

    $dir=ftp_pwd($conn_id); 
    $list1=Array(); 
    $list2=Array(); 
    $list1=ftp_rawlist($conn_id, "$dir");
    $list2=ftp_nlist($conn_id, "$dir"); 

$i=0;

 $list1 = array_remove_key($list1, "0");

    foreach ($list1 as $item1) 
    { 
        $info = explode(" ", $item1);
        $location = explode("/", $item1);
#       0=dir/file 1=rechten 2=eigenaar 3=size 4=maand 5=dag 6=tijd 7=rest
#       print "$location[1] is een $info[0] <BR>";
        $enc_naam = encrypt($pass, $list2[$i]);
        if ($info[0] == "-") { print "<a href=\"test-ftp.php?get_file=$enc_naam\">$list2[$i]</a>     $list2[$i] is een file <BR>"; }
        if ($info[0] == "d") { print "$list2[$i] is een dir <BR>"; }
#       print "$item1 | $list2[$i] <BR>";

#       $naam = str_replace("$dir/","",$list[$i]);
#       $directory = str_replace($naam,"",$list[$i]);
#       echo $item1, "<BR>"; 
#       print "$directory <a href=\"test-ftp.php?get_file=$enc_naam\">$naam</a> <BR>\n";
        $i++; 
    }

#   foreach ($list2 as $item2)
#   {
#       $naam = str_replace("$dir/","",$item2);
#       $directory = str_replace($naam,"",$item2);
#       print "$directory en $naam is: $info[0] , $info[1] ,$info[2] ,$info[3] ,<BR>";
#       print "ik behandel $item2 <BR>";
#   }





    ftp_quit($conn_id); 
    exit;
}



if ($get_file != "")
{
    push_file($get_file);
}

else
{
    show_dir();
}

exit;

?>


Hoe kan in vredesnaam nou zo'n actie een bestand corrumperen :?
De grootte van de bestanden komen wel overeen, en er lijkt ook wel grofweg hetzelfde in te zitten:

• Excel/Word docuemtnen bevatten nog wel de text maar als je ze opent in de bijbeorende applicatie krijg je eenzelfde brij te zien alsof je 'm met notepad opent

• .EXE bestanden hebben een 'dosbox app' icoontje en startten niet meer

• .RAR bestanden zijn volgens WinRAR corrupt
• .ZIP bestanden werken als enige goed
• .ICO bestanden bevatte een brei weaar ik nix van snap, maar windows ziet ze iig niet meer als een icon file

Wie o wie kan mij helpen ? ;)


Commentaar op m'n ranzige vorm van scripten is niet nodig hoor, weet zelf ook wel dat ik er weinig van bak :P

Tijd voor een nieuwe sig..


Acties:
  • 0 Henk 'm!

  • Willem
  • Registratie: Februari 2001
  • Laatst online: 15:13
Programming & Webscripting of durfde je dat niet aan? ;)

Acties:
  • 0 Henk 'm!

  • Koffie
  • Registratie: Augustus 2000
  • Laatst online: 13:26

Koffie

Koffiebierbrouwer

Braaimeneer

Topicstarter
Kwa 'moeilijkheidsgraad' van het probleem misschien wel, kwa schaamte voor mijn prutzooi niet :+

Tijd voor een nieuwe sig..


Acties:
  • 0 Henk 'm!

  • justmental
  • Registratie: April 2000
  • Niet online

justmental

my heart, the beat

Klinkt alsof je op een of andere manier toch ascii overhaalt.

Who is John Galt?


Acties:
  • 0 Henk 'm!

  • Jaymz
  • Registratie: Januari 2000
  • Laatst online: 06:57

Jaymz

Keep on moving !

-=>> PW :)

Acties:
  • 0 Henk 'm!

  • Koffie
  • Registratie: Augustus 2000
  • Laatst online: 13:26

Koffie

Koffiebierbrouwer

Braaimeneer

Topicstarter
Een en ander even getest;

• Extra header geplaats voor 'no cache'
• Tijd van decrypten gewijzigd:

PHP:
1
2
3
4
5
if ($get_file != "") 
{ 
    $get_file = decrypt($pass, $get_file); 
    push_file($get_file); 
}

zonder resultaat

Ook heb ik geprobeerd de headers in het script naar boven te plaatsen (dus als allereerste in de function de headers, daarna pas gegoochel met variabelen).
Alles zonder resultaat :?

Tijd voor een nieuwe sig..


Acties:
  • 0 Henk 'm!

  • dirkpostma
  • Registratie: Juni 2001
  • Laatst online: 11-07-2024
Ik heb niet het hele cript/encrypt doorgespit, maar zou het niet zo kunnen zijn dat deze alleen geschikt is voor strings die alleen tekens bevat die in $ralfabet zitten?

Als je de string "bû£é" encrypt en vervolgens decrypt, komt er dan weer "bû£é" uit?

Acties:
  • 0 Henk 'm!

  • dirkpostma
  • Registratie: Juni 2001
  • Laatst online: 11-07-2024
PHP:
1
2
3
4
5
6
7
8
$str = "bû£é";
echo $str . "<br>";

$str = encrypt("bla", $str);
echo $str . "<br>";

$str = decrypt("bla", $str);
echo $str . "<br>";


Geeft als resultaat:
code:
1
2
3
bû£é
3lab
bAAA



Ofwel: alleen de tekens die in $ralphabet zitten worden goed geencrypt en gedecrypt.

Acties:
  • 0 Henk 'm!

  • Koffie
  • Registratie: Augustus 2000
  • Laatst online: 13:26

Koffie

Koffiebierbrouwer

Braaimeneer

Topicstarter
Dat is zo ja, en ik heb er ook op gecontroleerd dat het gedecrypte de juiste bestandsnaam is.
Gaat dat namelijk fout, zie ik dat ten eerste al aan de te downloaden bestandsnaam, en ten tweede bevat de inhoud van het gedownloade bestand 2 regels txt dat het gevond bestand niet bestaat op de FTP server.

Tijd voor een nieuwe sig..


Acties:
  • 0 Henk 'm!

  • dirkpostma
  • Registratie: Juni 2001
  • Laatst online: 11-07-2024
edit:
oops

Acties:
  • 0 Henk 'm!

  • Koffie
  • Registratie: Augustus 2000
  • Laatst online: 13:26

Koffie

Koffiebierbrouwer

Braaimeneer

Topicstarter
Hmmz .. ik kom er net achter dat _ELK_ gedownload bestand exact 2 bytes groter is dan het origineel :?
Sommige bestanden kunnen daar niet tegen, .ZIP files bijvoorbeeld weer wel.

Tijd voor een nieuwe sig..


Acties:
  • 0 Henk 'm!

Verwijderd

Volgens mij encrypter je met een beperkte tekenset. Dus alle bytes van 0 tot 128 gaan wel goed maar de rest komt niet meer terug.

Doe maar eens een fc /b (binaire filecompare) tussen je input en output. Want volgens mij zijn die ongelijk.


Het is volgens mij ook verstandiger om je $ralphabet uit te breiden zodat die ALLE 255 mogelijke bytes bevat.

Acties:
  • 0 Henk 'm!

  • Koffie
  • Registratie: Augustus 2000
  • Laatst online: 13:26

Koffie

Koffiebierbrouwer

Braaimeneer

Topicstarter
Doe maar eens een fc /b (binaire filecompare) tussen je input en output. Want volgens mij zijn die ongelijk.
Wat is "fc /b" :?
Ter info; PGP draait niet op *nix op Win32 bij mij
Volgens mij encrypter je met een beperkte tekenset. Dus alle bytes van 0 tot 128 gaan wel goed maar de rest komt niet meer terug.
Klopt, ik had er al het e.e.a. aan karakaters uitgesloopt, om zo te voorkomen dat die eventueel een variabele zouden vernaggelen.
Bijvoorbeeld de '?' en de '&' zaten er ook in, dan kun je dus krijgen dat er ineens zoeits komt:
index.php?file=dfwfwefewfwefew&fewfwewe?ewfewfew

En ik wist niet zeker of PHP daarvan niet op de bek zou gaan.
Verder is het gedeelte wat gecrypt word puur file en directory naam, dus karakters die uberhaupt niet kunnen/mogen in een dir/file naam hoeven er niet in ook (toch) ?

Het gaat ook fout als ik VOORDAT ik de 'push/download' functie aanroep alweer decrypt.

Tijd voor een nieuwe sig..


Acties:
  • 0 Henk 'm!

  • sjon.
  • Registratie: November 2002
  • Laatst online: 14-01-2024
als je alleen de bestandsnaam encrypt, waarom komt dat het bestand zelf fout over??
en de base64_* functies zijn geen optie? probeer anders PEAR eens, daar zitten ook een paar Crypt classes bij...

Acties:
  • 0 Henk 'm!

Verwijderd

sorry ik dacht even dat je het hele bestand encrypte ipv enkel de filename.

(enne FC == filecompare en dat werkt al op dos/win32 machines sinds dos 4.0 :) )

Acties:
  • 0 Henk 'm!

  • Koffie
  • Registratie: Augustus 2000
  • Laatst online: 13:26

Koffie

Koffiebierbrouwer

Braaimeneer

Topicstarter
Verwijderd schreef op 15 November 2002 @ 17:34:
sorry ik dacht even dat je het hele bestand encrypte ipv enkel de filename.

(enne FC == filecompare en dat werkt al op dos/win32 machines sinds dos 4.0 :) )


code:
1
2
00004C5F: 71 00
FC: ftp.doc longer than REAL.DOC


FTP.DOC = gedownload bestand
REAL.DOC = origineel bestand

Ben nu ff base64 aan het testen ;) Thx voor die tip

=[EDIT]=
Het ziet er naar uit dat Base64 z'n werk doet, thx :Y)

Tijd voor een nieuwe sig..

Pagina: 1