我怎样才能:在Python中生成40/64位WEP密钥?

时间:2010-05-23 01:48:31

标签: python xor wep

所以,我几个月来一直在争论这个问题的障碍,部分原因是因为这是一个副作用,部分是因为我很喜欢编程。我在网上搜索和研究过,但没有任何运气(除了一小部分成功;见下文),所以我想我可以尝试询问专家。

根据“事实上的”标准,我想要做的是,正如标题所示,从密码短语中生成一个40/64位的WEP密钥。 (诸如http://www.powerdog.com/wepkey.cgi之类的站点产生预期的输出。)我已经编写了部分脚本来获取输入并将它们写入文件;其中一个输入是密码短语,对小写进行清理。

在最长的时间里,我不知道事实上的标准是什么,更不用说如何实施它了。我终于偶然发现了一篇论文(http://www.lava.net/~newsham/wlan/WEP_password_cracker.pdf),该论文在这个问题上得到了尽可能多的亮光(第18页有相关的部分)。显然,密码被“映射到具有XOR的32位值”,其结果随后被用作“线性同余PRNG的种子”(Python中的几个PRNG中的一个将符合此描述,我不知道知道),然后从结果中得到几位结果。我不知道如何实现这个,因为描述相当模糊。

我需要的是帮助用Python编写生成器,以及理解密钥的生成方式。换句话说,我需要代码将“jackson”变成“09F38AF593”。 (请不要告诉我杰克森= 09F38AF593;打印(杰克逊))

我不是一个程序员,所以解释也很受欢迎。

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

2 个答案:

答案 0 :(得分:5)

你链接到的那个C代码非常有助于包含在问题中;-)无论如何,我继续把它翻译成Python。在您阅读之前,请允许我说我强烈建议您自己尝试并仅使用我的转录作为指导。当您希望提高一种或两种语言的技能时,将算法从一种编程语言转换为另一种编程语言通常是很好的做法。即使你不熟悉C,只要你熟悉Python就可以编写程序,你应该能够获得C代码的要点,因为它有许多相似之处。

无论如何,关于代码。

import itertools, operator

首先,伪随机数生成器,在演示文稿中标识为linear congruential generator。这种类型的PRNG是一种通用算法,可以通过选择acm(维基百科文章中提到的变量)的特定值来“自定义”。以下是通用线性同余生成器的实现:

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]

它通过字符串和每个字符的XOR与一个字节;具体而言,字符i与字节i % 4进行异或。

    for i, c in enumerate(passphrase):
        bits[i & 3] ^= ord(c)

然后将这四个字节按顺序连接在一起,形成一个32位值。 (或者,我可以编写代码将它们从头开始存储为32位数字)

    val = reduce(operator.__or__, (b << 8*i for (i,b) in enumerate(bits)))

这个32位值用作线性同余生成器的种子,具有某些特定值,您可以在代码中看到这些值。原始开发者如何找出这些数字,我不知道。

    keys = []

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

    for i, b in enumerate(itertools.islice(prng(val, 0x343fd, 0x269ec3, 1<<32), 20)):

并从每个数字中仅取右边的第3个字节(第16-23位):

        keys.append((b >> 16) & 0xff)

为什么是第三个?那么,高端的位(右边的第4位)往往没有太大变化,而低端的位可以预测PRNG常数的许多值。

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

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

答案 1 :(得分:1)

我不确定该网站正在谈论什么“事实上的标准”,但我相当确定路由器制造商都实施了他们自己的方法。无论你怎么做,只要相同的输入总是产生相同的输出;这是一个方便,所以WEP用户可以记住密码而不是实际的十六进制密钥。甚至您发布的PDF中的方法也很模糊;它使用未定义的PRNG(并且每种类型的PRNG将给出不同的结果),并从每个结果中取“一个字节”而不指定哪个。如果您正在尝试对特定路由器的方法进行逆向工程,请在帖子中提及,我们可能会发现它是如何工作的,但是没有标准方法