用零知识证明实现地图的三染色问题
创作时间:
作者:
@小白创作中心
用零知识证明实现地图的三染色问题
引用
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 确实拥有正确的三染色方案。
热门推荐
SQL同时查询两个表的方法详解
散热风扇风量越大越好吗?全面解析散热风扇的性能与选型
怎么用车牌号查询VIN码?查找车架号的方法还有哪些?
维生素C每天适宜摄入量多少mg
常见的六个发热原因
包钢集团:数字赋能 全速推动数智化转型升级
硬盘低级格式化的实用指南:步骤详解及注意事项
仓库搬迁十大安全注意事项:确保人员与货物安全无忧
爱情是什么?这20句诗词是最好的回答
孩子面黄肌瘦、食欲不振?可能是疳积在作怪!家长必看!
二氧化氯AB剂:工业循环水处理的理想选择
PH值、浊度与总铁:影响循环水水质的关键因素
水痘疫苗与脊灰灭活疫苗的区别及接种指南
“心灵呵护 快乐生活”专家聚首人民网:探讨家庭心理健康与抑郁症防治
吃完飯小腹凸很胖?減重排便靠它!9種高纖蔬菜拒當小腹人
宋代天子服饰:七种冕服彰显礼仪之邦
Live Photo:探索动态照片的魅力与应用
论刘邦项羽:项羽与刘邦的传奇故事
18K金和PT950铂金哪个更耐磨 18K金和PT950铂金哪个硬度高?
依沃西单抗单药疗效优于帕博利珠单抗,头对头研究取得显著结果
缩量大阴线:股票技术分析中的关键信号
胶原蛋白食补怎么补最好
车辆做抵押需要哪些资料?抵押车辆被开走怎么办?
甘蔗水怎么煮?5种甘蔗水煮法及功效详解
如何确保血站符合质量管理规范的要求?
如何找到投档线数据库
央行逆回购如何运作?它对金融稳定到底有多重要?
上海生态殡葬服务指南:树葬与海葬流程详解
OP和ED是什么意思:动漫片头尾揭秘
BIM技术 | BIM模型建立及应用标准有哪些?