用零知识证明实现地图的三染色问题
创作时间:
作者:
@小白创作中心
用零知识证明实现地图的三染色问题
引用
1
来源
1.
https://www.cnblogs.com/jamespai/p/15700056.html
零知识证明是一种密码学协议,它允许一方(证明者)向另一方(验证者)证明某个陈述是真实的,而无需透露任何额外的信息。本文将介绍如何使用零知识证明来实现地图的三染色问题,即用三种颜色染色一个地图,保证任意两个相邻的地区都是不同的颜色。
题目背景
假设一个交互协议有证明者Alice和验证者Bob。Alice手里有一个地图三染色的答案,这个图总共有6个顶点和6条边。现在Alice想证明给Bob她有答案,但是又不想让Bob知道这个答案。请用零知识证明的思想设计实验并验证至少20次的结果。
测试数据
边集:(1, 2), (1, 4), (1, 3), (2, 5), (3, 6), (5, 6)
颜色集:(1: 0, 2: 1, 3: 2, 4: 1, 5: 2, 6: 0)边集:(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)边集:(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)
实验思路
- Alice 先要对染过色的图进行一些变换,把颜色做一次全改,例如把所有的绿色变成橙色,把所有的黄色变成蓝色,把所有的红色变成粉色。然后 Alice 得到了一个新的染色答案,这时候她把新的图的每一个顶点都用纸片盖上,然后出示给 Bob 看。
- Bob 要随机挑选一条边,并由Alice揭开这条边两端的纸片,让Bob检查,Bob发现这两个顶点的颜色是不同的,那么Bob认为这次检验同构。
经过多次验证,可以证明Bob认为这个图满足三染色的要求。
实验步骤
- 使用 Python 的 networkx 库生成图
- 根据用户选择的测试数据(a、b、c)初始化图的边和颜色
- 生成随机颜色
- 更新图的颜色
- 验证者随机选择一条边进行检查
代码实现
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 确实拥有正确的三染色方案。
热门推荐
常见电脑品牌进入 BIOS 设置的快捷键大全
超级古典音乐清单
氨氮和总氮有什么区别
股市零基础快速入门:股市指数分类与作用详解
万历皇帝怠政之谜——探究历史背后的深层原因
老人发抖打颤怎么回事
每天喝咖啡对身体好!咖啡5大好处及注意事项
春季口腔溃疡患者注意事项指南
12岁鼻梁塌还会再长吗
苍术的功效与作用:健脾祛湿、行气解表的中药全解析
健身餐盘上的较量:鸡胸肉与牛肉,谁的营养更胜一筹?
茶花养殖方法和注意事项
心理咨询中的核心概念:移情与反移情
电热水器使用安全指南:守护您的居家安全
如何证明1+1=2?
一次SATA硬盘上电不转问题的排查与解决
冬季穿衣,认准这些“黑科技”
法式复古风装修设计,向浪漫致敬
白细胞减少会导致什么疾病
薏米的营养和功效知多少
GPU算子计算与调度技术
Wi-Fi 7与MLO技术:解锁未来无线网络的高效与智能
今年的流感疫苗到底怎么打?你关心的问题,都在这里了!
股权投资怎么选项目管理
Nature|通过范德华层压实现三维单片集成系统 (半导体器件/集成电路)
武昌楼市揭秘:改善房源大爆发,购房者如何选?
如何快速获取邮编信息?有哪些技巧可以提高效率?
教孩子保护视力,《眼睛逃跑计划》绘本发布
做凸嘴矫正禁忌人群及适宜人群有哪些?
什么时候买车划算?掌握这些时间点,4S店销售都怕你!