Foros del Web » Programando para Internet » PHP »

[SOLUCIONADO] Contraseña .zip en php

Estas en el tema de Contraseña .zip en php en el foro de PHP en Foros del Web. Buenas noches a todos, mi problema es el siguiente, conseguí un código para hacer archivos zip, para PHP. El código funciona muy bien, pero tengo ...
  #1 (permalink)  
Antiguo 25/03/2013, 19:08
 
Fecha de Ingreso: enero-2012
Ubicación: en la casa
Mensajes: 34
Antigüedad: 12 años, 3 meses
Puntos: 0
Contraseña .zip en php

Buenas noches a todos, mi problema es el siguiente, conseguí un código para hacer archivos zip, para PHP. El código funciona muy bien, pero tengo un problema, quiero enviar archivos comprimidos con contraseña. Alguien sabe como hacerlo o tiene alguna referencia de algún otro código? no necesariamente debe ser para zip, puede ser para rar o 7z, etc.
Bueno, les dejo el código que tengo en el zipfile.php
Código PHP:
<?php 
/* 
Zip file creation class 
makes zip files on the fly... 

use the functions add_dir() and add_file() to build the zip file; 
see example code below 

by Eric Mueller 
http://www.themepark.com 

v1.1 9-20-01 
  - added comments to example 

v1.0 2-5-01 

initial version with: 
  - class appearance 
  - add_file() and file() methods 
  - gzcompress() output hacking 
by Denis O.Philippov, [email protected], http://www.atlant.ru 

*/ 

// official ZIP file format: http://www.pkware.com/appnote.txt 

class zipfile 


    var 
$datasec = array(); // array to store compressed data 
    
var $ctrl_dir = array(); // central directory 
    
var $eof_ctrl_dir "\x50\x4b\x05\x06\x00\x00\x00\x00"//end of Central directory record 
    
var $old_offset 0

    function 
add_dir($name

    
// adds "directory" to archive - do this before putting any files in directory! 
    // $name - name of directory... like this: "path/" 
    // ...then you can add files using add_file with names like "path/file.txt" 
    

        
$name str_replace("\\""/"$name); 

        
$fr "\x50\x4b\x03\x04"
        
$fr .= "\x0a\x00";    // ver needed to extract 
        
$fr .= "\x00\x00";    // gen purpose bit flag 
        
$fr .= "\x00\x00";    // compression method 
        
$fr .= "\x00\x00\x00\x00"// last mod time and date 

        
$fr .= pack("V",0); // crc32 
        
$fr .= pack("V",0); //compressed filesize 
        
$fr .= pack("V",0); //uncompressed filesize 
        
$fr .= pack("v"strlen($name) ); //length of pathname 
        
$fr .= pack("v"); //extra field length 
        
$fr .= $name
        
// end of "local file header" segment 

        // no "file data" segment for path 

        // "data descriptor" segment (optional but necessary if archive is not served as file) 
        
$fr .= pack("V",$crc); //crc32 
        
$fr .= pack("V",$c_len); //compressed filesize 
        
$fr .= pack("V",$unc_len); //uncompressed filesize 

        // add this entry to array 
        
$this -> datasec[] = $fr

        
$new_offset strlen(implode(""$this->datasec)); 

        
// ext. file attributes mirrors MS-DOS directory attr byte, detailed 
        // at http://support.microsoft.com/support/kb/articles/Q125/0/19.asp 

        // now add to central record 
        
$cdrec "\x50\x4b\x01\x02"
        
$cdrec .="\x00\x00";    // version made by 
        
$cdrec .="\x0a\x00";    // version needed to extract 
        
$cdrec .="\x00\x00";    // gen purpose bit flag 
        
$cdrec .="\x00\x00";    // compression method 
        
$cdrec .="\x00\x00\x00\x00"// last mod time & date 
        
$cdrec .= pack("V",0); // crc32 
        
$cdrec .= pack("V",0); //compressed filesize 
        
$cdrec .= pack("V",0); //uncompressed filesize 
        
$cdrec .= pack("v"strlen($name) ); //length of filename 
        
$cdrec .= pack("v"); //extra field length 
        
$cdrec .= pack("v"); //file comment length 
        
$cdrec .= pack("v"); //disk number start 
        
$cdrec .= pack("v"); //internal file attributes 
        
$ext "\x00\x00\x10\x00"
        
$ext "\xff\xff\xff\xff"
        
$cdrec .= pack("V"16 ); //external file attributes  - 'directory' bit set 

        
$cdrec .= pack("V"$this -> old_offset ); //relative offset of local header 
        
$this -> old_offset $new_offset

        
$cdrec .= $name
        
// optional extra field, file comment goes here 
        // save to array 
        
$this -> ctrl_dir[] = $cdrec


    } 


    function 
