我有大文件(.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)