Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/291.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Hash 查找哈希()以0000开头的字符串_Hash_Python - Fatal编程技术网

Hash 查找哈希()以0000开头的字符串

Hash 查找哈希()以0000开头的字符串,hash,python,Hash,Python,我的教授给了我一个任务,不幸的是我真的很困惑 任务: 查找hashD1包含等于0的4个前字节的字符串D1。 所以它看起来应该是0000 正如我所知,我们不能仅仅解密散列,而逐个检查它们是一种毫无意义的工作 我的教授给了我一个任务 查找hashD1包含等于0的4个前字节的字符串D1。所以它看起来应该是0000 正如我所知,我们不能仅仅解密散列,而逐个检查它们是一种毫无意义的工作 在这种情况下,这项工作似乎并非毫无意义。相反,你做这项工作是因为你的教授让你做 一些评论者提到,您可以将比特币区块链视为

我的教授给了我一个任务,不幸的是我真的很困惑

任务:

查找hashD1包含等于0的4个前字节的字符串D1。 所以它看起来应该是0000


正如我所知,我们不能仅仅解密散列,而逐个检查它们是一种毫无意义的工作

我的教授给了我一个任务

查找hashD1包含等于0的4个前字节的字符串D1。所以它看起来应该是0000


正如我所知,我们不能仅仅解密散列,而逐个检查它们是一种毫无意义的工作

在这种情况下,这项工作似乎并非毫无意义。相反,你做这项工作是因为你的教授让你做

一些评论者提到,您可以将比特币区块链视为散列的来源,但这只有在您感兴趣的散列与比特币double-SHA256使用的散列相同的情况下才会起作用

一般来说,最简单的解决方法就是暴力:

伪代码a-la-python

for x in range(10*2**32):  # Any number bigger than about 4 billion should work
    x_str = str(x)  # Any old method to generate some bytes to hash should work
    x_bytes = x_str.encode('utf-8')
    hash_bytes = hash(x_bytes)  # assuming hash() returns bytes 
    if hash_bytes[0:4] == b'\x00\x00\x00\x00':
        print("Found string: {}".format(x_str))
        break

我编写了一个简短的python3脚本,它反复尝试散列随机值,直到找到一个SHA256散列有四个前导零字节的值:

import secrets
import hashlib

while(True):
    p=secrets.token_bytes(64)
    h=hashlib.sha256(p).hexdigest()
    if(h[0:8]=='00000000'): break

print('SHA256(' + p.hex() + ')=' + h)
SHA256(21368dc16afcb779fdd9afd57168b660b4ed786872ad55cb8355bdeb4ae3b8c9891606dc35d9f17c44219d8ea778d1ee3590b3eb3938a774b2cadc558bdfc8d4)=000000007b3038e968377f887a043c7dc216961c22f8776bbf66599acd78abf6
在我的老式戴尔笔记本电脑上运行几分钟后,它发现一个值,其SHA256哈希值有四个前导零字节:

import secrets
import hashlib

while(True):
    p=secrets.token_bytes(64)
    h=hashlib.sha256(p).hexdigest()
    if(h[0:8]=='00000000'): break

print('SHA256(' + p.hex() + ')=' + h)
SHA256(21368dc16afcb779fdd9afd57168b660b4ed786872ad55cb8355bdeb4ae3b8c9891606dc35d9f17c44219d8ea778d1ee3590b3eb3938a774b2cadc558bdfc8d4)=000000007b3038e968377f887a043c7dc216961c22f8776bbf66599acd78abf6
以下命令行命令验证此结果:

echo -n '21368dc16afcb779fdd9afd57168b660b4ed786872ad55cb8355bdeb4ae3b8c9891606dc35d9f17c44219d8ea778d1ee3590b3eb3938a774b2cadc558bdfc8d4' | xxd -r -p | sha256sum
正如预期的那样,这将产生:

000000007b3038e968377f887a043c7dc216961c22f8776bbf66599acd78abf6
编辑5/8/21

根据我在下面评论中与的对话,脚本的优化版本

