http://www.7klian.com

交互式零常识证明的演练-数独困难

# Alice: “Okay wait and see..” 
步调6,7,8,9是最难领略的。通过让Bob选择Alice中提供的任何一个解答方案,为验证者提供了确认解答方案正确的时机。 追念一下,她自从完成映射后就无法变动它。 别的,您大概在想:“这证明她大概只是办理方案,而不是特定的办理方案”。 您是100%正确的! 这就是存在选择请求拼图给出的初始数字的原因。这样Alice无法作弊,因为Bob可随时选择索要这些号码,并且假如这是另一种解答方案,显然它们将不匹配。
尽量有许多要领可以结构ZKP,但在本文中,我将给出一个演练(包括完整的代码片断),说明如作甚仅利用散列函数作为理睬的数独谜题办理方案建设ZKP。ZKP一开始领略起来大概会让人望而生畏,因此我真的相信数独拼图是领略ZKP如安在很高的条理上事情的一个很好的例子。别的,数独是大大都人都熟悉的对象。但让我们切入正题。
        0,0,0,0,0,0,0,3,6,
    return solution
        4,9,6,3,2,7,8,5,1,

然后,她通过用对应的随机数对每个单位格举办散列来建设对屏蔽解答方案的理睬,将该理睬发送给Bob,并要求Bob选择行,列,子网格或已知数字集。

    # Indices of given values
    return [iterable[i:i+size] for i in range(0, len(iterable), size)]
零常识:验证措施除了断言外,不剖析其它语句的任何信息

约束力(Binding):一小我私家理睬后不能再宣称本身已经理睬了另一个值:

permutations = create_permutations()
S = {“Rock”, ”Paper”,”Scissors”}
最后,举办查抄以确认1–9中的所有数字都存在而且仅呈现一次:
        8,0,3,0,5,0,9,0,2,
        0,2,8,0,0,0,0,0,0 
def puzzle_columns(puzzle):
    subgrids = []
此刻,我们可以将所有这些成果组合在一起,以建设协议的观念证明并验证其正确性:
配置一个:
        8,1,3,4,5,6,9,7,2,
    return subgrids
    return nonces
    return list(zip(*puzzle_rows(puzzle)))
1.Alice建设数独数字的分列,有效的要领是对每个数字举办一对一的映射。1->3,2->8…。

零常识协议发源于80年月,最初是由Shafi Goldwasser,Silvio Micali和Charles Rackoff在麻省理工学院提出的。更精确地说,他们描写了一种交互式证明系统,个中涉及一个当事方(“证明方”)向另一方(“验证方”)证明某项告诉创立。
        2,5,7,1,9,8,4,3,6,
同样,暗码学大概对此有办理方案。假如我汇报您,可以制止共享您的数据怎么办。譬喻与其将完整的薪水概览和事情具体信息发送给租赁机构以举办信用查抄,不如仅发送证明您每年收入高出4万的证明。这正是零常识证明(ZKP)所提供的!
另外,以下是建设数独办理方案理睬的成果:
    permutations = [0] + permutations
步调5通过建设理睬并将其发送给Bob,Alice理睬了本身的解答方案,因此无法变动它(或映射)。
        6,4,5,8,7,3,2,1,9,

埋没(Hiding):很难区分差异代价的理睬。

    for x in iterable:
Bob和Alice配合共享Cᴬ,Alice和Bob配合共享Cᴮ。请留意,到此刻为止,它们都理睬了这些值。

third_row = puzzle_rows(permuted_solution)[2]

    return [sha256((str(nonce)+str(val)).encode(‘utf-8’)).hexdigest() for nonce, val in zip(nonces, puzzle)]
    digit_mask = [0 for i in range(9)]
请留意,这是交互式ZKP的很是根基的界说。有各类百般更巨大的交互式/非交互式ZKP,可是对付本演练而言,此界说就足够了。
    ]
        3,8,9,2,6,1,7,4,5,
def flatten(iterable):
进修如何通过利用零常识证明要领解答数独,并用Python构建PoC。
为了更清楚地说明这一点,让我们来看一个常见嫌疑人的例子。Alice和Bob抉择玩一个石头,铰剪,布的数字游戏。他们都做出选择并互换功效,以便确定赢家。在数字世界中,个中一个必需首先共享他/她的选择,这使她/他处于倒霉的位置,因为他/她可以在查察另一位玩家选择的功效后再共享差异的选择。这正是理睬方案要办理的问题!
如上所示,对付理睬,利用SHA256哈希算法。另外,以下是将拼图分为行,列和子网格的代码:
我但愿这此刻更有意义。让我们继承利用Python开拓一个小的PoC证明。您可以在此处找到完整的代码:
            subgrids.append(flatten([rows[j+k][i:i+size] for k in range(size)]))
