xor entre deux fichiers de même taille

Le
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
Vidéos High-Tech et Jeu Vidéo
Téléchargements
Vos réponses
Gagnez chaque mois un abonnement Premium avec GNT : Inscrivez-vous !
Trier par : date / pertinence
Damien Wyart
Le #22701431
* Kevin Denis
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
Kevin Denis
Le #22701581
Le 21-10-2010, Damien Wyart
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
Pierre Maurette
Le #22701711
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
Publicité
Suivre les réponses
Poster une réponse
Anonyme