Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/234.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/file/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php openssl解密文件_Php_File_Openssl - Fatal编程技术网

Php openssl解密文件

Php openssl解密文件,php,file,openssl,Php,File,Openssl,希望有人知道答案 背景 我用PHP创建了一个小例程,它使用密码AES、密钥长度256bit和分组密码CBC对(大)文件进行加密。 现在,由于文件非常大,我无法将整个文件提供给加密例程(内存溢出),因此我必须一次将文件分为4128个字节,并将每个块发送给加密例程。生成的加密块变为4128+16字节长(16字节来自AES填充),我将它们写入一个文件(一个块链=>加密文件) 通常,如果我通过openssl加密该文件,它将只填充最后一个块。在我的例子中,因为我必须一次读取一个数据块,所以我必须对每个数据

希望有人知道答案

背景

我用PHP创建了一个小例程,它使用密码AES、密钥长度256bit和分组密码CBC对(大)文件进行加密。 现在,由于文件非常大,我无法将整个文件提供给加密例程(内存溢出),因此我必须一次将文件分为4128个字节,并将每个块发送给加密例程。生成的加密块变为4128+16字节长(16字节来自AES填充),我将它们写入一个文件(一个块链=>加密文件)

通常,如果我通过openssl加密该文件,它将只填充最后一个块。在我的例子中,因为我必须一次读取一个数据块,所以我必须对每个数据块进行读取(请记住,AES使用128位的PAD作为AES使用128位的固定数据块)

问题

我正在尝试使用openssl实用程序解密此文件。问题是openssl不知道我的加密文件不仅在最后填充,而且在每个块(4128+16字节)中填充。因此,它将删除最后一个块填充,但每隔一个块包含16个字节(我们称之为垃圾)。如果我编码一个纯文本文件,我会看到垃圾,我会理解这是一个解密问题。如果文件是二进制文件(图片、可执行文件等),则可能不会解释/加载该文件

问题

openssl实用程序是否有任何选项允许我告诉它,输入文件必须一次以X字节块解码,而不是整个文件?
您是否看到了解决此类问题的其他解决方案?

您不需要,也不应该像这样对数据块进行加密。任何sane crypto API都提供了开始加密数据流(通常称为
something\u encrypt\u init
或类似的函数),将数据附加到流中(
something\u encrypt\u update
),以及关闭流(
something\u encrypt\u final
)。看看这个,如果你用的是这个,它看起来设计得很糟糕。修复方法是使用设计更好的API。您可能希望获得的帮助或正确设计您的程序。例如,您是否确定不需要验证数据完整性(即,您不在乎对手是否向您提供虚假数据)?我必须按原样使用PHP。很明显,OpenSSL API的实现很糟糕,这就是为什么我被卡住了,并被召唤为骑兵。最后,我决定分块进行加密——作为一种临时解决办法——关于openssl,我编写了一个小脚本,其中涉及到dd+openssl(仅限Linux或WinOS+Cygwin)的使用。如果有人感兴趣,请阅读以下内容: