2011-05-17 1 views
1

Je travaille avec une application CodeIgniter pour crypter les fichiers téléchargés, puis les décrypte lorsqu'ils sont téléchargés afin de pouvoir les stocker en toute sécurité mesures de sécurité). Tout cela fonctionne très bien, à part les fichiers docx (et autres Microsoft Office 2007+). Lorsque ceux-ci sont téléchargés, ils sont décryptés avec succès, mais Office les détecte comme corrompus. Ceux-ci peuvent être réparés, donc ils ne sont pas totalement corrompus, mais quelque chose a changé dans le fichier de la version originale qui fait que Office les voit comme corrompus. Comme je l'ai mentionné, cela ne semble pas arriver à d'autres types de fichiers (que j'ai remarqué). Les fichiers docx sont également légèrement différents en taille (seulement une question d'octets), alors que les autres types ne le sont pas.Le cryptage des fichiers avec php/mcrypt altère les fichiers docx (et autres Microsoft Office 2007) mais les autres sont corrects

Pour crypter, je télécharger le fichier, lire le contenu dans une chaîne avec file_get_contents(), puis exécutez la chaîne par l'encode de CodeIgniter() dans la bibliothèque de Crypter puis enregistrez le fichier sur le disque, la suppression de l'original:

function mcrypt_encode($data, $key) 
{ 
    $init_size = mcrypt_get_iv_size($this->_get_cipher(), $this->_get_mode()); 
    $init_vect = mcrypt_create_iv($init_size, MCRYPT_RAND); 
    return $this->_add_cipher_noise($init_vect.mcrypt_encrypt($this->_get_cipher(), $key, $data, $this->_get_mode(), $init_vect), $key); 
} 

et à décoder:

function mcrypt_decode($data, $key) 
{ 
    $data = $this->_remove_cipher_noise($data, $key); 
    $init_size = mcrypt_get_iv_size($this->_get_cipher(), $this->_get_mode()); 

    if ($init_size > strlen($data)) 
    { 
     return FALSE; 
    } 

    $init_vect = substr($data, 0, $init_size); 
    $data = substr($data, $init_size); 
    return rtrim(mcrypt_decrypt($this->_get_cipher(), $key, $data, $this->_get_mode(), $init_vect), "\0"); 
} 

Lancez ensuite la chaîne décodée par force_download()

le chiffrement par défaut CodeIgniter est MCRYPT_RIJNDAEL_256 et le mode est MCRYPT_MODE_CBC. Mcrypt est activé sur mon serveur avec MCRYPT_RIJNDAEL_256.

Si quelqu'un pouvait me signaler dans la bonne direction pourquoi cela pourrait se produire, il serait grandement apprécié.

Un grand merci

Répondre

1

Ceci est un bug connu avec file_get_contents et les données binaires. http://bugs.php.net/bug.php?id=42661

+0

Merci d'avoir signalé cela. Le lien fourni suggère d'utiliser readfile() comme alternative. Comment pourrais-je faire ça? Readfile semble envoyer le contenu du fichier au tampon de sortie plutôt que de le renvoyer sous forme de chaîne. –

+0

Vous n'utilisez pas 'readfile' pour la raison que vous avez mentionnée. Ce que vous voulez, c'est ['fread'] (http://www.php.net/manual/fr/function.fread.php). Notez l'avertissement dans l'exemple n ° 2 concernant l'ouverture de fichiers binaires dans Windows (aucune idée de votre plate-forme, mais juste au cas où ...) –

+0

Pour développer/expliquer, les fichiers ouverts sur les fenêtres sans indicateur explicite 'binaire' auront leurs fins de ligne traduit à \ r \ n. – Mel

0

Je faisais presque la même chose et je suis arrivé ici de google.

Je l'ai résolu maintenant. Le problème n'est pas dans le file_get_contents(), le problème est la fonction d'encodage dans codeigniter. La fonction supprime certains caractères spéciaux, supprimant ainsi les données du fichier. C'est intéressant comment Microsoft Office a pu le réparer.

Questions connexes