Шифрование файлов с помощью php / mcrypt приводит к повреждению файлов docx (и других Microsoft Office 2007), но с другими все в порядке - PullRequest
1 голос
/ 17 мая 2011

Я работаю с приложением CodeIgniter для шифрования загруженных файлов, а затем расшифровываю их при загрузке, чтобы их можно было безопасно хранить (наряду с другими мерами безопасности).Все это работает нормально, кроме файлов docx (и других файлов Microsoft Office 2007+).Когда они загружаются, они успешно расшифровываются, но Office обнаруживает их как поврежденные.Их можно исправить, поэтому они не полностью повреждены, но что-то изменилось в файле по сравнению с оригинальной версией, из-за чего Office видит их как поврежденные.Как я уже упоминал, этого не происходит с любыми другими типами файлов (которые я заметил).Файлы docx также немного различаются по размеру (только в байтах), тогда как другие типы - нет.

Для шифрования я загружаю файл, считываю содержимое в строку с помощью file_get_contents (), затем запускаюстрока с помощью метода codeIgniter's encode () в библиотеке шифрования, затем сохраните файл обратно на диск, удалив оригинал:

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);
}

и декодиру:через CodeIgniter's force_download ()

Шифр ​​по умолчанию - MCRYPT_RIJNDAEL_256, а режим - MCRYPT_MODE_CBC.Mcrypt включен на моем сервере вместе с MCRYPT_RIJNDAEL_256.

Если кто-нибудь и укажет мне правильное направление относительно того, почему это может происходить, это было бы очень полезно.

Большое спасибо

Ответы [ 3 ]

1 голос
/ 17 мая 2011

Это известная ошибка с file_get_contents и двоичными данными. http://bugs.php.net/bug.php?id=42661

0 голосов
/ 26 сентября 2013

Я делал почти то же самое и получил здесь от Google.

Я решил это сейчас.Проблема не в file_get_contents(), проблема в функции кодирования в codeigniter.Функция удаляет определенные специальные символы, таким образом удаляя данные из файла.Интересно, как офис Microsoft смог восстановить его.

0 голосов
/ 02 июня 2011

base64_encode() file_get_contents() файла, затем шифрование.

base64_decode() расшифровка file_get_contents() шифрованияфайл перед загрузкой.

...