import secrets
import hashlib

N=0
p=secrets.token_bytes(32)
while(True):
    h=hashlib.sha256(p).digest()
    N+=1
    if(h.hex()[0:8]=='0'*8): break
    p=h

print('SHA256(' + p.hex() + ')=' + h.hex())
print('N=' + str(N))
此版本的脚本使用上一次迭代的哈希函数输出作为当前迭代中哈希函数的输入,而不是在循环的每次迭代中生成新的随机数作为哈希函数的输入。在我的系统上,这是每秒迭代次数的四倍。在20分钟多一点的时间里,它在1483279719次迭代中找到了一个匹配项:

$ time python3 findhash2.py
SHA256(69def040a417caa422dff20e544e0664cb501d48d50b32e189fba5c8fc2998e1)=00000000d0d49aaaf9f1e5865c8afc40aab36354bc51764ee2f3ba656bd7c187
N=1483279719

real    20m47.445s
user    20m46.126s
sys 0m0.088s

字符串$Eo的sha256散列为0000958bc4dc132ad12abd158073204d838c02b3d580a9947679a6

这是使用下面的代码发现的,该代码将字符串限制为仅限UTF8键盘字符。它循环处理每个1个字符字符串的散列,从技术上讲,它散列字节,而不是字符串,然后是每个2个字符字符串,然后是每个3个字符字符串,然后是每个4个字符字符串,它从来都不需要到4个字符,所以我不能100%确定函数这一部分的数学是正确的

包含“限制”值,以防止在未找到匹配项的情况下代码永远运行。由于在29970次迭代中找到了匹配项,并且执行时间几乎是瞬间的,因此不需要这样做

!/usr/bin/env python -*-编码:utf-8-*- 从hashlib导入sha256 utf8_chars=listrange0x21,0x7f def make_Strattent: 如果尝试<94: c0=[尝试%94] elif尝试>=94且尝试<8836: c2=尝试//94 c1=尝试%94 c0=[c2,c1] elif尝试>=8836且尝试<830584: c3=尝试//8836 c2=尝试-8836*c3//94 c1=尝试%94 c0=[c3,c2,c1] elif尝试>=830584且尝试<78074896: c4=尝试//830584 c3=尝试-830584*c4//8836 c2=830584*c4-8836*c3//94 c1=尝试%94 c0=[c4,c3,c2,c1] 返回字节[utf8\u字符[i]表示c0中的i] 目标='0000' 限额=1200000 尝试=0 哈希值=sha256 hash_value.updatemake_strattent
而hash_value.hexdigest[0:4]!=目标和尝试提示:查看散列。查看。逐个检查它们是一种毫无意义的工作-确切地说。这就是为什么你应该写一个脚本为你做的工作!或者,看看比特币区块链。找到的任何块都将有一个包含四个加上更多前导零的散列。您可以使用其中任何一个解决您的问题。@phbits完全正确!很少成为那里的关键词;这正是为什么挖掘比特币的计算量如此之大:要找到一个散列到前导零数正确的值,需要大量的尝试和错误。使用比特币时,它们会改变所需的前导零数,以降低人们发布数据块的速度。这是一个很好的家庭作业问题,因为它会让你对保持比特币安全的潜在硬度问题有一个很好的直觉。说得好,@MikeOunsworth。实际上比特币给了你SHA256d=doubledOh,我完全忘记了这一点。好的,我的双腿。谢谢是的,对于40字节,找到一个需要多长时间?嗨,凯拉拉卡。很好的分析。我在我的笔记本电脑上运行了上面的脚本,花了大约5分钟才找到上面的匹配项。我想你很幸运找到了一个。我正在运行您的,我不希望在有意义的时间内输出。6小时后将其中断。没有输出。@kelalaka我添加了一个计数器。我还做了一个小改动来优化脚本。优化后的脚本在1483279719次迭代中找到了一个匹配项 超过20分钟。有关更多信息,请参见上面的编辑。哦,你不是很高兴你没有亲自一个一个地检查吗?