【问题标题】:python code to generate password list [closed]python代码生成密码列表[关闭]
【发布时间】:2015-02-25 01:19:15
【问题描述】:

我正在研究无线安全并尝试编写一个 python 脚本来生成密码,不是随机的,而是十六进制数字的字典。字母必须是大写字母,并且必须从 12 个字符变为 20 个字符。我从 11 f 到 20 f,这似乎符合要求。然后我尝试将它们放在一个文本文件中。制作文件后,我将其修改为 777,然后单击运行。已经有几分钟了,但我不知道它是否有效。我现在在 kali 中运行它,在 64 位核心 i3 上运行 8gb 内存。我不确定预计需要多长时间,但这是我的代码,如果看起来正确,请告诉我:

# generate 10 to 32 character password list using hex numbers, 0-9 A-F
def gen_pwd(x):
    x = range(17592186044415 -295147905179352830000)
    def toHex(dec):
        x = (dec % 16)
        digits = "0123456789ABCDEF"
        rest = dec / 16
        if (rest == 0):
            return digits[x]
        return toHex(rest) + digits[x]

    for x in range(x):
        print toHex(x) 
    f = open(/root/Home/sdnlnk_pwd.txt)
    print f
    value = x
    string = str(value)
    f.write(string) 

gen_pwd

【问题讨论】:

  • 恐怕它不起作用。存在多个语法错误,gen_pwd 需要括号才能实际调用函数:gen_pwd()
  • 也应该是open("/root/Home/sdnlnk_pwd.txt")(带括号)。
  • 我不认为那个范围正在做你所期望的......它基本上永远不会超过那个点......(在第一行)
  • 你的程序会崩溃,可能是内存错误。这个范围太大了
  • 范围是无限的...python支持任意大的数字,它永远不会换成17592186044415 -295147905179352830000

标签: python


【解决方案1】:

您可以使用time.time() 获取执行时间。如果您使用的是 python 2,请使用 xrange() 而不是 range 因为 xrange 返回一个迭代器:

import time

def gen_pwd(x):

    def toHex(dec):
        x = (dec % 16)
        digits = "0123456789ABCDEF"
        rest = dec / 16
        if (rest == 0):
            return digits[x]
        return toHex(rest) + digits[x]

    for x in range(x):
        print toHex(x) 
    f = open("/root/Home/sdnlnk_pwd.txt")
    print f
    value = x
    string = str(value)
    f.write(string) 

start= time.time()
gen_pwd()
last=time.time()-start
print last

注意:您需要() 来调用您的函数,并在您的open() 函数中调用""。我也认为你的第一个范围是一个额外的命令,因为它是错误的,你需要删除它。

【讨论】:

  • @JoranBeasley 是的,我认为它的额外代码。
【解决方案2】:

怎么样

password = hex(random.randint(1000000,100000000))[2:]

pw_len = 12
my_alphabet = "1234567890ABCDEF"
password = "".join(random.choice(my_alphabet) for _ in range(pw_len))

或者可能更接近你想要做的事情

struct.pack("Q",12365468987654).encode("hex").upper()

基本上你把一个非常简单的任务复杂化了

完全按照你的要求去做,你可以简化它

import itertools, struct

def int_to_chars(d):
    '''
    step 1: break into bytes
    '''
    while d > 0: # while we have not consumed
       yield struct.pack("B",d&0xFF) # decode char
       d>>=8 # shift right one byte
    yield "" # a terminator just in case its empty

def to_password(d):
    # this will convert an arbitrarily large number to a password
    return "".join(int_to_chars(d)).encode("hex").upper()  
    # you could probably just get away with `return hex(d)[2:]`

def all_the_passwords(minimum,maximum):
    #: since our numbers are so big we need to resort to some trickery
    all_pw = itertools.takewhile(lambda x:x<maximum,
                                 itertools.count(minimum))
    for pw in all_pw:
        yield to_password(pw)

all_passwords = all_the_passwords( 0xfffffffffff ,0xffffffffffffffffffff)
#this next bit is gonna take a while ... go get some coffee or something
for pw in all_passwords:
    print pw
#you will be waiting for it to finish for a very long time ... but it will get there

【讨论】:

  • 它会在地球被太阳吞噬之前完成吗? ;-)
