使用所有组合来生成单词列表

使用所有组合来生成单词列表

我正在尝试生成一个单词列表,以便使用它来暴力破解我自己的 Truecrypt 容器。我确实知道密码的一部分,它是使用其他已知密码的块来增加长度的,但我忘记了使用这些块的顺序以及是否根本没有使用某些块。

用空格分隔的“块”示例:dog cat bird xyz cow1 lion8

我想做的是创建一个包含这些块的每种可能组合的单词列表。例如

dog
cat
dogcat
catdog
bird
dogbird
catbird
birdcat
birddog
dogcatbird
catdogbird
xyz
dogcatbirdxyz
cow1
xyzcow1dogcat
xyzcow1dogcatbird
catdogbirdxyzcow8
lion8
catdogbirdxyzcow1lion8
lion8catdogbirdxyzcow1
dogcatbirdxyzcow1lion8
cow1birddogcatxyzlion8
cow1lion8birddogcatxyz
...

到目前为止,我已经尝试使用一种名为 crunch 的工具:http://www.irongeek.com/i.php?page=backtrack-r1-man-pages/crunch

但挑战似乎是如何生成较短组合的组合,不包括所有已知的块,例如:dogcat仅包括 2 个块。

也许有人crunch比我更了解,或者我是否应该使用其他工具或工具组合?

答案1

Python,

#! /usr/bin/env python3
import sys
from itertools import chain, permutations
# from the docs https://docs.python.org/3/library/itertools.html#itertools-recipes
# modified for permutations instead of combinations


def powerset_perm(iterable):
    s = list(iterable)
    return chain.from_iterable(permutations(s, r) for r in range(1, len(s) + 1))


for w in powerset_perm(sys.argv[1:]):
    print("".join(w))

例子:

~ ./foo.py foo フー bar1™
foo
フー
bar1™
fooフー
foobar1™
フーfoo
フーbar1™
bar1™foo
bar1™フー
fooフーbar1™
foobar1™フー
フーfoobar1™
フーbar1™foo
bar1™fooフー
bar1™フーfoo

答案2

crunch目前仅支持排列,不支持组合。我建议使用perl和执行此操作Math::Combinatorics,例如:

words=(dog cat bird xyz cow1 lion8)

# Generate all possible combinations of $words
perl -MMath::Combinatorics -E '
  $, = " ";
  for $i (1 .. @ARGV) {
    say @$_ for(combine($i, @ARGV));
  }
' ${words[@]} |

# For each combination, get all possible permutations
perl -MMath::Combinatorics -anE 'say @$_ for (permute(@F))'

使用 运行它| shuf -n20,输出有时是:

lion8dogxyzcow1cat
birdcow1catlion8xyz
catxyzlion8cow1
catdoglion8xyz
doglion8cow1birdxyzcat
birdcow1lion8dogxyzcat
xyzcow1dogcat
birddogcat
dogcatxyzcow1
catxyzdogcow1
birdcatxyzlion8dogcow1
cow1xyzlion8
cow1catlion8xyzbirddog
xyzlion8catdogcow1bird
dogcow1catxyzbirdlion8
xyzcow1dogcatbirdlion8
cow1birdlion8dogcat
lion8cow1catbird
xyzbirdcatcow1
xyzdogcow1lion8birdcat

相关内容