Page 1 sur 1

Encrypter/décrypter une vidéo

Posté : 08 juin 2015, 15:42
par LittleFairy
bonjour à tous !

Je souhaite encrypter puis décrypter une vidéo (en .avi) avec AES.
Actuellement je fais ainsi :

Code : Tout sélectionner

<?php ///// mon fichier encrypt : $file = 'test.avi'; $newfile = 'test_encrypt.avi'; if (!copy($file, $newfile)) { echo "La copie $file du fichier a échouée...\n"; } if (!$fp = fopen('test_encrypt.avi',"r+")) { echo "Echec de l'ouverture du fichier"; exit; } else { while(!feof($fp)) { // On récupère une ligne $Ligne = fgets($fp,4096); // On stocke l'ensemble des lignes dans une variable $Fichier .= $Ligne; //// ici, on encode les lignes .......... } fclose($fp); // On ferme le fichier } if (!$fp = fopen('test_encrypt.avi',"w+")) { echo "Echec de l'ouverture du fichier"; exit; } else { include 'AES.php'; $imputKey = "encryptor key"; $blockSize = 256; $aes = new AES($Fichier, $imputKey, $blockSize); $enc = $aes->encrypt(); $aes->setData($enc); fputs($fp, $enc); // echo $enc; echo "traité"; fclose($fp); // On ferme le fichier } ?>
Le fichier généré est bien encrypté. Voici le décryptage :

Code : Tout sélectionner

<?php //// mon fichier decrypt $file = 'test_encrypt.avi'; $newfile = 'test_decrypt.avi'; if (!copy($file, $newfile)) { echo "La copie $file du fichier a échoué...\n"; } if (!$fp = fopen('test_decrypt.avi',"r+")) { echo "Echec de l'ouverture du fichier"; exit; } else { while(!feof($fp)) { // On récupère une ligne $Ligne = fgets($fp,4096); // On stocke l'ensemble des lignes dans une variable $Fichier .= $Ligne; //// ici, on encode les lignes .......... } fclose($fp); // On ferme le fichier } if (!$fp = fopen('test_decrypt.avi',"w+")) { echo "Echec de l'ouverture du fichier"; exit; } else { include 'AES.php'; $imputKey = "encryptor key"; $blockSize = 256; $aes = new AES($Fichier, $imputKey, $blockSize); $dec = $aes->decrypt(); $aes->setData($dec); fputs($fp, $dec); // echo $enc; echo "traité"; fclose($fp); // On ferme le fichier } ////////////// ?>
Mon problème est que le fichier décrypté pèse 2 octets de moins que l'original, et la vidéo décryptée reste illisible.
on dirait qu'une signature ou un encodage se perd quelque part.
si je met un fichier .txt avec un texte dedans, au lieu d'une vidéo, tout fonctionne bien et mon fichier décrypté est bien identique à la source.
si je compare le fichier avi source et le fichier avi décrypté, en les ouvrant avec le bloc note, j'ai les mêmes caractères des deux côtés.

auriez-vous une idée, ou avez-vous déjà rencontré ce problème ?

Merci de votre aide !

LF

Re: Encrypter/décrypter une vidéo

Posté : 08 juin 2015, 17:26
par ynx
Salut,

Pas vraiment de solution mais au moins un début de piste :
Si vous ne précisez pas 'b' lorsque vous travaillez avec des fichiers binaires, vous pourriez rencontrer des problèmes avec vos données, comme des images corrompues ou des caractères \r\n inopinés.
Source : http://php.net/manual/fr/function.fopen.php

Re: Encrypter/décrypter une vidéo

Posté : 08 juin 2015, 18:50
par LittleFairy
bonjour ynx,

je viens de tester, mais ça ne fonctionne pas. il manque toujours deux octets, le fichier reste illisible.
Merci quand même, l'idée était bonne !

Re: Encrypter/décrypter une vidéo

Posté : 09 juin 2015, 01:50
par @rthur
Bonjour LittleFairy,

En voila une problématique qui m'a intriguée... :-)

Pour essayer de reproduire ton problème, j'ai simplifier ton code au maximum pour obtenir un jeu d'essai complet :
- qui effectue le chiffrement d'un fichier
- puis le déchiffrement du fichier obtenu
- et enfin compare les 2 fichiers pour voir si ils sont identiques.
<?php
/* Paramètres */
$file = 'test.avi';
$cryptfile = 'test_encrypt.avi';
$decryptfile = 'test_decrypt.avi';
$inputKey = "encryptor key";
$blockSize = 256;

include 'AES.php';


/* 1) Chiffrement */
$aes = new AES(file_get_contents($file), $inputKey, $blockSize);
file_put_contents($cryptfile, $aes->encrypt());
echo "Chiffrement OK <hr />";


/* 2) Déchiffrement */
$aes = new AES(file_get_contents($cryptfile), $inputKey, $blockSize);
file_put_contents($decryptfile, $aes->decrypt());
echo "Dechiffrement OK <hr />";


/* 3) Vérification d'intégrité */
if (md5_file($file)===md5_file($decryptfile)) {
	echo "<h2 style='color:green'>SUCCES : Fichier d'origine et Fichier chiffre+dechiffre identique !</h2>";
}else{
	echo "<h2 style='color:red'>ERREUR : Fichier d'origine et Fichier chiffre+dechiffre NON identique !</h2>";
}
Et là... je constate alors le même problème que toi :-/


