如何:在Python中生成40/64位WEP密钥?

如何:在Python中生成40/64位WEP密钥?,python,xor,wep,Python,Xor,Wep,所以,几个月来,我一直在这个问题上拼命挣扎,一部分是因为这是一个附带的兴趣,另一部分是因为我不擅长编程。我已经在网上搜索和研究过了,但是没有任何运气(除了一点点成功;见下文),所以我想我可以试着问一下专家 正如标题所示,我试图做的是根据“事实”标准,从密码短语生成一个40/64位WEP密钥。(一个产生预期输出的站点。)我已经编写了脚本的一些部分,这些部分接收输入并将它们写入文件;其中一个输入将是密码短语,经过消毒后为小写 很长一段时间我都不知道事实标准是什么,更不用说如何去实施它了。我终于偶然发

所以,几个月来,我一直在这个问题上拼命挣扎,一部分是因为这是一个附带的兴趣,另一部分是因为我不擅长编程。我已经在网上搜索和研究过了,但是没有任何运气(除了一点点成功;见下文),所以我想我可以试着问一下专家

正如标题所示,我试图做的是根据“事实”标准,从密码短语生成一个40/64位WEP密钥。(一个产生预期输出的站点。)我已经编写了脚本的一些部分,这些部分接收输入并将它们写入文件;其中一个输入将是密码短语,经过消毒后为小写

很长一段时间我都不知道事实标准是什么,更不用说如何去实施它了。我终于偶然发现了一篇论文(),它揭示了我对这个问题的认识(第18页有相关内容)。显然,密码短语是“用XOR映射到一个32位值”,其结果随后被用作“线性全等PRNG”的种子(我不知道Python的几个PRNG中哪一个符合这个描述),然后从这个结果中提取出结果的几个部分。我不知道如何实现这个,因为描述相当模糊

我需要的是用Python编写生成器方面的帮助,以及理解密钥是如何生成的。换句话说,我需要将“jackson”转换为“09F38AF593”的代码。(请不要告诉我jackson=09F38AF593;print(jackson))

我不是一个很好的程序员,所以解释也很感激


(是的,我知道WEP是不安全的。)

我不确定什么是“事实标准”“该网站正在讨论,但我相当肯定路由器制造商都实施自己的方法。不管你怎么做,只要相同的输入总是产生相同的输出;这很方便,因此WEP用户可以记住密码短语而不是实际的十六进制键。即使是你发布的PDF中的方法也有很大的模糊性;它使用一个未定义的PRNG(每种类型的PRNG都会给出不同的结果),并从每个结果中提取“一个字节”,而不指定是哪个字节。如果您试图对某个路由器的方法进行反向工程,请在帖子中提及,我们可能能够了解该方法的工作原理,但没有一种标准方法,您链接到的C代码将非常有帮助地包含在问题中;-)不管怎样,我还是把它翻译成Python。在你阅读之前,我要说的是,我强烈建议你自己尝试一下,并且只使用我的抄本作为指导。当您想提高一种或两种语言的技能时,将算法从一种编程语言翻译成另一种编程语言通常是一种很好的实践。即使您不懂C,只要您对Python足够熟悉,能够用它编写程序,您也应该能够理解C代码的要点,因为有许多相似之处

不管怎么说,继续讲代码

import itertools, operator
首先,伪随机数生成器,在演示文稿中被确定为一个。这种类型的PRNG是一种通用算法,可以通过选择
a
c
m
(维基百科文章中提到的变量)的特定值进行“定制”。以下是通用线性同余生成器的实现:

def prng(x, a, c, m):
    while True:
        x = (a * x + c) % m
        yield x
(希望你能自己想出这个办法)

现在了解实际功能:

def pass_to_key(passphrase):
该过程的第一步是将提供的密码短语散列(或“映射”)到32位数字。WEP算法通过创建一组初始化为零的4字节(因此4*8=32位)来实现这一点

    bits = [0,0,0,0]
它遍历字符串并用一个字节对每个字符进行异或运算;具体来说,字符
i
被异或转换为字节
i%4

    for i, c in enumerate(passphrase):
        bits[i & 3] ^= ord(c)
然后将这四个字节按顺序连接在一起,以形成单个32位值。(或者,我可以编写代码,从一开始就将它们存储为32位数字)

线性同余发生器一次最多可产生32位输出。(在C中,这是数据类型的限制;在Python中,我必须人工强制执行。)我需要20个字节来生成4个40位(5字节)的WEP密钥,因此我将重复PRNG 20次

    for i, b in enumerate(itertools.islice(prng(val, 0x343fd, 0x269ec3, 1<<32), 20)):
为什么是第三个?高端的位(从右起第四位)变化不大,低端的位可以预测PRNG常数的许多值

之后,剩下的就是以5个字节为一组打印生成的字节

    print ('%02x:%02x:%02x:%02x:%02x\n'*4) % tuple(keys)

这个网站()也会生成预期的结果,JavaScript将公开给用户查看。我只是不太了解JS,无法很好地理解它。Linux邮件列表中的一篇旧文章包含一些C代码,可以生成所需的内容。()同样的问题是,对代码周期了解不够,无法理解它。就我的研究所知,Linksys、Netgear、Belkin和DLink都使用相同的算法。不清楚你想从这个问题中得到什么。您已经指出了实现该算法的JS源代码。从源代码(netpoint.com/wep.htm)来看,这是一个相当长且不平凡的编码。你为什么不花点时间试着理解这个实现,问一些你试图理解代码的具体问题呢?我已经花了将近一个月的时间断断续续地试着理解这个实现。这样一个新手,我简直无法理解。然而,我要说的是,作为我提供的第二个链接的C程序似乎不需要如此复杂的设置。据我所知,在生成64位wep密钥时,JS页面上唯一调用的函数是ToHex和MM_FindObj。根本不使用转换。但是,我可能看错了。不过,我会尝试一下
    for i, b in enumerate(itertools.islice(prng(val, 0x343fd, 0x269ec3, 1<<32), 20)):
        keys.append((b >> 16) & 0xff)
    print ('%02x:%02x:%02x:%02x:%02x\n'*4) % tuple(keys)