密码学 | 承诺:Pedersen 承诺 + ZKP

server/2024/9/23 14:34:41/

🥑原文:Toward Achieving Anonymous NFT Trading

🥑写在前面:看了篇 22 年 SCI 3 区论文,里面提到在 Pedersen 承诺的揭示阶段可以使用零知识证明,而不必揭示消息明文和随机数。姑且记录一下这个方法。



1 Pedersen 承诺

以下是原文对 Pedersen 承诺的介绍😽

​一个承诺方案在承诺者 C 和接收者 R 之间进行。承诺者首先对一个秘密消息进行承诺,并将承诺发送给接收者。将来,这个秘密消息被打开给接收者,并且有一个有效的算法来验证打开的消息确实是用于生成承诺的确切消息。

这一段是对承诺的介绍,承诺全称就是承诺方案。

为此,公布一个具有阶 q q q 的群 G \mathcal{G} G 和两个生成元 G G G H H H 作为公共参数。C 随机选择 r ∈ Z q r∈Z_q rZq,并通过生成 c o m = m G + r H com = mG + rH com=mG+rH 来对消息 m m m 进行承诺,其中 c o m com com 发送给 R 。C 通过透露 ( m , r ) (m,r) (m,r) 来打开这个承诺,以便 R R R 可以检查 c o m = m G + r H com = mG + rH com=mG+rH 是否成立。

我真是服了: G \mathcal{G} G G G G 都是字母 G,只不过使用了不同的字体,以区分一个是循环群,一个是生成元。



2 Pedersen 承诺 + ZKP

为了保护消息 m m m 不被泄露给他人,C 可以生成一个关于消息打开过程的 知识证明,这样就能证明自己对消息内容的知晓,而不必直接透露消息本身,这一方案建立在如下原理之上。

在之前的学习中,C 都是直接揭示的消息 m m m 明文。如果消息 m m m 不涉及隐私,那么公布明文也无所谓,承诺的主要作用也只是为了防止 C 胡乱解读消息;如果消息 m m m 涉及隐私,那么我们将不希望公布明文。

承诺阶段

C 选择随机数 r r r 为消息 m m m 生成承诺

c o m = m ∗ G + r ∗ H com = m*G + r*H com=mG+rH

C 将承诺 c o m com com 发送给 R 。

承诺阶段的操作没有改变。

揭示阶段

C 并不直接给 R 发送 ( m , r ) (m,r) (m,r),而是 ( P , x ′ , y ′ ) (P,x',y') (P,x,y)

x , y ← Z q P = x ∗ G + y ∗ H h ← R O ( P ) x ′ = x + h ∗ m , y ′ = y + h ∗ r \begin{alignat}{2} &x,y \gets Z_q \\ &P = x*G + y*H \\ &h\ \gets RO(P) \\ &x'=x+h*m,y'=y+h*r \end{alignat} x,yZqP=xG+yHh RO(P)x=x+hm,y=y+hr

R 收到 ( P , x ′ , y ′ ) (P,x',y') (P,x,y) 后验证:

h ← R O ( P ) P + h ∗ c o m = ? x ′ ∗ G + y ′ ∗ H \begin{alignat}{2} &h\ \gets RO(P) \\ &P+h*com \overset{?}{=} x'*G+y'*H \end{alignat} h RO(P)P+hcom=?xG+yH

注意:RO 是指 Random Oracle 随机预言机 这一抽象概念,在具体实现中通常是一个抗碰撞的哈希函数。

我的证明

对式子 ( 6 ) (6) (6) 的证明如下:

P + h ∗ c o m = ( x ∗ G + y ∗ H ) + h ∗ ( m ∗ G + r ∗ H ) = ( x + h ∗ m ) ∗ G + ( y + h ∗ r ) ∗ H = x ′ ∗ G + y ′ ∗ H \begin{alignat}{2} P+h*com &= (x*G + y*H) + h*(m*G + r*H) \\ &= (x+h*m)*G + (y+h*r)*H \\ &= x'*G+y'*H \end{alignat} P+hcom=(xG+yH)+h(mG+rH)=(x+hm)G+(y+hr)H=xG+yH




http://www.ppmy.cn/server/7137.html

相关文章

echars点击图例之后只显示当前数据其他隐藏

1. 确认echarts默认效果 echarts默认点击图例有如下效果: 当前图例显示,点击后隐藏该图例;当前图例隐藏,点击后显示该图例。 2. 确认需要处理的事件 经过在官网查看事件后发现最合适的是legendselectchanged事件,该…

在线拍卖系统,基于SpringBoot+Vue+MySql开发的在线拍卖系统设计和实现

目录 一. 系统介绍 二. 功能模块 2.1. 管理员功能模块 2.2. 用户功能模块 2.3. 前台首页功能模块 2.4. 部分代码实现 一. 系统介绍 随着社会的发展,社会的各行各业都在利用信息化时代的优势。计算机的优势和普及使得各种信息系统的开发成为必需。 在线拍卖系…

C#项目中bin目录下

在C#项目中,生成后的bin目录是用于存放编译后的可执行文件和相关文件的目录。在bin目录下,常见的文件有以下两种后缀: .dll:Dynamic Link Library(动态链接库)的缩写,是一种包含可重用代码和数据…

Linux——日志的编写与线程池

目录 前言 一、日志的编写 二、线程池 1.线程池基本原理 2.线程池作用 3.线程池的实现 前言 学了很多线程相关的知识点,线程控制、线程互斥、线程同步,今天我们将他们做一个总结,运用所学知识写一个较为完整的线程池,同时…

2024年Getx教程_Flutter+Getx系列实战教程介绍

Getx介绍: GetX 是 Flutter 上的一个轻量且强大的解决方案,它是一个轻量级的Flutter框架。Getx不仅具有状态管理的功能,还具有路由管理、主题管理、国际化多语言管理、Obx局部更新、MVC视图业务分离、网络请求、数据验证等功能。GetX 官方还…

6.6Python之集合的基本语法和特性

集合(Set)是Python中的一种无序、不重复的数据结构。集合是由一组元素组成的,这些元素必须是不可变数据类型,但在集合中每个元素都是唯一的,即集合中不存在重复的元素。 集合的基本语法: 1、元素值必须是…

IDEA插件:CodeGeex

前言 CodeGeeX是由清华大学和智谱AI联合开发的多语言代码生成模型。CodeGeeX是一款AI编程助手,其功能类似于Github Copilot、Codeium、CodeWhisperer、Bito等智能编程助手。CodeGeeX支持Python、C、Java、JavaScript、Go等10多种主流编程语言。它可以帮助程…

JDK 11下载、安装、配置

下载 到Oracle管网下载JDK 11,下载前需要登录,否则直接点下载会出现502 bad gateway。 下载页面链接 https://www.oracle.com/hk/java/technologies/downloads/#java11-windows 登录 有些人可能没有Oracle账号,注册也比较慢,有需…