密码学承诺之原理和应用 - sigma承诺

主页

简介

在上一篇文章《密码学承诺之原理和应用 - 概览》中,我们详细介绍了常见的密码学承诺原理,本节我们将重点介绍Sigma承诺的实现和应用。

Sigma承诺

Sigma承诺是一种特殊的承诺方案,允许发送方向接收方证明自己拥有某个明文,而不透露明文的具体内容。零知识证明承诺方案根据在证明阶段是否交互可以分为:

  • 交互式零知识证明承诺:发送方和接收方之间需要交互,发送方向接收方发送证明,接收方验证证明。
  • 非交互式零知识证明承诺:发送方可以在不与接收方交互的情况下生成证明,接收方可以验证证明。

本篇文章我们主要针对非交互式Sigma承诺进行详细介绍。

Sigma承诺的构造

非交互式Sigma承诺的构造基于Fiat-Shamir heuristic,具体流程如下:

image

  • [01] 计算承诺:Sender选取随机数\(r\),并生成承诺\(C = r.G\);
  • [02] 计算挑战:Sender计算挑战\(e = H(Q, C)\),并计算证明\(z = r + e.m\);
  • [03] 发送(e, z):Sender发送挑战\(e\)和证明\(z\)给Receiver;
  • [04] 验证:Receiver计算\(A = z.G - e.Q\),并验证\(e == H(Q, A)\)

值得注意的是,Sigma承诺方案与ECDSA签名方案很像,实际上数字签名方案就是一种Sigma承诺方案变体。

Sigma承诺证明

正确性证明

\[z.G = (r + e.m).G = r.G + e.m.G = C + e.Q \]

\[A = z.G - e.Q = C \]

\[H(Q, A) = H(Q, C) = e \]

因此接收方收到的\((e,z)\)满足验证验证等式,因此按照Sigma承诺协议流程,验证方Receiver可以正确验证

隐藏性证明

非严格证明,由于Receiver仅知道\((e,z,G,Q)\),根据离散对数问题的困难性假设,Receiver无法计算出\(m\)的值,保证了承诺的隐藏性。

绑定性证明

假设Receiver可以找到不同的\((r_1, m_1)\),使得\(e_1 = H(Q, A_1)\),则有:

\[A_1 = z_1.G - e_1.Q_1 = r_1.G + e_1.Q_1 - e_1.Q_1 = r_1.G = C_1 \]

\[e_1 = H(Q, A_1) = H(Q, C_1) \]

而实际上根据\(e_1\)的计算公式,\(e_1 = H(Q_1, C_1)\), 因此根据假设

\[e_1 = H(Q_1, C_1) = H(Q, C_1) \]

根据哈希函数的性质,发送者很难找到不同的哈希原象满足上述等式,因此与假设矛盾,因此Sigma承诺具有绑定性。

零知识性证明

非严格证明,由于Receiver仅知道\((Q, C, e, z)\),并且基于该已知信息,无法计算出\(m\)\(r\)的值,保证了承诺的零知识性

Sigma承诺实现

以下测试工具基于golang实现,读者可以通过git clone下载代码并进行编译,或者通过go install进行安装。

gossl命令行工具

  1. 直接安装
➜  gossl git:(master) go install github.com/warm3snow/gossl@latest
go: downloading github.com/warm3snow/gossl v0.0.0-20240926033959-072365c6c49c
  1. 下载代码并编译安装
➜  git clone https://github.com/warm3snow/gossl.git

➜  cd gossl && go install
  1. 查看帮助信息
➜  gossl git:(master) gossl -h
gossl is a crypto command-line tool like openssl.

Usage:
  gossl [command]

Available Commands:
  asym        asymmetric cryptography
  commitment  cryptographic commitment
  completion  Generate the autocompletion script for the specified shell
  dgst        digest or hash cryptography
  help        Help about any command
  kdf         key derivation function
  req         certificate request
  sym         symmetric cryptography
  tls         transport layer security(ssl/tls)
  x509        x509 certificate

Flags:
  -a, --algo string     Specify the supported algorithm
      --config string   config file (default is $HOME/.gossl.yaml)
  -h, --help            help for gossl
  -i, --in string       The input file
  -o, --out string      The output file
  -t, --toggle          Help message for toggle
  -v, --verbose         verbose output

Use "gossl [command] --help" for more information about a command.

Sigma承诺命令

  1. gossl支持的承诺算法列表
➜  gossl git:(master) gossl commitment list
Supported commitment algorithm list:
hash
elgamal
pedersen
pedersen_ecc
pedersen_ecc_nizk
sigma

注:gossl中实现的sigma承诺,默认基于椭圆曲线P256实现,当前不支持通过命令行参数指定其他椭圆曲线。

  1. 生成sigma承诺