Après analyse des 2 fichiers (l'original et sa pseudo-copie chiffrée+déchiffrée) avec un éditeur hexa, j'ai remarqué qu'effectivement ce sont les derniers octets qui ont disparus...
... mais que ces octets étaient nuls
Et là, j'ai eu une intuition qui s'est vérifiée :)
En fait pour effectuer un chiffrement AES, on est obligé de découper le fichier original en blocs. Et pour remplir le dernier bloc, on effectue du bourrage (ou padding en anglais), c'est à dire qu'on ajoute des octets nuls. Et donc au déchiffrage on retire ces bits de bourrage.
Or si le fichier d'origine se termine par des octets nuls, le fichier chiffré+déchiffré n'aura plus ces octets nuls à la fin car ces octets nuls seront considérés comme des bits de bourrage :)

Pour s'en assurer, il suffit de prendre le fichier récupéré après l'opération de chiffrement+déchiffrement, et de refaire la même opération comme si c'était lui qui était le fichier d'origine.
Comme il ne se termine pas par des bits nuls, alors cette fois-ci, on récupère exactement le même fichier :)

Re: Encrypter/décrypter une vidéo

Posté : 09 juin 2015, 10:02
par LittleFairy
bonjour @rtur, et merci beaucoup de ta contribution.

qu'entends-tu par "refaire la même opération comme si c'était lui qui était le fichier d'origine." ?
rajouter deux blancs à la fin..?

Re: Encrypter/décrypter une vidéo

Posté : 09 juin 2015, 10:32
par @rthur
Je viens de relire ton message initial :
la vidéo décryptée reste illisible.
Chez moi, malgré les bits nuls retirés, la vidéo est bien lisible après chiffrement+déchiffrement.

Voici l'un des fichier avi avec lequel j'ai fait mes tests :
http://ftp.gameaholic.com/pub/games/str ... railer.avi
Essaye avec ce fichier et mon code pour voir si ça fonctionne chez toi.


qu'entends-tu par "refaire la même opération comme si c'était lui qui était le fichier d'origine." ?
Simplement, prendre le fichier obtenu après le chiffrement+déchiffrement et réeffectuer la même opération et cette fois ci on obtient un fichier parfaitement identique en entrée et en sortie. Mais c'est un détail, le plus important étant que le fichier soit lisible après déchiffrement

Re: Encrypter/décrypter une vidéo

Posté : 11 juin 2015, 10:00
par LittleFairy
Bonjour @rthur,

J'y suis presque...
j'ai repris ton code, et ta vidéo, j'ai le message d'erreur que tu as prévu : fichier non identique.

toutefois : lorsque je lance la vidéo décryptée :
- avec windows media player : impossible de lire le ficher
- avec vlc : le message d'erreur est : ce fichier avi a un index erroné ou absent
si je le lance avec le bouton "construire un index en mémoire" -> il se lance
si je clique sur "lancer tel quel" -> il se lance
j'ai un détail supplémentaire sur le problème :
"Impossible de reconnaître le format du média d'entrée:
Le format de « file:///C:/Users/F%C3%A9e/Desktop/test.avi » n'a pu être détecté. Vérifiez les messages pour plus de détails."

j'ai fait l'essai avec mon code et c'est identique, la vidéo se lance aussi avec vlc, après les messages d'erreur.

Donc : nos codes fonctionnent de la même façon, et la vidéo décryptée a perdu une information sur le format du média d'entrée, en index.
aurais-tu une solution ?

je te remercie encore pour ton aide.

Re: Encrypter/décrypter une vidéo

Posté : 11 juin 2015, 14:28
par @rthur
Tu as fait un essai avec le fichier vidéo que j'ai indiquée ?

Car chez moi, la vidéo encryptée+décryptée fonctionne sans problème.

Re: Encrypter/décrypter une vidéo

Posté : 11 juin 2015, 14:56
par LittleFairy
oui, c'est ce que j'ai fait en premier.
j'ai le message d'erreur "non identique" avec ta vidéo également, et avec ton code bien sûr.
tu n'as pas ça ?

Re: Encrypter/décrypter une vidéo

Posté : 11 juin 2015, 15:00
par @rthur
J'ai bien ça et c'est normal car l'algorithme de déchiffrement supprime les octets nuls en fin de fichier.
Mais cela n'endommage pas le fichier et la vidéo est lisible.

Re: Encrypter/décrypter une vidéo

Posté : 11 juin 2015, 17:33
par LittleFairy
Alors quel est ton lecteur ? peut-être qu'ils ne réagissent pas pareil...

Re: Encrypter/décrypter une vidéo

Posté : 11 juin 2015, 19:02
par @rthur
J'ai testé avec Windows Media, VLC et mplayer, les 3 réussissent à lire le fichier sans problème.

Re: Encrypter/décrypter une vidéo

Posté : 12 juin 2015, 09:21
par LittleFairy
..Et bien ça alors !
Je viens de me rendre compte que si je lis la vidéo directement sur le serveur, mon media player se lance sans problème. Par contre si je le copie sur mon bureau, média player n'en veut pas.
étant donné que j'en ai besoin sur le serveur, tout va bien.

Merci @rthur !