IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage PHP Discussion :

Chiffrement XOR avec un fichier


Sujet :

Langage PHP

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Août 2004
    Messages
    152
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Août 2004
    Messages : 152
    Points : 70
    Points
    70
    Par défaut Chiffrement XOR avec un fichier
    Bonjour à tous,

    Après avoir fini mon programme de chiffrage en C++ (avec XOR et une clé binaire), je m'attaque à faire pareil mais en PHP cette fois. Je suis beaucoup plus à l'aise avec ce dernier mais apparement je n'arrive pas à traîter des données binaires.

    Il est vrai que PHP n'est pas un langage proche de la machine d'où le problème d'accéder à la mémoire, aux bytes etc... J'ai pratiquement tout fait, le problème c'est le XOR en lui même. PHP n'arrive pas à faire cette opération entre un int (1 octet de la clé) et un string (1 octet du fichier). Je ne sais pas pourquoi il prend ça pour un string mais en tout cas il ne fait pas l'opération XOR comme il faut, la plupart du temps il garde le int de la clé comme s'il ne faisait pas de XOR finalement. Il arrive parfois qu'il trouve dans le string du fichier un nombre et il fait (le int moins le nombre trouvé dans le string). C'est pas vraiment ce que je veux évidemment.

    Voici le code que j'utilise actuellement :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    <?php
    // Stream files and encrypt the data on-the-fly
     
    // Settings
    // -- File to stream
    $file = "FILE_in";
    // -- Reading buffer
    $bufferlength = 3840;
    // -- Key in hex
    $keychar = "9cdfb439c7876e703e307864c9167a15";
     
    // Function: Convertion hex key in a string into binary
    function hex2bin($h) {
    	if (!is_string($h)) return null;
    	$r = array();
    	for ($a=0; ($a*2)<strlen($h); $a++) {
    		//$r.=chr(hexdec($h{$a}.$h{($a+1)}));
    		$ta = hexdec($h[2*$a]);
    		$tb = hexdec($h[(2*$a+1)]);
    		$r[$a] = (int) (($ta << 4) + $tb);
    		echo "a=".$ta." , b=".$tb." , r[".$a."]=".$r[$a]." <br />";
    	}
    	return $r;
    }
     
    $plop = array(0x1);
    var_dump($plop);
    echo "<p />";
     
    // Headers
    $headers = "";
    $headers .= "Content-Type: application/octet-stream; ";
    $headers .= "Content-Length: " . filesize($file) ."; ";
    $headers .= "filename=\"".$file."\"; ";
    //header($headers);
    flush(); // this doesn't really matter.
     
    // Convert key and set the size of the key
    $key = hex2bin($keychar);
    $keylength = 16;
     
    // Opening the file in read-only
    $fp = fopen($file, "r");
    while (!feof($fp))
    {
        // Read a buffer size of the file
    	$buffer = fread($fp, $bufferlength);
    	$j=0;
    	for ($i=0; $i < $bufferlength; $i++) {
    		// The key is read in loop to crypt the whole file
    		if ($i%$keylength == 0) {
    			$j=0;
    		}
    		// Apply a xor operation between the key and the file to crypt
    		// This operation eats a lots of CPU time (Stream at 1MiB/s on my server; Intel E2180)
    		$bufferE = ( $buffer[$i]^$key[$j] ); // <==== Le fameux XOR
     
    		echo "<br />key[".$j."]: ";
    		var_dump($key[$j]);
    		echo "<br />buffer[".$i."]: ";
    		var_dump($buffer[$i]);
    		echo "<br />bufferE: ";
    		var_dump($bufferE);
    		echo "<br />";
     
    		// Send the encrypted data
    		echo $bufferE;
    		// Clean the memory
    		$bufferE = "";
    		$j++;
    	}
    	$buffer = "";
        flush(); // this is essential for large downloads
    	fclose($fp);
    	exit();
    }
    // Close the file and it's finished
    fclose($fp);
     
     
    ?>
    Pour le moment je suis en mode debug, j'ai pleins d'instructions d'echo pour vérifier le code.
    Voici la sortie d'une partie intéressante (dans la boucle) qui vous montre comment PHP procéde à ce XOR :

    key[4]: int(199)
    buffer[1028]: string(1) "�" <== Caractère en dehors du code ASCII (normal c'est du binaire !)
    bufferE: int(199)
    199
    key[5]: int(135)
    buffer[1029]: string(1) " "
    bufferE: int(135)
    135
    key[6]: int(110)
    buffer[1030]: string(1) "0"
    bufferE: int(110)
    110
    key[7]: int(112)
    buffer[1031]: string(1) "3"
    bufferE: int(115)
    115
    key[8]: int(62)
    buffer[1032]: string(1) ","
    bufferE: int(62)
    62
    Voilà, j'espère avoir donné le maximum d'informations et d'avoir étant suffisamment clair. Merci d'avance à tous ceux qui m'aideront.

  2. #2
    Invité
    Invité(e)
    Par défaut
    ord() permet de transformer un caractère en entier.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    <?php
     
    $string = ',';
    $integer = 112;
     
    $xor_chr = $integer ^ $string[0];
    $xor_ord = $integer ^ ord($string[0]);
     
    echo $xor_chr, ' | ', $xor_ord;
     
    ?>
    unpack() peut offrir une meilleure souplesse.

  3. #3
    Membre régulier
    Profil pro
    Inscrit en
    Août 2004
    Messages
    152
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Août 2004
    Messages : 152
    Points : 70
    Points
    70
    Par défaut
    Salut Tish Carpenter,

    le problème c'est que je n'aurai pas toujours à faire à des caractères, la plupart de mes fichiers seront binaires. J'ai dû utiliser pack sur la key directement et non sur le binaire !

    Du coup ça fonctionne maintenant parfaitement. J'ai enfin une compatibilité complète avec le chiffrage de mon programme C++ et du PHP dans tous les sens possibles. Chiffrage à la volée puis déchiffrage par le programme et vice-versa !

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    <?php
    // Stream files and encrypt the data on-the-fly
     
    // Settings
    // -- File to stream
    $file = "bin-in";
    // -- Reading buffer
    $bufferlength = 3840;
    // -- Key in hex
    $keychar = "9cdfb439c7876e703e307864c9167a15";
     
    // Function: Convertion hex key in a string into binary
    function hex2bin($h) {
    	if (!is_string($h)) return null;
    	$r = array();
    	for ($a=0; ($a*2)<strlen($h); $a++) {
    		$ta = hexdec($h[2*$a]);
    		$tb = hexdec($h[(2*$a+1)]);
    		$r[$a] = (int) (($ta << 4) + $tb);
    		//echo "a=".$ta." , b=".$tb." , r[".$a."]=".$r[$a]." <br />";
    	}
    	return $r;
    }
     
    // Headers
    $headers = "";
    $headers .= "Content-Type: application/octet-stream; ";
    $headers .= "Content-Length: " . filesize($file) ."; ";
    $headers .= "filename=\"".$file."\"; ";
    header($headers);
    flush(); // this doesn't really matter.
     
    // Convert key and set the size of the key
    $key = hex2bin($keychar);
    $keylength = 16;
     
    // Opening the file in read-only
    $fp = fopen($file, "r");
    while (!feof($fp))
    {
        // Read a buffer size of the file
    	$buffer = fread($fp, $bufferlength);
    	$j=0;
    	for ($i=0; $i < $bufferlength; $i++) {
    		// The key is read in loop to crypt the whole file
    		if ($i%$keylength == 0) {
    			$j=0;
    		}
    		// Apply a xor operation between the key and the file to crypt
    		// This operation eats a lots of CPU time (Stream at 0.5MiB/s on my server; Intel E2180 !!!)
    		$tmp = pack("C", $key[$j]);
    		$bufferE = ( $buffer[$i]^$tmp); // <==== Le fameux XOR
     
    		/*
    		echo "<br />key[".$j."]: ";
    		var_dump($tmp);
    		echo "<br />buffer[".$i."]: ";
    		var_dump($buffer[$i]);
    		echo "<br />bufferE: ";
    		var_dump($bufferE);
    		echo "<br />";
    		//*/
     
    		// Send the encrypted data
    		echo $bufferE;
    		// Clean the memory
    		$bufferE = "";
    		$j++;
    	}
    	$buffer = "";
        flush(); // this is essential for large downloads
    	/*
    	fclose($fp);
    	exit();
    	//*/
    }
    // Close the file and it's finished
    fclose($fp);
     
     
    ?>
    Petit détail pour chipoter mais quand même: le débit du chiffrage sur mon serveur E2180 a chuté de 50% passant de 1MiB/s à ~500KiB/s. Comment expliquer cette chute si drastique ? le pack utilise autant de ressource que ça ? Comment faire pour optimiser un maximum le code pour augmenter le débit ?

    A part ce détail, merci beaucoup !!! Avis au spécialistes pour ma question de performance.

Discussions similaires

  1. Crypteur de fichier xor avec stub
    Par codeurduzero dans le forum C
    Réponses: 3
    Dernier message: 25/08/2011, 10h05
  2. Mise à jour d'une table avec un fichier csv
    Par blackangel dans le forum PostgreSQL
    Réponses: 4
    Dernier message: 26/05/2005, 14h46
  3. Réponses: 2
    Dernier message: 26/07/2004, 13h34
  4. [linux][gcc] Comment travaille t-on avec plusieurs fichiers?
    Par kaygee dans le forum Autres éditeurs
    Réponses: 2
    Dernier message: 02/04/2004, 17h48
  5. Problème avec les fichiers .JPG
    Par cprogil dans le forum Langage
    Réponses: 5
    Dernier message: 10/06/2003, 15h44

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo