是否可以使用 GPU 来加速 Python 中的哈希?

2023-12-29

我最近读了 Jeff 的博客文章,标题为速度哈希 http://www.codinghorror.com/blog/2012/04/speed-hashing.html,其中他提到,您可以通过利用 GPU 的强大功能来非常快速地对事物进行哈希处理。

我想知道是否可以利用 GPU 的强大功能来对 Python 中的内容进行哈希处理(md5、sha-1 等)?

我对此很感兴趣,因为我想看看我能以多快的速度暴力破解事物(不是现实世界的东西,来自旧的泄漏数据转储)。

目前,我正在做这种事情(简化示例):

from itertools import product
from hashlib import md5

hashes = ["some","hashes"]

chars = []
for i in range(97,123): # a-z only
    chars.append(chr(i))

for i in range(1,6): # all combos of a-z, 1-5 chars
    for c in product(chars,repeat=i):
       s = ''.join(c)
       if md5(s).hexdigest() in hashes:
           print "Found",s

但我想知道是否有办法使用 GPU 来加速?我猜我需要一个能够连续生成这样的哈希值的模块 - 有人知道吗?


有两个障碍:

  1. 编写一个在 GPU 上执行的程序。 AFAIK,目前没有可用的机制将 Python 程序转换为 GPU 执行的代码。因此,除非您能找到您需要的东西(这可能是可能的,因为它看起来像是一个相当常见的用例),否则您将必须使用一种 GPU 编程语言(CUDA、OpenCL、Haskell 等)来实现这一点。 .)
  2. 从Python调用GPU上运行的程序,并交换数据。有几个 Python+CUDA 项目可以完成这部分工作:

    • http://mathema.tician.de/software/pycuda http://mathema.tician.de/software/pycuda
    • http://code.google.com/p/pystream/ http://code.google.com/p/pystream/
    • https://launchpad.net/python-cuda https://launchpad.net/python-cuda

    通过适当的搜索,您可能会发现更多。

    Also Python GPU 编程 https://stackoverflow.com/questions/5957554/python-gpu-programming看起来相关

    然后,Python 程序将使用第 2 部分或同等技术之一加载并调用 GPU“内核”(使用本答案第 1 部分中的技术创建的程序)。

编辑 您可以在 GPU 上生成整套“暴力”值和 md5 哈希值。然后只需使用 Python 检索结果即可。这可能比在 Python 中生成值、将它们传递到 GPU、然后返回 md5 更容易。

如果我理解的话,程序会生成所有 1 个字符、2、3、4、5 和 6 个小写字母字符串,并生成 md5 哈希,是吗?


Edit2 - 我之前的分析完全错误 - 我很抱歉


编辑3:略读维基百科 MD5 http://en.wikipedia.org/wiki/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

to:

// 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 个操作。

Edit4:
Glerk!我阅读了更多关于 Wikipedia MD5 算法的内容 - MD5 比我想象的更容易攻击。每组 16 个,仅前两个循环directly使用6字节的可变密钥字符串,字符串的其余部分是常量。该算法的其余部分是改组和按位运算,这可能需要进行非常重要的进一步优化。每 16 个循环中只有 2 个涉及密钥,那么速度可能会快 8 倍,甚至可能超过 4 倍。

因此,与其说 1024 核 GPU、以 1GHz 运行、提供 1024 哈希/微秒,不如说 4096/微秒或 8096/us = 4-8 哈希/纳秒

大约有 27^6 个密钥 = 387,420,489 个密钥,因此有 md5 哈希值。

387,420,489 个键/4-8/纳秒大约 = 0.05 - 0.1 秒

主机和 GPU 之间的通信会相当慢,但不太可能超过 100%。

所以大约在 0.1 秒到 0.2 秒之间。

md5 哈希值是 16 个字节,因此如果要存储它,将消耗 6.2 GB。在两个现代 GPU 上,每个只需要 2 次传输,但这将是一个非常大的开销。如果哈希值保存到磁盘(即使使用 SSD)或通过 10Gbit 以太网移动,则哈希生成会被 I/O 时间淹没。

只有 94 个可打印 ASCII 字符,因此对于每个 ASCII 6 字符键:

94^6 = 689,869,781,056 个键 / 4-8/纳秒 = 86-172 秒