add_file($data$name

    
// adds "file" to archive 
    // $data - file contents 
    // $name - name of file in archive. Add path if your want 

    

        
$name str_replace("\\""/"$name); 
        
//$name = str_replace("\\", "\\\\", $name); 

        
$fr "\x50\x4b\x03\x04"
        
$fr .= "\x14\x00";    // ver needed to extract 
        
$fr .= "\x00\x00";    // gen purpose bit flag 
        
$fr .= "\x08\x00";    // compression method 
        
$fr .= "\x00\x00\x00\x00"// last mod time and date 

        
$unc_len strlen($data); 
        
$crc crc32($data); 
        
$zdata gzcompress($data); 
        
$zdata substrsubstr($zdata0strlen($zdata) - 4), 2); // fix crc bug 
        
$c_len strlen($zdata); 
        
$fr .= pack("V",$crc); // crc32 
        
$fr .= pack("V",$c_len); //compressed filesize 
        
$fr .= pack("V",$unc_len); //uncompressed filesize 
        
$fr .= pack("v"strlen($name) ); //length of filename 
        
$fr .= pack("v"); //extra field length 
        
$fr .= $name
        
// end of "local file header" segment 

        // "file data" segment 
        
$fr .= $zdata

        
// "data descriptor" segment (optional but necessary if archive is not served as file) 
        
$fr .= pack("V",$crc); //crc32 
        
$fr .= pack("V",$c_len); //compressed filesize 
        
$fr .= pack("V",$unc_len); //uncompressed filesize 

        // add this entry to array 
        
$this -> datasec[] = $fr

        
$new_offset strlen(implode(""$this->datasec)); 

        
// now add to central directory record 
        
$cdrec "\x50\x4b\x01\x02"
        
$cdrec .="\x00\x00";    // version made by 
        
$cdrec .="\x14\x00";    // version needed to extract 
        
$cdrec .="\x00\x00";    // gen purpose bit flag 
        
$cdrec .="\x08\x00";    // compression method 
        
$cdrec .="\x00\x00\x00\x00"// last mod time & date 
        
$cdrec .= pack("V",$crc); // crc32 
        
$cdrec .= pack("V",$c_len); //compressed filesize 
        
$cdrec .= pack("V",$unc_len); //uncompressed filesize 
        
$cdrec .= pack("v"strlen($name) ); //length of filename 
        
$cdrec .= pack("v"); //extra field length 
        
$cdrec .= pack("v"); //file comment length 
        
$cdrec .= pack("v"); //disk number start 
        
$cdrec .= pack("v"); //internal file attributes 
        
$cdrec .= pack("V"32 ); //external file attributes - 'archive' bit set 

        
$cdrec .= pack("V"$this -> old_offset ); //relative offset of local header 
//        echo "old offset is ".$this->old_offset.", new offset is $new_offset<br>"; 
        
$this -> old_offset $new_offset

        
$cdrec .= $name
        
// optional extra field, file comment goes here 
        // save to central directory 
        
$this -> ctrl_dir[] = $cdrec
    } 

    function 
