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.