首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何创建可重新创建的散列?

如何创建可重新创建的散列?
EN

Cryptography用户
提问于 2022-01-07 17:56:43
回答 1查看 220关注 0票数 3

最近我偶然发现了一段YouTube视频,视频解释了一场赌场游戏。简单地说,它们为你的初始投资随机产生一个乘数。这个乘数应该由一个散列值作为后盾。赌场还向客户提供第一个游戏的初始哈希值和乘法器的每个后续滚动的哈希值。客户应该通过将其应用于以下Python函数来验证随机生成的散列:

代码语言:javascript
复制
def get_prev_game(hash_code):
    m = hashlib.sha256()
    m.update(hash_code.encode("utf-8"))
    return m.hexdigest()

将结果哈希一次又一次地放入此函数中,当然会导致最初的游戏哈希。

现在我的问题是:由于这个get_prev_game函数基本上是一次又一次地散列哈希值,直到它到达第一个哈希值为止,我真的想知道如何创建赌场侧的下一个哈希值?这难道不意味着他们必须创建一个新的哈希,与前一个哈希匹配吗?我认为这应该是很难解决的问题。也许我漏掉了什么。谢谢你事先给我的解释!

PS:我不知道我是否可以上传YouTube视频,但这是/watch?v=F1HA7e3acSI

编辑:我增加了计算乘数的函数。从统计学上看,这个游戏是不可能赢的。我更感兴趣的是,他们是如何产生新的哈希,以及如何回溯以前的哈希。

代码语言:javascript
复制
def get_result(game_hash):
    hm = hmac.new(str.encode(game_hash), b'', hashlib.sha256)
    hm.update(salt.encode("utf-8"))
    h = hm.hexdigest()
    if (int(h, 16) % 33 == 0):
        return 1
    h = int(h[:13], 16)
    e = 2**52
    return (((100 * e - h) / (e-h)) // 1) / 100.0
EN

回答 1

Cryptography用户

回答已采纳

发布于 2022-01-07 19:47:50

这只是赌场的一个杂乱无章的承诺,而这不是图像前的问题。

在所有游戏开始之前,赌场选择一个seed并将其散列2M次。让H^{s}(m)在级联中表示哈希m s-time

H^{s}(m) = \underbrace{H(H(\ldots (H(m) ))}_{s-times}

第一场比赛从H^{2000000}(seed)开始

当第二场比赛以H^{1999999}(seed)开始时,他们会这么说;

  • 听着,我们不是在使用随机种子游戏,我们是在我们的承诺上。通过散列这个游戏哈希来检查它,并看到结果是前一个游戏的哈希。

H^{2000000}(seed) = H(H^{1999999}(seed))或通用的i第四游戏(为了清晰起见省略2000000-i+1 );

H^{i}(seed) = H(H^{i-1}(seed))

因此,它们可以说服一些赌徒,而不是真正的加密者,因为最初的种子选择不是基于公证下的真正随机性。

他们可以简单地搜索一个总是对赌场有利的种子,而不是依赖于密码散列的预期的均匀随机性。统一的随机性只是告诉我们,有200万级联哈希,赌场将永远失去。他们只会消除这些情况。

用户无法找到未玩游戏的散列,因为SHA-256在2^{256}周围有一个预图像抵抗成本。他们只能核实这一承诺是否正在进行。

赌场使用这些散列承诺的主要原因是要向玩家保证,当他们玩游戏时,他们的行为对他们获胜的概率没有影响。特别是桩的变化。他们向你保证,当你打开游戏的时候,你会被分配一个2米的乘数序列,你的电脑在每次旋转后都会检查,以确保他们仍然符合他们的承诺。

这样,如果在以5美元下注100次后,你决定把赌注降低到25美分,而在第一次尝试时,你得到了一个巨大的乘数,至少你知道他们不是故意的!

票数 4
EN
页面原文内容由Cryptography提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://crypto.stackexchange.com/questions/98017

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档