Problème d'encryptage (script)

Mass
Invité n'ayant pas de compte PHPfrance

09 juin 2010, 11:37

Bonjoue à tous,
J'ai trouvé ce code sur Internet qui correspond tout à fait à ce que je cherche :
function crypte_fichier($file,$code,$file_crypted){
  $lignecripte="";
  $bytes = 65536;//nombre de bytes par ligne de cryptage
  //remplit une ligne de cryptage de longueur 65536 bites
  for ($i = 0; $i <= floor($bytes/strlen($code)); $i++) $lignecripte.= $code;
  //ouvre le fichier a crypter en lecture
  //cree le nouveau fichier
 if (file_exists($file)){//verifie presence du fichier
  chmod($file,0777);//attribue tous droits
  $ancien = fopen($file, "rb");
  $nouveau = fopen($file_crypted, "wb");
  // crypt le fichier et ecrie dans le nouveau fichier par ligne de 65536 bites
  while($line = fread($ancien, $bytes)){
    $line2 = $line ^ $lignecripte;//effectue un OU EXCLUSIF (XOR) sur les bits 10011s^ 10110=00101 
    fputs($nouveau, $line2);}
  // ferme les fichiers
  fclose($ancien);fclose($nouveau);
  unlink($file);//suprimme l'ancien fichier
}}

function telecharge($nomfichier,$file_crypted){
	//entete de header precise au navigateur l'envoi d'un fichier
	header("Content-disposition: attachment; filename=$nomfichier");
	header("Content-Type: application/force-download");
	header("Content-Transfer-Encoding: binary");
	header("Content-Length: ".filesize($file_crypted));
	header("Pragma: no-cache");
	header("Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0");
	header("Expires: 0");
}

function decrypte_file($file_crypted,$code){
	$bytes = 65536; //bite par ligne
	$lignecripte="";
	$chainecrypte=$code;
	//remplit une ligne de cryptage de longueur 65536 bites
	for ($i = 0; $i <= floor($bytes/strlen($chainecrypte)); $i++) $lignecripte.= $chainecrypte;
  	// ouvre le fichier
  	$file = fopen($file, "rb");
  	while($line = fread($file, $bytes)){
    	$line2 = $line ^ $lignecripte;//effectue un OU EXCLUSIF (XOR) sur les bits 10011s^ 10110=00101 
    	// affichage du fichier
    	echo $line2;
  	}
}
Donc la première fonction encrypte le fichier (utilisé après l'upload) et le déplace dans le dossier de mon choix, la seconde déclare les headers pour forcer le téléchargement et la troisième le décrypte et lance le téléchargement (en fait il faut lancer la seconde fonction juste avant la troisième).
Là où l'encryptage se fait bien (impossible de lire le fichier après encryptage), le décryptage se fait mal : le fichier téléchargé est illisible (testé avec des images png).
Les variables :
$file : chemin du fichier non crypté
$file_encrypted : chemin du fichier crypté
$code : clé de cryptage
$nomfichier : nom du fichier (que j'obtiens avec un bête basename() ).

Je demande votre aide vu que je ne m'y connais pas du tout en cryptologie, je débute un peu en php et ce genre de manipulation avec les bits toussa c'est pas mon truc. Merci de l'aide :)

Mass
Invité n'ayant pas de compte PHPfrance

09 juin 2010, 15:49

J'ai une piste !
J'ai uploadé des fichiers html, cryptés, décryptés et downloadés.
Le fichier était bien décrypté, ceci en plus :
<br />
<b>Warning</b>: fread(): supplied argument is not a valid stream resource in <b>/mnt/165/sdb/a/8/xamaxe/toolbar2/website/toolbar/index.php</b> on line <b>65</b><br />
Je pense que fread déconne à un moment dans le while, et une erreur php dans une image, ça la rends illisible... Quelqu'un a une idée d'où peut venir le soucis de fread ?
Merci.

Mass
Invité n'ayant pas de compte PHPfrance

09 juin 2010, 15:59

Désolé pour le flood, je ne peux pas éditer mes messages...
Le code me renvoie le code source de la page courante au lieu du code de la page uploadé... Y'a un rapport ?
Cela peut-il être dû à mon hébergeur ? (free)