Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

xor entre deux fichiers de même taille

3 réponses
Avatar
Kevin Denis
Bonjour,

je cherche à effectuer un xor entre duex fichiers de même taille.
file1 XOR file2 => file3

je regarde la doc python, et apparement, il n'existe pas de fonction
prête à l'emploi (?)

La solution est elle donc d'ouvrir les deux fichiers en mode 'r+b'
et de faire une boucle du 1er au dernier octet du fichier en calculant
le xor de chaque octet? Pour des gros fichiers, n'est ce pas
consommateur en ressources?

Merci
--
Kevin

3 réponses

Avatar
Damien Wyart
* Kevin Denis in fr.comp.lang.python:
je cherche à effectuer un xor entre duex fichiers de même taille.
file1 XOR file2 => file3

je regarde la doc python, et apparement, il n'existe pas de fonction
prête à l'emploi (?)



En effet, j'ai la même impression. Même si la biblio standard est
réputée très riche, elle ne peut pas non plus proposer TOUTES les
fonctions imaginables... C'est quand même assez facile à recoder
rapidement.

La solution est elle donc d'ouvrir les deux fichiers en mode 'r+b' et
de faire une boucle du 1er au dernier octet du fichier en calculant le
xor de chaque octet? Pour des gros fichiers, n'est ce pas consommateur
en ressources?



Si les fichiers sont relativement petits, on peut les lire d'un coup et
ensuite faire les calculs sur les chaînes correspondantes ; sinon les
lire par blocs plutôt que octet par octet.

Voir ici (fin de page) http://www.amk.ca/python/writing/crypto-curiosa
un bout de code qui fait ça de façon très simpliste et moche (c'est une
page "fun" de type "code le plus court possible") mais ça peut donner
une trame...

--
DW
Avatar
Kevin Denis
Le 21-10-2010, Damien Wyart a écrit :
La solution est elle donc d'ouvrir les deux fichiers en mode 'r+b' et
de faire une boucle du 1er au dernier octet du fichier en calculant le
xor de chaque octet? Pour des gros fichiers, n'est ce pas consommateur
en ressources?



Si les fichiers sont relativement petits, on peut les lire d'un coup et
ensuite faire les calculs sur les chaînes correspondantes ; sinon les
lire par blocs plutôt que octet par octet.



Ok.

Voir ici (fin de page) http://www.amk.ca/python/writing/crypto-curiosa
un bout de code qui fait ça de façon très simpliste et moche (c'est une
page "fun" de type "code le plus court possible") mais ça peut donner
une trame...



Et ça fonctionne bien, merci.
--
Kevin
Avatar
Pierre Maurette
Kevin Denis, le 10/21/2010 a écrit :
Bonjour,

je cherche à effectuer un xor entre duex fichiers de même taille.
file1 XOR file2 => file3

je regarde la doc python, et apparement, il n'existe pas de fonction
prête à l'emploi (?)

La solution est elle donc d'ouvrir les deux fichiers en mode 'r+b'
et de faire une boucle du 1er au dernier octet du fichier en calculant
le xor de chaque octet? Pour des gros fichiers, n'est ce pas
consommateur en ressources?



J'ai regardé en vitesse.
Faire les fichiers de test:
open('sdata.dat', 'wb').write('maurette' * 100)
open('key.dat', 'wb').write('zorglub4' * 100)

Fabriquer le fichier XORé:
open('res.dat', 'wb').write(''.join([chr(ord(x)^ord(y)) for (x, y) in
zip(open('sdata.dat', 'rb').read(), open('key.dat', 'rb').read())]))

Vérifier ((a xor b) xor b vaut a):
open('verif.dat', 'wb').write(''.join([chr(ord(x)^ord(y)) for (x, y) in
zip(open('res.dat', 'rb').read(), open('key.dat', 'rb').read())]))


Si vous traitez des fichiers énormes (au dessus du Go à mon avis) vous
pouvez traiter par paquet:

def readPaquets(file1, file2, taillePaquet24*1024):
while True:
data1, data2 = (file1.read(taillePaquet),
file2.read(taillePaquet))
if not data1 or not data2:
break
yield data1, data2


f = open('resultat.dat', 'wb+')
for data1, data2 in readPaquets(open('sdata.dat', 'rb'),
open('key.dat', 'rb'), 11):
f.write(''.join([chr(ord(x)^ord(y)) for (x, y) in zip(data1,
data2)]))


Et là aussi la preuve:
f = open('verif.dat', 'wb+')
for data1, data2 in readPaquets(open('resultat.dat', 'rb'),
open('key.dat', 'rb'), 11):
f.write(''.join([chr(ord(x)^ord(y)) for (x, y) in zip(data1,
data2)]))

--
Pierre Maurette