【解决方案3】:

序言

我不想评论你想做什么。

代码 MkI

您的代码可以修剪(相当多)为以下内容

with open("myfile", "w") as f:
    for x in xrange(0xff,0xff*2+1): f.write("%X\n"%x)

对我的代码的评论

请注意

  1. 您可以将源代码中的十六进制数写为 ehm、十六进制数,也可以混合使用十六进制和十进制表示法

  2. to_hex 函数是多余的,因为python 有(惊喜!)许多不同的方式来格式化您的输出(这里我使用了所谓的string interpolation)。

当然,您必须更改open 语句中的文件名,并且 调整由xrange 生成的区间的极值(看起来 您正在使用 python 2.x) 来处理您的内容。

代码 MkII

Joran Beasley 评论说(至少在 Python 2.7 中)xrange 在内部使用 C long,因此它无法完成表示的任务 0XFFFFFFFFFFFFFFFFFFFF。这种替代代码可能是一种可能性:

f = open("myfile", "w")
cursor = 0XFFFFFFFFFF
end = 0XFFFFFFFFFFFFFFFFFFFF
while cursor <= end:
    f.write("%X\n"%cursor)
    cursor += 1

【讨论】:

  • xrange 打破他所说的数字(至少在 2.7 中)它试图转换为 c long ...
  • @JoranBeasley 感谢您的提醒,我已经相应地更新了我的答案。
【解决方案4】:
characters=["a","b","c"]
for x,y in zip(range(5),characters):
    print (hex(x)+y)

输出:

>>> 
0x0a
0x1b
0x2c
>>> 

你看,它实际上是用很短的方式做到这一点的。如果您使用这样的范围是不可能的,请保持较小并尝试在结果中添加其他内容。

同样对于文件处理,这里有一个更好的方法:

with open("filepath/name","a+") as f:
    f.write("whateveryouwanttowrite")

我正在使用密码生成器,如果你定义一个包含复杂字符的字典并像这样编译它们会更好:

passw={"h":"_*2ac","e":"=.kq","y":"%.hq1"}
x=input("Wanna make some passwords? Enter a sentence or word: ")
for i in x:
    print (passw[i],end="")
    with open("passwords.txt","a+") as f:
        f.write(passw[i])

输出:

>>> 
Wanna make some passwords? Enter a sentence or word: hey
_*2ac=.kq%.hq1
>>> 

所以,只要定义一个keys=alphabet和values=复杂字符的dict,你就可以用简单的单词-sentences来制作非常强的密码。我只是写了一个例子,当然你可以稍后将它们添加到dict中,你不必写。但我认为基本方法是更好。

【讨论】:

  • 如果我要设置密码,那将是明智的建议。当我破解密码时,这是不够的。我没有制作它们,但我知道它们是构成序列号的十六进制数字,并且它在它们进来的盒子上的标签上。这也是为什么我知道它们不能太大而无法处理的原因程序(分配给它们的计算机),并且不需要 6000 个硬盘来保存它们。它只是计数,地狱,我可以把它们用逗号分隔成一个大文本文件。有个主意,谢谢你让我说出来。
【解决方案5】:

这一切都很好,但是,没有一个能达到我的目的。如果 python 不能处理这么大的数字,我将不得不使用别的东西。正如我所说,我不想生成任何随机的东西,我需要一个连续的十六进制字符列表,长度从 12 个字符到 20 个字符不等。它是制作一个密码字典,该字典只不过是一个十六进制数字,长度应约为 16 个字符。

有人对我可以为此目的使用什么有任何建议吗?我认为某种类型的 c 语言应该可以解决问题,但我对 c 或 c++ 的了解比 python 少。听起来这需要一段时间,但没关系,这只是一个研究项目。

我想出了另一种可能性,从 11 f 开始以十六进制计数,直到我达到 20 f。这将产生大约 43 亿个数字,这应该适合 7900 万页的文档。听起来有点大,但如果我从 14 f 到 18 f,那应该是可以管理的。这是我现在提出的代码:

x = 0xffffffffffffff
def gen_pwd(x):
    while x <= 0xffffffffffffffffff:
        return x
        string = str(x)
    f = open("root/Home/sdnlnk_pwd.txt")    
    print f.upper(string, 'a')
    f.write(string)
    x = x + 0x1
