触碰大文件以改变其 HASH 的最小(也是最快)方法是什么?

触碰大文件以改变其 HASH 的最小(也是最快)方法是什么?

我有大文件(.iso.mkv等),我需要更改 HASH,以便在传输过程中它们不会在潜在的 DHT 网络中被检测到。

一种显而易见的方法是将它们添加到 zip 文件中,然后将该 zip 文件分成 2 个卷(7zip 等工具就是这样做的)。
这种方法的问题在于需要很长时间(并且需要硬盘上有额外的可用空间)。

有没有更快捷的方法?
类似的东西cutting 1Byte away, storing it in a small additional file, and re-joining the files once transfer is done就足够了。
这样的事情会不会工作得更快?
是否可以相对快速地实现(例如:某些工具或 powershell 脚本),而无需为此编写自己的 python 工具?

答案1

在 powershell 中,你可以轻松地将数据附加到文件。这会更改哈希值,而无需将整个文件加载到内存中:

# check hash at start:
$file = .\BigFile.iso
(Get-FileHash $file).Hash
C95B3F05EB8641A483A2218F4D0D43540BFEB1CD3D55B87FF34158FF5417904B

# append three characters to file
'foo' >> $file

# OR specify the encoding to make it easier to remove later [recommended]:
'foo' | Out-File -Append $file -Encoding utf8 -NoNewline

# verify hash changed
(Get-FileHash $file).Hash
46E31A77CC3D0271061D7E54A35A6715AC263FDBCE1DF9F1BC69578A6AFB8686

无需重写整个内容即可删除最后几个字节,但您需要确切知道要修剪多少。foo在 UTF8 中是 3 个字节,因此:

# undo by trimming the last 3 bytes off the file
$stream = [IO.File]::OpenWrite($file)
$stream.SetLength($stream.Length - 3)
$stream.Close()
$stream.Dispose()

# verify hash is fixed:
(Get-FileHash $file).Hash
C95B3F05EB8641A483A2218F4D0D43540BFEB1CD3D55B87FF34158FF5417904B

答案2

您可以保存并运行以下命令,以切换文件的前两个字节。第一次运行时,文件头本身看起来像是一个垃圾数据文件。第二次运行它会将其恢复到原始状态。

#!/usr/bin/env python3
"""
Toggle the first & second bytes.
Syntax: python <py-file> filename
"""


import sys


def flip_first_bit(filename):
    with open(filename, "r+b") as fp:
        fp.seek(1, 0)
        byte_one = fp.read(1)
        byte_two = fp.read(1)
        fp.seek(-2, 1)
        fp.write(byte_two)
        fp.write(byte_one)


if __name__ == "__main__":
    filename = sys.argv[1]
    flip_first_bit(filename)

相关内容