紧缩措施可以产生以下效果:
[user@localhost ~] crunch 3 3 ab
Crunch will now generate the following amount of data: 32 bytes
0 MB
0 GB
0 TB
0 PB
Crunch will now generate the following number of lines: 8
aaa
aab
aba
abb
baa
bab
bba
bbb
[user@localhost ~]
但有没有什么解决办法这与crunch相同,唯一的区别是随机输出行?
[user@localhost ~] SOMEMAGIC 3 3 ab
bba
bab
abb
aaa
bbb
aab
baa
aba
[user@localhost ~]
使用类似“sort -R”的方法并不好!因为解决方案需要“即时”
答案1
模仿紧缩
像这样的东西将生成集合 {a,b} @ 3 个字符串长的所有排列,并且它将使用 打乱输出shuf
。
$ printf "%s\n" {a..b}{a..b}{a..b} | shuf
bbb
aab
abb
bba
baa
aba
bab
aaa
这实际上与使用sort -R
.
隐藏随机化
如果您打算隐藏接口,以便给出scriptX
一个参数列表,然后它返回一个类似于 的随机列表crunch
,那么将其包装在别名或 shell 脚本中就可以完成这项工作。您可以将以下内容放入名为 的 shell 脚本中mycrunch.bash
:
#!/bin/bash
crunch "$1" "$2" "$3" | sort -R
将其标记为可执行:
$ chmod +x mycrunch.bash
并像这样运行它:
$ ./mycrunch.bash 3 3 ab
过滤虚假的 Crunch 输出
您可以使用grep
上面脚本中的命令来过滤掉这些行,如下所示:
crunch "$1" "$2" "$3" | grep -vE "Crunch|0" | sort -R
这将忽略任何包含字符串“Crunch”或“0”的行。
答案2
分析
你想做的事情存在根本性的困难。
如果crunch
要以随机顺序输出所有可能的行(不预先生成所有行并充当sort -R
或shuf
),那么它必须记住哪些行已经被打印。存储这些信息最终需要与存储所有行相当的空间。从整个集合中随机挑选尚未打印的行所需的计算工作总量与对整个集合进行操作时所做的计算工作sort -R
相当shuf
。
crunch
可以在没有这种负担的情况下生成行,只是因为它以某种严格的顺序生成它们。为了告诉下一行,知道命令行参数和当前行(以及算法crunch
使用)就足够了。我的观点是crunch
不需要记住前面的行,不需要比较或搜索;它会快速移动到下一行,因为它已经知道该行应该是什么并且尚未打印。
自己尝试一下。以随机序列(或至少以看似随机的序列)大声说出从 0 到 26 的所有数字。没有重复,没有遗漏,每个数字只有一次。赶快!现在按自然顺序大声说出从 0 到 26 的所有数字。
理论上,至少有两种方法可以在没有上述负担的情况下获得看起来随机的序列:
仅知道当前行和命令行参数,内部算法
crunch
可以以某种方式生成下一行(通常)与前几行(在大型集合的情况下:几百万行)不同,因此最终结果看起来是随机排序的。知道命令行参数
crunch
使用后,外部过滤器可以从中获取当前行crunch
(以其有序方式工作)并以某种方式对其进行转换,因此当crunch
进行时,最终结果看起来是随机排序的。
请注意,过滤器内部或内部的算法crunch
必须生成所有可能的行,而不重复且不遗漏。您可能希望能够给它一些种子,因此结果在下一次完整运行中看起来是随机洗牌的。我认为创建这样的算法是一项不平凡的任务(如果可能的话,而不隐藏算法本身的负担)。
但为什么呢?
通常crunch
用于生成单词列表以通过暴力破解来猜测密码。假设您想要一个由以下方式生成的列表:
crunch 9 9
随机序列能比有序序列更好吗?如果实际密码包含另一个字符或者长度不同,那么它就不在列表中,并且两个序列都同样糟糕:您需要完全耗尽一个列表或另一个列表才能了解密码是其他内容。
如果实际密码在列表中,那么您可能会或可能不会幸运地尽早将其出现在列表中。这意味着,如果密码的所有者(创建者)预测您将使用crunch
默认的 az 有序字符集,他或她可能会故意选择以 开头的“聪明”密码z
,只会延迟您的成功。如果你打乱你的列表,那么你将使这个策略无效:实际的密码可能靠近列表的前面,也可能靠近列表的末尾,所以平均来说你需要耗尽列表的一半。平均而言,这将花费您大约一半的时间来猜测以 开头的“聪明”密码z
。
所以,是的,在这种情况下,重新排列列表会有所帮助。
但为什么不使用 za 智取“聪明”密码的所有者呢?
crunch 9 9 zyxwvutsrqponmlkjihgfedcba
这将使您能够相对较快地猜出“聪明”的密码z
。但如果楼主预测的话这特定的攻击,那么他或她宁愿创建一个密码a
!
该怎么做:抛硬币并使用 az(正面)或 za(反面)。
对于任何密码(使用任何策略或不使用任何策略创建),az 对您来说是幸运的,就像 za 是不幸的一样; az 是不幸的,而za 是幸运的。因此,如果列表中只有密码,那么您使用更幸运的序列的机会是 50%,所以一般你需要耗尽列表的一半,就像打乱列表一样。抛硬币一次就会使任何策略失效。
答案3
好吧,您可以通过 sort -R 管道传输以“Crunch will now”开头的输出行之后的所有内容。像这样:
crunch 3 3 ab| sed -e '0,/^Crunch will now/d' | sort -R
不过,仍然不确定这是否算作“即时”。
答案4
但是是否有任何解决方案与 crunch 相同,唯一的区别是随机输出行?
不。
这个问题只需两步就可以解决:
- 创建所有可能的组合
- 生成结果的随机排列
您不能同时执行这两项操作,至少不能使用单个算法来创建组合。您需要有不同的算法,并在程序一开始随机选择一个算法,并注意这些不同算法的最终结果是均匀分布的。
无论如何,我怀疑你会发现什么简单的,与crunch
+有很大不同sort -R
。