问小白 wenxiaobai
资讯
历史
科技
环境与自然
成长
游戏
财经
文学与艺术
美食
健康
家居
文化
情感
汽车
三农
军事
旅行
运动
教育
生活
星座命理

用零知识证明实现地图的三染色问题

创作时间:
作者:
@小白创作中心

用零知识证明实现地图的三染色问题

引用
1
来源
1.
https://www.cnblogs.com/jamespai/p/15700056.html

零知识证明是一种密码学协议,它允许一方(证明者)向另一方(验证者)证明某个陈述是真实的,而无需透露任何额外的信息。本文将介绍如何使用零知识证明来实现地图的三染色问题,即用三种颜色染色一个地图,保证任意两个相邻的地区都是不同的颜色。

题目背景

假设一个交互协议有证明者Alice和验证者Bob。Alice手里有一个地图三染色的答案,这个图总共有6个顶点和6条边。现在Alice想证明给Bob她有答案,但是又不想让Bob知道这个答案。请用零知识证明的思想设计实验并验证至少20次的结果。

测试数据

  1. 边集:(1, 2), (1, 4), (1, 3), (2, 5), (3, 6), (5, 6)
    颜色集:(1: 0, 2: 1, 3: 2, 4: 1, 5: 2, 6: 0)

  2. 边集:(1, 2), (1, 4), (1, 3), (2, 3), (2, 5), (2, 6), (3, 4), (3, 6), (5, 6)
    颜色集:(1: 0, 2: 1, 3: 2, 4: 1, 5: 2, 6: 0)

  3. 边集:(1, 2), (1, 4), (1, 3), (2, 3), (2, 5), (2, 6), (3, 4), (3, 6), (5, 6)
    颜色集:(1: 0, 2: 1, 3: 1, 4: 2, 5: 2, 6: 0)

实验思路

  1. Alice 先要对染过色的图进行一些变换,把颜色做一次全改,例如把所有的绿色变成橙色,把所有的黄色变成蓝色,把所有的红色变成粉色。然后 Alice 得到了一个新的染色答案,这时候她把新的图的每一个顶点都用纸片盖上,然后出示给 Bob 看。
  2. Bob 要随机挑选一条边,并由Alice揭开这条边两端的纸片,让Bob检查,Bob发现这两个顶点的颜色是不同的,那么Bob认为这次检验同构。
    经过多次验证,可以证明Bob认为这个图满足三染色的要求。

实验步骤

  1. 使用 Python 的 networkx 库生成图
  2. 根据用户选择的测试数据(a、b、c)初始化图的边和颜色
  3. 生成随机颜色
  4. 更新图的颜色
  5. 验证者随机选择一条边进行检查

代码实现

import random  
import matplotlib.pyplot as plt  
import networkx as nx  
import numpy as np  

# 初始化结点颜色  
color0='red'  
color1='yellow'  
color2='green'  

# 构造空的无向图  
graph= nx.Graph()  

# 添加结点  
node_list = [1,2,3,4,5,6]  
for i in range(0,5):  
    graph.add_node(node_list[i])  

# 添加测试数据的边与颜色  
n = str(input('请选择图a,图b,图c'))  
if n=='a':  
    edge_list=[(1, 2), (1, 4), (1, 3), (2, 5), (3, 6), (5, 6)]  
    colors=[color0,color1,color2,color1,color2,color0]  
elif n=='b':  
    edge_list = [(1, 2), (1, 4), (1, 3), (2, 3), (2, 5), (2, 6), (3, 4), (3, 6), (5, 6)]  
    colors=[color0,color1,color2,color1,color2,color0]  
elif n=='c':  
    edge_list=[(1, 2), (1, 4), (1, 3), (2, 3), (2, 5), (2, 6), (3, 4), (3, 6), (5, 6)]  
    colors=[color0, color1, color1, color2, color2, color0]  

graph.add_edges_from(edge_list)  

# 画原始图形  
nx.draw(graph, pos=nx.spring_layout(graph), with_labels=True, font_size=20, node_size=500, node_color=colors)  
plt.show()  

# 随机生成颜色函数  
def randomcolor():  
    colorArr = ['1','2','3','4','5','6','7','8','9','A','B','C','D','E','F']  
    color = ""  
    for i in range(6):  
        color += colorArr[random.randint(0,14)]  
    return "#"+color  

# 修改颜色  
def changeColor():  
    color0=randomcolor()  
    color1=randomcolor()  
    color2=randomcolor()  
    if n == 'a':  
        colors = [color0,color1,color2,color1,color2,color0]  
    elif n == 'b':  
        colors = [color0,color1,color2,color1,color2,color0]  
    elif n == 'c':  
        colors = [color0, color1, color1, color2, color2, color0]  
    return colors  

# 验证过程  
for _ in range(20):  
    colors = changeColor()  
    nx.draw(graph, pos=nx.spring_layout(graph), with_labels=True, font_size=20, node_size=500, node_color=colors)  
    plt.show()  
    edge = random.choice(list(graph.edges))  
    print(f"验证边:{edge}")  
    print(f"颜色:{colors[edge[0]-1]}, {colors[edge[1]-1]}")  
    assert colors[edge[0]-1] != colors[edge[1]-1], "验证失败!"  
    print("验证成功!")  

这段代码实现了零知识证明的基本流程:Alice 通过随机改变颜色来隐藏原始答案,而 Bob 通过随机检查边来验证答案的正确性。经过多次验证,可以确信 Alice 确实拥有正确的三染色方案。

© 2023 北京元石科技有限公司 ◎ 京公网安备 11010802042949号