首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >XKCD类密码短语到stdout

XKCD类密码短语到stdout
EN

Security用户
提问于 2014-09-10 17:19:20
回答 2查看 1.2K关注 0票数 6

我正在设法从文字词典中破解出类似XKCD的密码(更正电池敲击)。基本上将字典文件中的X字数连在一起。现在,老实说,似乎没有一种简单的方法。

在XKCD漫画之后,有很多像这样的工具,我可以自己编一个字典文件,但是我觉得应该有一个更好的方法。我的具体用法是MD5哈希的开膛手约翰。

在JtR中似乎没有连接整个单词的方法,只修改现有的单词。底部参考这里

在JtR的未来版本中,可能会添加多个单词的“密码”破解模式,或对word列表模式的增强。

这是2008年,但我仍然没有看到任何类似的变化。我可以使用该文档中描述的技巧,但是如果您需要做两个以上的单词短语,或者您的字典长度很长,它就会变得非常难看。

我的第二个想法是使用Crunch在单词中使用管道,例如.crunch 0 0 -p word1 word2 | john --pipe mypasswd*,我可以修改它,并使用-q wordlist.txt,而crunch将使用该文本文件中的单词。这里的问题是,没有办法(我已经发现)限制一个密码所用的字数。例如,如果您的字典包含1000个单词,则每个密码短语都是所有1000个单词的连接。再一次,如果你的字典有很长的长度,它就会变得很难看。

编辑:请注意,对于建议更改上面的crunch命令以指定最小长度和最大长度的人。但是,这不适用于-p或-q选项,但仍必须指定数字(因此为0占位符)。参考文献下的-p标志

它忽略了最小长度和最大长度,但是仍然必须指定两个数字。

这就使得我的要求是写到stdout,而不是一个文件,因为这样的文件将是这样的大小,并允许您指定加入的单词数(2个单词短语,3个单词等)。最好,这样的工具还可以让您指定分隔字符(correct.horse.battery.staple正确的\、马、\、电池、键),以防其他字符甚至空格被允许。

希望这是正确的堆栈交换,有人让我知道,如果有另一个我应该尝试。

编辑

对于正在寻找类似东西的其他人来说,这里有一个python代码片段,它或多或少地做了我想做的事情。

代码语言:javascript
运行
复制
# iterable=['test','correct','horse','battery','staple']
## Change the file specified here to your dictionary file
iterable = [i.strip().split() for i in open("wordList.txt").readlines()]

def permutations(iterable, r=None, s=''):
    pool = tuple(iterable)
    n = len(pool)
    r = n if r is None else r
    if r > n:
        #return
        r = n # Lets assume users want all permutations
    indices = range(n)
    cycles = range(n, n-r, -1)
    temp = tuple(pool[i] for i in indices[:r])
    for item in temp: # iterate through the current tuple and turn it into a string, to get rid of brackets and such
        print s.join([str(i[0]) for i in temp])
    while n:
        for i in reversed(range(r)):
            cycles[i] -= 1
            if cycles[i] == 0:
                indices[i:] = indices[i+1:] + indices[i:i+1]
                cycles[i] = n - i
            else:
                j = cycles[i]
                indices[i], indices[-j] = indices[-j], indices[i]
                temp = tuple(pool[i] for i in indices[:r])
                for item in temp:
                    print s.join([str(i[0]) for i in temp])
                break
        else:
            return

# The first value relates to our variable (dictionary file) at the top
# The second value is the number of words we want to combine, a 2 would indicate 2 
## word combinations, such as correct.horse, 3 would be correct.horse.staple
# The third value is the seperater, such as . in the example above, to create words
## that run together enter nothing, or ''
permutations(iterable, 2, '.')

若要将此与JtR一起使用,请使用python xkcd.py | john --pipe mypasswd*

代码是从python迭代工具提取的,所以它应该返回.

R-长度元组,所有可能的顺序,没有重复的元素

我想要所有这些,而且它不会将数组存储在内存中(长列表会很快耗尽),也不会写入磁盘(如果需要,可以重定向输出)。

现在,我遇到了长时间运行的错误(IOError:Errno 32坏了的管道)和JtR。代码很草率等等,所以不,这不是一个完美的现实世界的解决方案。然而,正如已经指出的那样,由于可能性的数量,这在现实世界中可能是不实际的,即使没有错误。有时候我只是想知道一些事情是否有可能!

如果有谁知道C,并想直接将类似的东西添加到JtR或Crunch中,那将是令人惊奇的,我有一种感觉,如果它被编写到为这种任务设计的程序中,我会加快速度,使它变得更加可靠。

EN

回答 2

Security用户

发布于 2014-09-10 18:48:06

我用BASH做了这个解决方案。其实挺有趣的..。您必须已经有一个输出文件。由于您正在编写脚本,添加touch output.txt命令应该不会太难。

shuf -n5 /usr/share/dict/words | tr -d '\n' >> output.txt; sed -i -e '$a\' output.txt

所以它所做的就是

  1. 从Unix字典文件中获取5个随机单词
  2. 通过tr (翻译字符)删除新行,并将输出追加到输出文件中。这也可以是插入分隔字符的步骤。
  3. 使用sed向文件末尾添加换行符

将脚本写入一个循环中,您将得到一个由5个单词组成的排列文件连接在一起。如果您真的希望所有输出都输出到stdout,则可以修改它。

在单一密码尝试中使用JtR:

shuf -n5 /usr/share/dict/words | tr -d '\n' | john --pipe mypasswd*

舒夫(曼舒夫)

shuf -n5 /usr/share/dict/words;

生成输入行到标准输出的随机排列。

翻译字符(man )

tr -d '\n' >> output.txt

从标准输入中翻译、压缩和/或删除字符,写入标准输出。

我们使用它删除SHUF生成的换行符,并将结果连接到一个输出文件中。

票数 3
EN

Security用户

发布于 2014-09-10 20:43:13

只有一个暗示听了这个答案工具(S)的存在。你的发言:

“但是如果你需要做两个单词以上的词组,……就会变得很难看”和

再说一遍,如果你的字典有任何长度,它就会变得很难看

让我想一想,您是否估计了破解的时间,如果该工具存在,即使它的执行速度类似于GPU上的密码破解。

(摘自我的密码分析工具)。假设密码是:

干涸攻击显性电线

并假设一本长度适中、有7776个单词的类Diceware词典:

  • 当用作WiFi密钥时,密码可以在1.2个世纪内在average.假定的恢复硬件( WiFi、8 GPU、WPA/WPA 2)上脱机恢复。
  • 当在Windows网络上嗅到NTLM密码时,在average.假定的恢复硬件上,这个短语可以在4.0小时内恢复,例如:快速散列/ Hw教授,25个GPU。
  • 当使用WiFi密钥时,使用具有128个GPU的GPU阵列的机构可以在7.5年内恢复它,average假设硬件为128个GPU阵列,'8 ~128个外推估计‘。

当在CPU上而不是GPU(s)上进行恢复时,可能需要50*(GPU的数值)更长的时间。在我看来,CPU方法是不可行的。

票数 1
EN
页面原文内容由Security提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://security.stackexchange.com/questions/67147

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档