有两个障碍:编写在GPU上执行的程序。AFAIK,目前没有任何机制可以将Python程序转换为GPU执行的代码。所以除非你能找到你需要的东西(这可能是有可能的,因为它看起来是一个相当常见的用例),否则你必须使用一种GPU编程语言(CUDA,OpenCL,Haskell,…)
从Python调用GPU上运行的程序,并交换数据。有几个Python+CUDA项目可以做到这一点:
通过适当的搜索,你可能会发现更多。
然后,Python程序将使用第2部分中的技术之一或等效技术加载并调用GPU“内核”(使用本答案第1部分中的技术创建的程序)。
编辑
您可以生成整个“暴力”值集,以及GPU上的md5散列。然后使用Python检索结果。这可能比用Python生成值、将它们传递给GPU,然后取回md5更容易
如果我理解了,程序将生成所有1个字符、2、3、4、5和6个小写字母字符串,并生成一个md5散列,是吗?
Edit2-我之前的分析完全错误-我道歉
Edit3:SkimmingWikipedia MD5看起来可以优化计算定长字符串(例如6个ASCII字符)的MD5。
根据维基百科的伪代码,它只有64个循环,16个循环的迭代组使用相同的算法。因此,如果密钥小于55字节,计算的核心可以从以下位置“展开”:for i from 0 to 63
if 0 ≤ i ≤ 15 then
f := (b and c) or ((not b) and d)
g := i
else if 16 ≤ i ≤ 31
f := (d and b) or ((not d) and c)
g := (5×i + 1) mod 16
else if 32 ≤ i ≤ 47
f := b xor c xor d
g := (3×i + 5) mod 16
else if 48 ≤ i ≤ 63
f := c xor (b or (not d))
g := (7×i) mod 16
temp := d
d := c
c := b
b := b + leftrotate((a + f + k[i] + w[g]) , r[i])
a := temp
end for
致:// i == 0
f := (b and c) or ((not b) and d) // +4 ops
// g := i
temp := d
d := c
c := b
b := b + leftrotate((a + f + k[0] + w[0]) , r[0]) // 9 ops
a := temp
// i == 1
f := (b and c) or ((not b) and d)
// g := i
temp := d
d := c
c := b
b := b + leftrotate((a + f + k[1] + w[1]) , r[1])
a := temp
这种展开会导致一些数组索引为常量,这将允许一个好的GPU编译器执行更多的常量传播。这可能会带来显著的改善。每个步骤大约有9个操作,编译器将需要洗牌5个数据片段,因此大约14个操作/步骤*64个步骤,大约1000个操作。
编辑4:
快活!我读过更多的维基百科MD5算法-MD5比我想象的更容易攻击。每组16个中只有前两个循环直接使用6字节的变量键字符串,其余的字符串是常量。算法的其余部分是洗牌和按位操作,这些操作可能需要进行非常重要的进一步优化。每16个循环中只有2个涉及到密钥,那么可能会快8倍,甚至超过4倍
所以不是1024核的GPU,以1GHz的频率运行,给出1024个哈希/微秒,而是4096/微秒或8096/us=4-8个哈希/纳秒
大约有27^6个键=387420489个键,因此有md5散列。
387420489键/4-8/纳秒大约=0.05-0.1秒
主机和GPU之间的通信将相当缓慢,但不太可能超过100%。
大约在0.1秒到0.2秒之间。
md5哈希是16字节,因此如果要存储它,则将消耗6.2 GB。在两个现代gpu上,每个gpu只需要两次传输,但开销非常大。如果哈希值保存到磁盘(甚至使用SSD),或通过10Gbit以太网移动,则哈希生成将被I/O时间淹没。
只有94个可打印的ASCII字符,因此对于每个ASCII 6字符的密钥:
94^6=689869781056键/4-8/纳秒=86-172秒
哦天哪!-(一)
长钥匙,还有比MD5更好的东西!
也许试着编写一个Python程序来生成最佳的GPU算法?
通过在Python程序中“展开”循环来生成GPU“内核”的文本,并打印直线计算的文本,所有常量都被填充在。
然后尝试找出计算每个密钥长度的MD5的最佳指令序列。使用展开程序,尝试跟踪每个位上的操作和依赖项,然后尝试将这些位及其操作重新组合为连续的32位字和新的直线计算。(公平地说,也许GPU编译器可以做到这一点?可能很有意思)