MD5没有改变吗?

MD5没有改变吗?

我有 3 个 rar 文件(均具有相同的 md5),并且我使用此代码来更改 Md5:

@echo off
setlocal enabledelayedexpansion
 set /A Counter=0


FOR %%1 in (*.rar) do (

        set /A Counter= !Counter! + 1
                COPY  %%1+!Counter!
                echo !Counter!

)

pause

当我运行 .bat 文件时,它显示 3 行,值为:1、2、3,但当我检查 3 个 rar 文件的 md5 时,它们相同,尽管它们已更改。为什么?我做错了什么?谢谢!

答案1

最有可能的是,文件 '.\1'、'.\2' 和 '.\3' 不存在。复制命令copy archive.rar+1将文件 '1' 的内容附加到 .rar 文件。如果文件不存在,则将其视为空文件。尽管如此,哈希值还是会发生变化,因为如果没有 '/b' 标志,该命令还会附加字符 0x1A。由于所有以 (*.rar) 开头的文件都是相同的,因此向每个文件添加相同的字节将导致三个完全相同的 .rar 文件,并且 MD5 完全相同。

您可以通过创建具有不同内容的文件“.\1”、“.\2”等来确保运行脚本后 MD5 值不同。如果您只是想附加字符,则可能需要使用类似的方法echo !Counter! >> %%1。当然,生成的文件将不再是有效的 rar 档案。为此,您需要一个带有命令行界面的 rar 工具。

答案2

您的批处理脚本存在一些问题。您尝试执行的操作是将数字附加到原​​始文件的末尾,以更改其 MD5 哈希值。但是:

  • 加号 ( +) 只能用于合并多个现有文件。
  • 您正在处理二进制文件,因此需要使用参数/b

    /b指示命令解释器读取目录中文件大小所指定的字节数。/b是的默认值copy,除非copy合并文件。

    /b它位于命令行上的文件列表之前或之后时,它将应用于所有列出的文件,直到复制遇到/a

    来源:复制

基本上,您需要将要附加的号码存储在临时文件中,然后将其与原始.rar档案合并。这是一个修复的、可用的版本:

@echo off
setlocal
setlocal enabledelayedexpansion

set tempFile=%temp%\%random%%random%.tmp
set /a counter=0

for %%G in (*.rar) do (
set /a counter += 1
<nul set /p=!counter!>"%tempFile%"
copy /b "%%~G"+"%tempFile%" >nul
echo !counter!
)

del "%tempFile%" 2>nul    
pause

endlocal & exit /b

笔记如果要递归扫描文件夹,请替换for为。for /r

进一步阅读

相关内容