配景常识

Bob选择了一个,Alice向他发送了与Bob的选择相对应的随机数和分列数字。

完整性:验证者必需拒绝所有无效的证明
Cᴬ = sha256(Rᴬ || Pᴬ) and Cᴮ = sha256(Rᴮ || Pᴮ)
assert sudoku_verification == True
    random.shuffle(permutations)
    return [item for sublist in iterable for item in sublist]
理睬方案(Commitment Schemes)
别的,他们可以按照本身的选择建设理睬并共享理睬,而不是实际选择! 譬喻:
将此配景化为常见的Alice/Bob示例,我们可以思量以下场景:Alice偶尔发明白一个在线角逐,需要解开一个谜题,并得到100英镑的奖金。她请求Bob的辅佐,假如他们中的任何一个办理了,他们同意等分奖金。不久之后,Bob声称本身已包办理了问题,Alice请他分享办理方案。然而Bob不肯意分享,因为他认为Alice可以本身提交办理方案,而不分享奖金。因此,他正在寻找一种安详的要领来向Alice证明他有办理方案,但又不直接与她分享。是的,你猜对了!ZKP正是他所追求的!
        5,2,8,9,3,4,1,6,7

    solution = [
Python ZKP PoC

假如Bob选择了已知号码列表,他还将查抄映射是否正确。即让M为映射,使n为1–9的整数:M(n)==吸收到的已知数字列表。
理睬方案是ZKP的要害构成部门,总体而言,它是加密的要害部门。简而言之,它们是暗码原语,它答允当事方理睬特定的代价而无需透露实际代价,同时提供一种方法来展现代价并在今后的阶段中验证理睬。
Bob和Alice都别离从S中随机选择Pᴬ和Pᴮ。此刻他们计较:(||->暗示串联)

        random.SystemRandom().getrandbits(256) for _ in range(9**2)
由于生成和求解数独不在本文的接头范畴内,我将临时利用静态数独,但可以随时用代码替换它,每次生成一个新的数独拼图:

简述
def solve_sudoku_puzzle(puzzle):
数独ZKP

    return all(digit_mask)
        4,9,0,0,0,0,0,0,0,
矫正式地说,让C作为理睬方案,它必需提供以下两个属性:

3.她在数独办理方案的编号上应用了映射,以获取被掩盖的解答方案。留意,通过对值举办分列,数字只会呈现一次,因为它是一对一映射。

def puzzle_commitment(puzzle, nonces):
执行步调1、3时,验证者不会相识任何有关谜题解答方案的信息。
很自然,你的脑海中已经呈现了关于这些步调的问号,所以请继承存眷这些步调背后的根基道理。
assert commitment_verification== third_row_commitment
        digit_mask[x-1]=1
commitment_verification = puzzle_commitment(third_row, third_row_nonces)
健全性:验证人必需接管每一个有效的证明
        for j in range(0,n,size):
# Bob: “I don’t believe you!”
更重要的是,有须要强调这种要领的靠得住性误差。追念一下,稳健性是ZKP Verifier接管所有有效证明的属性。在这种环境下,由于验证者可以选择28种选择(3n + 1),这意味着协议的回应仅为1/28%,这意味着存在1-1/28的回应错误! 换句话说,在一次迭代之后,验证者仅能确保1/28是有效的证明。那不是很高,不是吗? 因此,可以对上述步调举办多次迭代,以将健全性误差低落到可以忽略的值。(可以利用贝叶斯法则来揣度每次迭代的健全率)
    permutations = list(range(1,10))
nonces = gen_nonces()
        9,6,0,0,0,0,3,0,8,
    return chunk(puzzle, 9)

建设理睬方案的一种要领是利用单向哈希函数和加密安详的随机字节。应该留意的是,在这种环境下,该方案的安详性由哈希函数自己的加密假设(即它是单向的)来节制。

此代码仅用于演示目标,大概不具有安详性,因此请不要在出产情况中利用。
    ]
    ]

假如Bob选择了已知号码列表,则Alice还将最初生成的一对一映射发送给他。然后,Bob验证分列后的值确实只呈现过一次,并利用随机数从头建设理睬,以验证Alice的理睬。

def puzzle_subgrids(puzzle, size=3, n=9):

郑重声明:本文版权归原作者所有,转载文章仅为传播更多信息之目的,如作者信息标记有误,请第一时间联系我们修改或删除,多谢。