如何使用 Rar 或 WinRAR 创建密码以双引号开头的加密档案?

How to use Rar or WinRAR for creating an encrypted archive with a password starting with a double quote?

我正在尝试创建一个命令行以通过命令行使用密码压缩为 RAR 文件 Windows 7. 我已经安装了 WinRAR 5.31 x64。

以下命令对我有用:

rar a -r -m0 -hp"!(/!$!#!#=)\%" C:\files1.rar" *.*

密码是!(/!$!#!#=)\%.

如果我想在密码中加上双引号 " 就会出现问题,例如在开头:

rar a -r -m0 -hp""!(/!$!#!#=)\%" C:\files1.rar" *.*

密码应该是"!(/!$!#!#=)\%.

这对我不起作用,我尝试将 \ 放在 " 之前,但这也不起作用。

谁能指导我解决密码中的这个特殊字符?

Windows 命令解释器 cmd.exeRar.exe 本身决定了在解析命令行时如何解释命令行上指定的参数。包含 space 或这些字符之一 &()[]{}^=;!'+,`~<|> 的参数字符串必须用双引号引起来。这使得将双引号字符作为参数字符串的一部分传递给控制台应用程序非常困难,尤其是在参数字符串的开头。

但是对于这个由 password/passphrase 引起的非常罕见且非常具体的问题有一个解决方案按字面解释。

控制台版WinRAR的说明书是WinRAR程序文件夹中的文本文件Rar.txt。在本手册中可以看到,Rar.exe 支持从环境变量 RAR 读取开关。通过在 SET 命令行上使用此环境变量和 Windows 命令行解释器的特殊解析,可以从命令行创建 RAR 存档,密码以单个开头直双引号字符。

@echo off
setlocal EnableExtensions DisableDelayedExpansion
set "RAR=-hp""!(/!$!#!#=)\%%""
"%ProgramFiles%\WinRAR\Rar.exe" a -r -m0 -x"%~f0" "%USERPROFILE%\Desktop\files1.rar" *.*
endlocal

开关 -hp 是从环境变量 RAR 中读取的,此外还有其他直接在 RAR 命令行上指定的开关,如手册所述。

环境变量 RAR 是使用语法 set "variable=value" 定义的,如 Why is no string output with 'echo %var%' after using 'set var = text' on command line?

上的答案所详细解释

带有 space 或其中一个字符 &()[]{}^=;!'+,`~<|> 的 password/passphrase 需要在 Windows 命令行中用双引号引起来。出于这个原因 Rar.exe 从传递的 password/passphrase 中删除第一个和最后一个双引号(如果在 begin and/or end 有一个双引号)。所以不能用"!(/!$!#!#=)\%定义密码。密码必须使用 ""!(/!$!#!#=)\%" 用两个额外的双引号定义,以使真正使用的密码以直双引号字符开头。

在批处理文件中 % 标记 begin/end 一个环境变量引用,除了它被另外一个 %.

转义

所以最后命令行 set "RAR=-hp""!(/!$!#!#=)\%%"" 定义了环境变量 RAR 开关 -hp 传递字符串 "!(/!$!#!#=)\%Rar.exe 作为密码使用加密。

RAR 存档 files1.rar 是通过此代码在用户桌面上创建的,因为目录 C: 的根目录通常是写保护的。

注意:RarWinRAR 解释 *.** 不同,在比较手册中也有解释到 Windows 内核函数解释它们相同。 Rar 使用 *.* 仅将文件名中包含点的文件添加到 RAR 压缩文件中。所以你最好只使用 * 作为通配符。

如果批处理文件在执行批处理文件时存储在当前目录中,则开关 -x"%~f0" 会阻止将批处理文件也添加到 RAR 压缩文件中。 运行 在命令提示符 window call /? 中解释 %~f0 – 参数 0 的全名,这意味着带有扩展名和完整路径的批处理文件名。

Mofi 的进一步回答:

特别是对于从命令行使用 winrar/rar 的 Linux 用户,可能值得意识到 rar 有效地接受 "keyfiles",这可能会克服需要 fiddle 用引号作为密码的一部分。

Rar 记录的最大密码长度为 127 characters/bytes。 (对我而言)不清楚哪些字符是密码 space 的一部分,但至少 base64 编码的字符串有效。但是,rar currently uses a password based key derivation function based on PBKDF2 using the HMAC-SHA256 hash function, which has a block size of 512 bits. Per PBKDF2, passwords longer than the block size of the hash function are first pre-hashed into a digest of 256 bits, which digest is then used as the password (instead of the original password). To avoid这个,您选择的存档密码不能超过512位或64个字符。

在base64编码的字符串中,每个字符代表6位数据;因此,一个 64 个字符的密码相当于 384 个随机位,这可能来自 48 个随机字节。

rar a -hp"$(dd if=/dev/urandom bs=48 count=1 | base64 -w0 | tee /tmp/pwd)" archive

上面的dd-pipe将从内核的(非阻塞)随机数源设备读取48个(伪)随机字节,将这些转换成64个字符的密码,告诉rar到使用该密码导出 256 位 (AES256) 加密密钥(RAR5 格式),同时将密码存储在文件“/tmp/pwd”中。

存档可能会再次被访问,例如列出,通过从文件中读回密码,例如像这样:

rar l -p"$(cat /tmp/pwd)" archive.rar

密码文件可以安全地单独存储或与存档一起存储,在后一种情况下(当然)在加密之后,例如gpg 使用您自己的 public 密钥,以便将存档密码锁定在您的私人 key/key 短语下。所有这些都是为了方便地用好rar的password/keyspace.

我注意到我没有深入研究 unrar 的 public 可用源代码;以上仅基于一般文档。另外,我不知道上面是否可以在 Windows.

下工作