file() { // dump out file 
        
$data implode(""$this -> datasec); 
        
$ctrldir implode(""$this -> ctrl_dir); 

        return 
            
$data
            
$ctrldir
            
$this -> eof_ctrl_dir
            
pack("v"sizeof($this -> ctrl_dir)).     // total # of entries "on this disk" 
            
pack("v"sizeof($this -> ctrl_dir)).     // total # of entries overall 
            
pack("V"strlen($ctrldir)).             // size of central dir 
            
pack("V"strlen($data)).                 // offset to start of central dir 
            
"\x00\x00";                             // .zip file comment length 
    



?>
  #2 (permalink)  
Antiguo 25/03/2013, 19:15
Colaborador
 
Fecha de Ingreso: mayo-2008
Ubicación: $MX['VZ']['Xalapa']
Mensajes: 3.005
Antigüedad: 16 años
Puntos: 528
Respuesta: Contraseña .zip en php

Hasta donde sé, no es posible; si acaso, ejecutar un comando para descomprimir el zip usando el descompresor externo a php

echo shell_exec('unzip -P password file.zip');
  #3 (permalink)  
Antiguo 25/03/2013, 19:17
Avatar de emprear
Colaborador
 
Fecha de Ingreso: junio-2007
Ubicación: me mudé
Mensajes: 8.388
Antigüedad: 16 años, 10 meses
Puntos: 1567
Respuesta: Contraseña .zip en php

No sé si hay una clase para eso, los métodos que he visto comprimen el qrchivo utilizando comandos del sistema

http://thomashunter.name/blog/genera...les-using-php/

http://www.kirupa.com/forum/showthre...cted-ZIP-files

Lo cual no es siempre posible dependiendo de la configuración del servidor

Saludos
__________________
La voz de las antenas va, sustituyendo a Dios.
Cuando finalice la mutación, nueva edad media habrá
S.R.
  #4 (permalink)  
Antiguo 26/03/2013, 06:44
 
Fecha de Ingreso: enero-2012
Ubicación: en la casa
Mensajes: 34
Antigüedad: 12 años, 3 meses
Puntos: 0
Respuesta: Contraseña .zip en php

Pero como hacer en caso de que sean 4 archivos que debo comprimir?
Este metodo me funciono:
Código PHP:
<?php echo system('zip -P pass file.zip file.txt'); ?>
Corrección:
Esta es la forma de hacerlo:
Código PHP:
shell_exec('zip -qjP <password> <archive> <file1> <file2> ... <file_n>'); 
Una ultima pregunta como encitar el contenido del zip?

Última edición por diego007; 26/03/2013 a las 07:14
  #5 (permalink)  
Antiguo 26/03/2013, 09:13
Avatar de emprear
Colaborador
 
Fecha de Ingreso: junio-2007
Ubicación: me mudé
Mensajes: 8.388
Antigüedad: 16 años, 10 meses
Puntos: 1567
Respuesta: Contraseña .zip en php

Cita:
Iniciado por diego007 Ver Mensaje
Pero como hacer en caso de que sean 4 archivos que debo comprimir?
Este metodo me funciono:
Código PHP:
<?php echo system('zip -P pass file.zip file.txt'); ?>
Corrección:
Esta es la forma de hacerlo:
Código PHP:
shell_exec('zip -qjP <password> <archive> <file1> <file2> ... <file_n>'); 
Una ultima pregunta como encitar el contenido del zip?
Si me traducís el término "encintar" a lo mejor tengo una idea

Saludos
__________________
La voz de las antenas va, sustituyendo a Dios.
Cuando finalice la mutación, nueva edad media habrá
S.R.
  #6 (permalink)  
Antiguo 27/03/2013, 13:28
 
Fecha de Ingreso: enero-2012
Ubicación: en la casa
Mensajes: 34
Antigüedad: 12 años, 3 meses
Puntos: 0
Respuesta: Contraseña .zip en php

Perdón emprear, me equivoque, lo que quería decir era Encriptar el archivo. Por ejemplo 7zip en windows tiene la opción de encitar el contenido, lo que permite no ver los archivos que hay dentro del zip hasta poner la contraseña.
  #7 (permalink)  
Antiguo 27/03/2013, 14:02
Avatar de emprear
Colaborador
 
Fecha de Ingreso: junio-2007
Ubicación: me mudé
Mensajes: 8.388
Antigüedad: 16 años, 10 meses
Puntos: 1567
Respuesta: Contraseña .zip en php

encontré la forma con winrar pero no con 7zip
rar a -hp[contraseña] archivo.rar archivo/listadearchivos

Para 7zip encontré algo
http://www.dotnetperls.com/7-zip-examples
buscá dónde dice
Header encryption: y lo referido al parámetro -mhe,

momento, se hace asi, sacado del chm de 7zip
-p (set Password) switch
Specifies password.

Syntax
-p{password}

{password}
Specifies password.
Examples
7z a archive.7z -psecret -mhe *.txt

compresses *.txt files to archive.7z using password "secret". Also it encrypts archive headers (-mhe switch), so filenames will be encrypted.

efectivamente es el parámetro -mhe
Saludos
__________________
La voz de las antenas va, sustituyendo a Dios.
Cuando finalice la mutación, nueva edad media habrá
S.R.

Etiquetas: contraseña, zip
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 05:15.