【发布时间】:2011-08-27 09:34:25
【问题描述】:
我正在使用 CodeIgniter 应用程序来加密上传的文件,然后在下载时解密它们,以便可以安全地存储它们(以及其他安全措施)。除了 docx(和其他 Microsoft Office 2007+)文件之外,这一切都很好。下载这些文件后,它们已成功解密,但 Office 检测到它们已损坏。这些可以修复,因此它们并没有完全损坏,但是文件中的某些内容与原始版本相比发生了变化,这使得 Office 将它们视为已损坏。正如我所提到的,这似乎不会发生在任何其他文件类型上(我已经注意到)。 docx 文件的大小也略有不同(仅字节问题),而其他类型则没有。
为了加密,我上传文件,使用 file_get_contents() 将内容读入字符串,然后通过 CodeIgniter 的 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);
}
并解码:
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");
}
然后通过CodeIgniter的force_download()运行解码后的字符串
默认密码为 MCRYPT_RIJNDAEL_256,模式为 MCRYPT_MODE_CBC。在我的服务器上启用了 Mcrypt 以及 MCRYPT_RIJNDAEL_256。
如果有人能指出我为什么会发生这种情况,我将不胜感激。
非常感谢
【问题讨论】:
标签: php codeigniter docx mcrypt