gen_pwd()

【讨论】:

    【解决方案6】:

    免责声明

    我想对 OP 问题发表评论,但我需要展示一些代码以及该代码产生的输出,因此我最终决定以答案的形式发表我的评论。

    OTOH,我希望此评论能说服 OP,尽管她/他的工作在概念上很简单(请参阅我之前的回答,6 行 Python 代码),但对于可用资源(我的意思是,在地球上可用)是不可行的.


    代码

    import locale
    locale.setlocale(locale.LC_ALL, 'en_US.UTF-8')
    pg = lambda n: locale.format("%d", n, grouping=True)
    
    
    def count_bytes(low, hi):
        count = low+1
        for i in range(low+1,hi+1):
            nn = 15*16**(i-1)
            nc = i+1
            count = count + nn*nc
        return count
    
    n_b = count_bytes(10,20)
    n_d = n_b/4/10**12
    dollars = 139.99*n_d
    
    print "Total number of bytes to write on disk:",   pg(n_b)
    print """
    Considering the use of
        WD Green WD40EZRX 4TB IntelliPower 64MB Cache SATA 6.0Gb/s 3.5\" Internal Hard Drives,
        that you can shop at $139.99 each
       (see <http://www.newegg.com/Product/Product.aspx?Item=N82E16822236604>,
        retrieved on December 29th, 2014)."""
    print "\nNumber of 4TB hard disk drives necessary:", pg(n_d)
    print "\nCost of said hard disks: $" + pg(dollars)
    

    输出

    Total number of bytes to write on disk: 25,306,847,157,254,216,063,385,611
    
    Considering the use of
        WD Green WD40EZRX 4TB IntelliPower 64MB Cache SATA 6.0Gb/s 3.5" Internal Hard Drives,
        that you can shop at $139.99 each
       (see <http://www.newegg.com/Product/Product.aspx?Item=N82E16822236604>,
        retrieved on December 29th, 2014).
    
    Number of 4TB hard disk drives necessary: 6,326,711,789,313
    
    Cost of said hard disks: $885,676,383,385,926
    

    我对 OP 想要做什么的评论

    完成您的任务需要相当多的磁盘存储空间(和金钱)。

    视角

    Projected US Federal debt at the end of fiscal year 2014 is $18.23 trillion,不考虑机架、电源和能源费用,我的估计成本为 886 万亿美元。

    推荐阅读

    Combinatorial_Explosion@SussexUniversity,

    有希望

    如果您仍然确信按照您所描述的方向继续您的无线安全研究项目,那么您可能会在购买驱动器时获得大量折扣。

    【讨论】:

    • 我不会认为它占用了这么大的空间,即使它每行输出一个数字,它也计算了近 43 亿个数字,给了我大约 8000 万页在 word 文档广告中默认设置,除非我遗漏了什么。我发现我需要从 0xfffffffffff 开始以十六进制计数,并以 1 递增,直到达到 0xffffffffffffffffffff。然后我将数字转换为字符串,以便我可以编写它并增加它。请参阅我的新帖子,了解我正在尝试制作的代码。
    • 没有。你不会写 43 亿个数字,你会写出 1900 万个数十亿个数字,其中大部分由 20 个字符表示……你需要超过 60000 亿个大硬盘来存储它们(地球人口是 60 亿人;所需的驱动器是 60000 亿)。你读过我链接的页面吗?最后但并非最不重要的一点是,您想如何处理这些数据? (这是一个反问的问题,请不要费心回答)。也就是说,祝你好运,再见。
    • 既然你问了,我就用这个字典来破解suddenlink路由器的密码。在代码的输出文件中有一个提示。正如我所说,我正在研究这个。我认为从流量拦截中获取哈希并使用 gpu 使用字典离线破解它会更隐蔽,而不是简单地尝试通过实时访问路由器。然而,它似乎太大了,所以我已经编辑了代码以减少密码的数量。我也在质疑你的数学,这是错误的。
    猜你喜欢
    • 2021-04-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-02-06
    • 1970-01-01
    • 2011-03-24
    • 2011-11-17
    • 2017-12-27
    相关资源
    最近更新 更多