【问题标题】:Is it possible to crack SHA256, when you know the answer is a coordinate?当您知道答案是坐标时,是否可以破解 SHA256?
【发布时间】:2014-02-08 14:09:38
【问题描述】:

我需要破解一个 sha256 哈希,我知道答案在坐标中,但我不知道坐标值是什么 示例:

3f1c756daec9ebced7ff403acb10430659c13b328c676c4510773dc315784e4e
58.375782 26.742632

是否可以创建一个 python 脚本来生成两个变量(两个变量的值都是 00.000000),然后将它们相加(例如:k=i+" "+j),然后将 k 转换为 sha256 并将其与 sha256 进行比较,我是试图破解。如果它不等于被破解的 sha256,那么它添加 i 一个值 (i=i+00.000001) 并再次尝试。等等等等

【问题讨论】:

  • 当然,你可以暴力破解哈希。随着时间的推移..你只需要尝试10**16种组合。
  • 您绝对可以自己编写 Martijn 的答案,您在问题中描述了算法。
  • 那个坐标字符串不会产生那个特定的哈希摘要。坐标输入字符串的精确格式是什么?在我的回答中,我假设散列函数是一个xx.xxxxxx yy.yyyyyy 坐标;例如一个数字,格式为 2.6 位,填充为 0,两个坐标之间有一个空格。
  • 如果您正在寻找比蛮力更好的 SHA256 攻击方法……已知有用于创建冲突的预映像攻击,但没有公开的攻击(截至 2014 年)用于反转哈希。 Wikipedia 在外行层面上描述了它们。如果您想真正利用它们,则需要了解更多详细信息。如果有人最近发现了新的攻击,他们将其发布为您问题的答案而不是在各种公共加密论坛上的可能性似乎很小。

标签: python coordinates sha256 cracking


【解决方案1】:

00.00000099.999999 之间生成所有可能的坐标非常简单:

from itertools import product
import hashlib

digits = '0123456789'

for combo in product(digits, repeat=16):
    coords = '{}.{} {}.{}'.format(
        ''.join(combo[:2]), ''.join(combo[2:8]),
        ''.join(combo[8:10]), ''.join(combo[10:]))
    hash = hashlib.sha256(coords).hexdigest()
    if hash == '3f1c756daec9ebced7ff403acb10430659c13b328c676c4510773dc315784e4e':
        print coords
        break

这将暴力破解所有 10**16(一个很大的数字)组合。坐下来放松一下,这需要一段时间。

而“一段时间”,我们真正的意思是不是在你的有生之年,也不是在任何其他人的。仅迭代product() 生成的所有可能组合需要大量时间,因为尝试添加的每个数字都会将所需时间增加 10 倍:

>>> from collections import deque
>>> from itertools import product
>>> from timeit import timeit
>>> digits = '0123456789'
>>> timeit(lambda: deque(product(digits, repeat=8), 0), number=5)
3.014396679995116
>>> timeit(lambda: deque(product(digits, repeat=9), 0), number=5)
30.99540744899423

如果生成 8 位数字的所有可能组合需要 0.8 秒(4 秒除以 5 次重复),9 位数字需要 8 秒,那么您可以推断 10 位数字几乎需要 1.5 分钟,等等。只需生成所有可能的组合16 位数字需要 100 万 (10 ** 6) 倍的时间,是 10 位数字的时间,因此循环运行需要 963 天或 3 。您可以将此任务拆分为大量计算机上的 2000 个不同进程,这些计算机的内核总数足以并行运行这些进程,从而将时间缩短到 12 小时以下。

那么循环体本身每百万次迭代大约需要 2.4 秒:

>>> from random import choice
>>> combo = tuple(choice(digits) for _ in range(16))  # random combination for testing
>>> timeit("""\
... coords = '{}.{} {}.{}'.format(
...     ''.join(combo[:2]), ''.join(combo[2:8]),
...     ''.join(combo[8:10]), ''.join(combo[10:]))
... hash = hashlib.sha256(coords).hexdigest()
... if hash == '3f1c756daec9ebced7ff403acb10430659c13b328c676c4510773dc315784e4e': pass
... """, 'from __main__ import combo; import hashlib')
2.3429908752441406

但是你的工作量比这多 10 ** 10(10 亿)倍,总共大约 743 的计算工作。即使能够运行 20,000 个并行进程也不会将其减少到一个合理的数字(这仍然是大约 13.5 年的工作)。

Python 的速度不足以完成这项任务。使用 GPU 应该可以达到500 million hashes per second (0.5 Gigahash / s),此时您可以运行上述蛮力操作并在大约 230 天内在这样的系统上找到解决方案。当然,这是有代价的,因为这样的钻机每月运行成本约为 3000 至 4000 美元!但如果有足够的专用硬件,您当然可以“破解”“人道”时间线中的哈希值。

【讨论】:

  • 虽然“一会儿”比“比宇宙热寂的时间还长”要好得多。假设没有并行化,我的猜测是几年(最多三个月)。
  • 也许你只能统计地球上陆地面积的坐标来消除不必要的计算。
  • 它们似乎是全球定位坐标,所以范围可能是 [-180..+180], [-90..+90]
【解决方案2】:

关于哈希的常见说法之一是它们会丢弃信息,因此它们不能被逆转。有无限的消息具有相同的哈希值。您无法知道给出相同哈希的无限消息中哪些是正确的。

当然,在实践中,蛮力攻击通常会奏效 - 要么是因为您的搜索策略很可能首先找到真正的原始消息(大多数具有哈希冲突的消息在某些微不足道的方面显然是错误的 - 例如错误的格式 - 并赢得了'不会因此出现在搜索中)或者因为您的攻击需要具有相同哈希值的不同消息。

在您的情况下,您对消息的了解意味着消息中的信息少于(显然)哈希中的信息。当然,散列不会创建新信息,因此这意味着任何坐标字符串都不会出现许多散列。您(对于良好的哈希算法很有可能)可能的哈希和可能的消息之间存在 1:1 的关系。原则上,您有一个可以解密的加密形式的消息。

当然,很多人会因为我这么说而称我为白痴。毕竟,您仍然必须找到所有可能消息的所有哈希值。这可能比某些人想象的要快,但距离微不足道还有很长的路要走。

已经指出,根据您的坐标格式,有 10^16 种可能的组合。要检查的一件事是所有这些数字的所有值是否都是可能的(并且同样可能)。在内部使用浮点运算应该不是问题——双精度浮点数不是 8 位小数,但 53 位尾数应该足以确保所有这些十进制数字都被完全使用。但是,可能值得检查的是,没有其他限制可以减少要检查的案例数量 - 显而易见的限制是这些坐标的测量精度。

即使某些数字值的可能性比其他数字值小,这意味着先排序搜索以检查更可能的值将为破解者节省大量时间。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-03-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多