当你知道答案是坐标的时候,有可能破解SHA256吗?

2024-05-15 09:25:09 发布

您现在位置:Python中文网/ 问答频道 /正文

我需要破解一个sha256散列,我知道答案在坐标中,但我不知道坐标值是多少 示例:

3f1c756daec9ebced7ff403acb10430659c13b328c676c4510773dc315784e4e
58.375782 26.742632

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


Tags: 答案脚本示例sha256有值坐标值heter
2条回答

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秒(4s除以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(10000万)倍,总共大约有743年的计算工作量。即使能够运行2万个并行进程也不能将其减少到一个合理的数字(这仍然是大约13.5年的工作)。

Python还不够快。使用gpu应该可以到达500 million hashes per second (0.5 Gigahash / s),此时您可以运行上述暴力操作,并在大约230天内在这样的系统上找到解决方案。当然是要付出代价的,因为这样的钻井平台一个月的运行费用大约在3000-4000美元之间!但有了足够的专用硬件,你当然可以“破解”在“人道”时间表的杂凑。

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

当然在实践中,暴力攻击经常奏效,要么是因为你的搜索策略可能首先找到真正的原始消息(大多数具有哈希冲突的消息显然在某些琐碎的方面是错误的,例如错误的格式,并且不会因此出现在搜索中),要么是因为你的攻击无论如何都需要具有相同哈希的不同消息。

在您的例子中,您对消息的了解意味着消息中的信息比(显然)散列中的信息少。当然散列不会产生新的信息,所以这意味着不能对任何协调字符串进行许多散列。在可能的散列和可能的消息之间,有一个1:1的关系(对于好的散列算法来说概率非常高)。原则上,您的消息有一个加密形式,可以解密。

当然,很多人会说我是个白痴。毕竟,您仍然需要找到所有可能消息的所有散列。这可能比一些人想象的要快,但离琐事还有很长的路要走。

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

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

相关问题 更多 >