➜  gossl git:(master) ✗ gossl commitment commit -a sigma --in-text "hello gossl"
Common Params:
	g: 48439561293906451759052585252797914202762949526041747995844080717082404635286||36134250956749795798585127919587881956611106672985015071877198253568414405109
Commitments:
	C: 35978963384416087345885958360294044241038648430056878001124120173772932479707||45314833754090600280947663597071793076156457817915037099266616032681954892305
Openings:
	e: 034f8b5f22ceef281f70c4a119f4928959c5797b0b9b7897d154b10e2c48057adb021605d348c14ebc17df4cc59b85bed3232e15b3dc89cd5e9b7d856bdefa8c3b47
	z: 0159a0679877a454c1d70c1e6865e969ef197abbe5e608cf5c29f0994b6aa09e372dc23a1801f98531b5ac5f4a102da24f4a576b6ea02627bb15fbc15dace2ccc04e5805d25310bcd63e7283b7
  1. 验证sigma承诺
➜  gossl git:(master) ✗ go run main.go commitment verify -a sigma \
> --g "48439561293906451759052585252797914202762949526041747995844080717082404635286||36134250956749795798585127919587881956611106672985015071877198253568414405109" \
> --C "35978963384416087345885958360294044241038648430056878001124120173772932479707||45314833754090600280947663597071793076156457817915037099266616032681954892305" \
> --x "034f8b5f22ceef281f70c4a119f4928959c5797b0b9b7897d154b10e2c48057adb021605d348c14ebc17df4cc59b85bed3232e15b3dc89cd5e9b7d856bdefa8c3b47" \
> --y "0159a0679877a454c1d70c1e6865e969ef197abbe5e608cf5c29f0994b6aa09e372dc23a1801f98531b5ac5f4a102da24f4a576b6ea02627bb15fbc15dace2ccc04e5805d25310bcd63e7283b7"

commitment is verified successfully

Sigma承诺go测试代码

除了使用gossl命令行工具,读者也可以通过以下go test代码进行测试。

// 切换到gossl的commitment目录
➜  cd gossl/crypto/commitment
➜  commitment git:(master) ll
total 64
-rw-r--r--  1 hxy  staff   1.1K  9 26 10:36 CommitPoint.go
-rw-r--r--  1 hxy  staff   1.8K  9 26 18:01 commitment_test.go
-rw-r--r--  1 hxy  staff   1.6K  9 26 17:57 elgamal_commit.go
-rw-r--r--  1 hxy  staff   883B  9 24 15:48 hash_commit.go
-rw-r--r--  1 hxy  staff   1.5K  9 26 10:26 pedersen_commit.go
-rw-r--r--  1 hxy  staff   1.9K  9 26 17:57 pedersen_ecc_commit.go
-rw-r--r--  1 hxy  staff   3.0K  9 26 17:57 pedersen_ecc_nizk_commit.go
-rw-r--r--  1 hxy  staff   2.3K  9 26 18:12 sigma_ecc_nizk.go

// 运行测试代码
➜  commitment git:(master) go test -v -test.run=TestNewSigmaEccNIZKCommitment

=== RUN   TestNewSigmaEccNIZKCommitment
Common Params: 
g: 48439561293906451759052585252797914202762949526041747995844080717082404635286||36134250956749795798585127919587881956611106672985015071877198253568414405109
C: 47040828788287341591092510479443289727519436241786337638489071419327823770936||36818224871262709989945065869868031409225044161759246549601573301209070696557
e: 0368002a62bfdeca7fe138b4efa81193744d3c110aaf3a2f676f6eb51b22cc7538031322ed2b4b02627d85491234c391cfbc33ad7371113a89c16eb647e2c0dcdc09
z: 0163998a9a42f3d225988fdfa521bd794ca7c1c4346a6b8308d399cd740a44a4f0b424b87dc94d75bc8f5045a3180e5a57d55596e98e25f3421ddbebcdff76c091ee7e3ceda107
Verify: true
--- PASS: TestNewSigmaEccNIZKCommitment (0.00s)
PASS

总结

本文详绍了Sigma承诺的构造和证明过程,以及通过gossl工具实现了sigma承诺的生成和验证。Sigma承诺是一种非交互式零知识证明方案,具有隐藏性、绑定性和零知识性等特性,广泛应用于数字签名,匿名交易等场景。
通过本文的介绍,希望读者对Sigma承诺有更深入的了解,为后续的密码学应用提供参考。

参考文献

-【1】Zero-Knowledge Proofs: An illustrated primer
-【2】Sigma Protocol
-【3】gossl

posted @ 2024-09-26 18:33  warm3snow  阅读(16)  评论(0编辑  收藏  举报