天啊!-(

长密钥,还有比 MD5 更好的东西!

也许尝试编写一个Python程序来生成最佳的GPU算法?

通过“展开”Python 程序中的循环来生成 GPU“内核”的文本,并打印直线计算的文本,并填充所有常量。

然后尝试找出计算每个密钥长度的 MD5 的最佳指令序列。使用展开的程序,尝试跟踪每个位的操作以及依赖性,然后尝试将这些位及其操作重新组装成连续的 32 位字和新的直线计算。 (公平地说,也许 GPU 编译器无论如何都可以做一些这样的事情?找出答案可能很有趣)

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

是否可以使用 GPU 来加速 Python 中的哈希? 的相关文章

随机推荐

  • 从 JSON 到 NSArray

    我正在使用此处找到的 JSON 框架 http stig github com json framework http stig github com json framework在我的 iPhone 应用程序中 我正在尝试将一些数据解析为
  • 这是 Ruby 中 Array.fill 方法的错误吗? [复制]

    这个问题在这里已经有答案了 应该是这种情况 即我误解了 还是一个错误 a Array new 3 Array new 3 a 1 fill g gt g g g g g g g g g 不应该导致 gt nil nil nil g g g
  • 批处理文件从txt文件中删除前18个字符

    我有一个 txt 文档 其中包含超过 32 000 行带注释的机器代码 它看起来像这样 Display menu window C0 000E E220 SEP 20 C0 0010 C210 REP 10 C0 0012 20640B J
  • HostnameVerifier 接口的不安全实现 - Android

    Play 商店应用被拒绝的原因 您的应用程序正在使用 HostnameVerifier 接口的不安全实现 您可以在此找到有关如何解决该问题的更多信息Google 帮助中心文章 https support google com faqs an
  • grep 查找中间带有通配符的文本

    我想 grep 类似的东西 gt sh lt 但这不起作用 我可以 grep 一切 sh lt 但无法让通配符发挥作用 这里有什么技巧呢 你需要 grep 类似的东西 gt sh lt The 部分匹配任何长度的任何字符 部分匹配一个点
  • gwt 自定义小部件包装方法

    我的自定义小部件如下所示 public class CustomWidget extends Composite public static CustomWidget wrap com google gwt dom client Eleme
  • 如何将 Lua 函数传递给 C 函数并多次执行 Lua 函数?

    我想要做的是创建一个函数 它将迭代一些对象并为每个函数调用一个函数 我使用的是 BlitzMax 而不是 C 但这不是重点 因为它具有 Lua 的 C 函数的完整包装 Lua有一个lua pushcfunction 命令 但是lua pus
  • Python3 + Curses:如何按“q”立即结束程序?

    当我运行以下示例代码并按 q 时 它会正常结束 但是如果我按任何其他字符 例如许多中断和许多其他字符 然后按 q 它不会退出 我该如何解决这个问题 import curses time def main sc sc nodelay 1 wh
  • 如何检查变量是否是数组?...或类似数组的东西

    我想用一个foreach用一个变量循环 但这个变量可以有很多不同的类型 NULL例如 所以之前foreach我测试一下 if is array var foreach var as 但我意识到它也可以是一个实现的类Iterator界面 也许
  • 如何加载(或映射)文件部分最大大小,但适合 Windows 上的 RAM?

    有大文件 我需要快速排序 我将按适合 RAM 的部分处理文件 以避免 程度使用页面文件 下一步 合并部分 如何使用最大内存 我的解决方案 使用WinApi文件内存映射 但我不知道如何获取文件最大大小的一部分 但适合RAM 如何确定大小 Yo
  • Service-Fabric 绑定到多个端点

    是否可以绑定服务结构应用程序来侦听多个端口 基本上 我试图拥有一个面向公众的服务 它侦听 http 80 和 https 443 并将任何 http 请求重定向到 https 我创建了一个新的 ASP net Core 服务 它单独工作正常
  • F# 联合类型列表

    我想要一份报告清单 报告可以是详细信息或部分类型 module Data type Section Header string Lines string list Total string type Detail State string
  • jQuery 复选框

    我正在尝试编写一段 jQuery 代码 如果所有复选框都 未选中 则所有 li 标签的类都为 disabled 但是 如果选中一个复选框 任何复选框 则所有 li 标签都会失去 disabled 类别 非常感谢 checkbox click
  • 如何将字符串复制到剪贴板

    在xcode中如何将文本复制到剪贴板 目前 我正在使用以下代码 UIPasteboard pasteboard UIPasteboard generalPasteboard pasteboard setString shareString
  • 使用base64编码生成Oauth授权令牌

    我正在尝试按照指南为 YAHOO DSP API 生成 Oauth 身份验证令牌 Base64 编码是一种将二进制数据编码为文本的方法 以便可以轻松地在网络上传输而不会出现错误 在此步骤中 您将获取 YDN 控制台为您生成的客户端 ID 和
  • 是否可以将 AWS CodePipeline 与 Lightsail 结合使用?

    我工作了一整天却找不到答案 所以我问你们 是否可以将 AWS Pipeline 与 AWS Lightsail 结合使用 我的目标是将代码存储在 CodeCommit 中 并使用 CodeBuild CodeDeploy CodePipel
  • 龙卷风 ioloop 和龙卷风的工作流程是什么?

    我想了解tornado的内部工作流程 并且已经看到本文 http golubenco org p 16 这很棒 但我就是不明白 在ioloop py中 有这样一个函数 def add handler self fd handler even
  • Delphi 7 创建动画启动画面

    当我的应用程序加载他的数据库时 我试图制作一个动画闪屏 我已经创建了一个闪屏 但我想在数据库转换时使图像从左向右 移动 现在已经搜索了一段时间 但我所能找到的只是进度条 这是我的代码 SplashScreen TSplashScreen C
  • 如何关闭 Firefox 的缓存?

    在开发过程中 我必须始终 清除 Firefox 中的缓存 以使其使用最新版本的 JavaScript 文件 是否有某种设置 about config 可以完全关闭 JavaScript 文件的缓存 或者 如果不是 则适用于所有文件 在 Fi
  • 是否可以使用 GPU 来加速 Python 中的哈希?

    我最近读了 Jeff 的博客文章 标题为速度哈希 http www codinghorror com blog 2012 04 speed hashing html 其中他提到 您可以通过利用 GPU 的强大功能来非常快速地对事物进行哈希处