使用 base64 对大文件进行编码

Posted

技术标签:

【中文标题】使用 base64 对大文件进行编码【英文标题】:Encode a big file using base64 【发布时间】:2018-04-17 02:06:24 【问题描述】:

我正在尝试以 base64 编码对几 MB 或有时 GB 的文件进行编码/解码,但是某些数据以错误的方式进行编码/解码,这会导致奇怪的字符,例如:�̴.

我正在通过块编码读取文件块并单独保存每个块(可能这是问题,但我无法弄清楚)。

这是我迄今为止尝试过的:

<?php

function encode_file($Ifilename, $Efilename)
    $handle = fopen($Ifilename, 'rb');
    $outHandle = fopen($Efilename, 'wb');
    $bufferSize = 8151;
    while(!feof($handle))
        $buffer = fread($handle, $bufferSize);
        $ebuffer = base64_encode($buffer);
        fwrite($outHandle, $ebuffer);
    
    fclose($handle);
    fclose($outHandle);


function decode_file($Ifilename, $Efilename)
    $handle = fopen($Ifilename, 'rb');
    $outHandle = fopen($Efilename, 'wb');
    $bufferSize = 8151;
    while(!feof($handle))
        $buffer = fread($handle, $bufferSize);
        $dbuffer = base64_decode($buffer);
        fwrite($outHandle, $dbuffer);
    
    fclose($handle);
    fclose($outHandle);


encode_file('input.txt', 'out.bin');//Big text file ~4MBs

decode_file('out.bin', 'out.txt');

【问题讨论】:

Base64 不是加密。它甚至不接近。你的目标是什么? 我知道,目标只是降低可读性 Base64 不会以任何有意义的方式降低可读性。任何人都可以在没有密钥或任何特殊知识的情况下对数据进行 base64 解码。如果您试图混淆某些内容,这是一种非常无效的方法。 base64_encode 不是逐位操作,因此您的文件现在已损坏。 @RobbyCornelissen - 不。它是以非二进制(ascii)格式传输二进制数据。 【参考方案1】:

在base64上阅读整个Wikipedia article后,我发现每3个字符编码为4个base64字符,这就是导致文件损坏的原因。

解决方法是在编码时简单地将缓冲区设置为 n,其中 n 是 3 的倍数。

解码时设置缓冲区为 N,其中 N 是 4 的倍数。

工作代码:

<?php
function encode_file($Ifilename, $Efilename)
    $handle = fopen($Ifilename, 'rb');
    $outHandle = fopen($Efilename, 'wb');
    $bufferSize = 3 * 256;// 3 bytes of ASCII encodes to 4 bytes of base64
    while(!feof($handle))
        $buffer = fread($handle, $bufferSize);
        $ebuffer = base64_encode($buffer);
        fwrite($outHandle, $ebuffer);
    
    fclose($handle);
    fclose($outHandle);


function decode_file($Ifilename, $Efilename)
    $handle = fopen($Ifilename, 'rb');
    $outHandle = fopen($Efilename, 'wb');
    $bufferSize = 4 * 256; // 4 bytes of base64 decodes to 3 bytes of ASCII
    while(!feof($handle))
        $buffer = fread($handle, $bufferSize);
        $dbuffer = base64_decode($buffer);
        fwrite($outHandle, $dbuffer);
    
    fclose($handle);
    fclose($outHandle);


encode_file('input.txt', 'out.bin');

decode_file('out.bin', 'output.txt');

【讨论】:

这仍然不能以任何方式保护您的数据。 谁说过保护? 您在关于问题的内容中做到了:“我确实知道,目标只是降低可读性”。 Base64 与混淆无关。它是关于使用有限的字符集编码(通常是二进制)数据,以便通过需要文本的协议进行传输。 另外,您仍在调用您的函数encrypt_filedecrypt_file。这是一个巨大的赠品,你试图阻止人们阅读数据。您选择了错误的工具。这就像试图通过将小说翻译成法语来保护它。 谢谢,我认为有一个困惑,我的问题是如何做而不是为什么做。如果您有答案,我很乐意与您讨论,我明确表示我确实知道 base64 是什么以及它的作用,但我仍然想使用它。

以上是关于使用 base64 对大文件进行编码的主要内容,如果未能解决你的问题,请参考以下文章

有没有办法确定大数据包捕获的所有base64编码流量?

如何在 Java 中加速读写 base64 编码的 gzip 大文件

如何在 Python 中对 PDF 文件进行 base64 编码

Base64编码

使用 Javascript 检索二进制文件内容,base64 对其进行编码并使用 Python 对其进行反向解码

如何在delphi中实现对文件进行base64编码