用零知识证明实现地图的三染色问题
创作时间:
作者:
@小白创作中心
用零知识证明实现地图的三染色问题
引用
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 确实拥有正确的三染色方案。
热门推荐
王熙凤的权谋手腕与悲剧命运反思
世界过敏性疾病日丨鼻子发痒?经常犯困?你可能中招了......
R语言安装教程 | 图文介绍超详细
CCF YOCSEF杭州举办特别论坛:“以‘萝卜快跑’思考人工智能对社会的影响”
贝利撒留:最后的罗马人传奇
异地恋的坚守与挑战:距离能否打败爱情?
名门与豪门:古代社会中的家族地位与权力对比
香雾噀人咏柑橘
律师如何撰写代理词:技巧与实务指南
25部适合中小学生看的英文电影,培养孩子英语兴趣
从尿液看健康,教你识别异常信号
描写春天青蛙叫的诗词
探索命理学中的总格与人格:哪个更关键?
低投资高回报的投资策略有哪些?
历史中的黄月英:智慧与美德并重的传奇女子
探索生命的意义:人为何而生?
如何提升用户对网站的信任度
SEO:搜索引擎优化,让网站更易被找到!
打造完美服装摄影的顶级秘诀
狗狗吃纸:是无聊消遣还是健康预警?一文带你了解!
如何看待黄金价格的历史走势?这些历史走势对未来有何启示?
如何选择合适的方柱扣和模板材料,以降低成本并提高施工效率?
M.2接口技术详解:Key位定义与典型应用
监控夜视会发光怎么办
用于夜视和监控的图像增强方法
零基础竹笛入门指南:从认识竹笛到吹出动听旋律
白居易《池上》创作背景-憨态可掬的老人家
内脏脂肪超标怎么办?7个实用方法帮你快速减掉内脏脂肪
动漫中那些令人惊艳的招式,看到就想学
切洋葱为什么会流泪?——揭秘“催泪因子”的化学奥秘