密码学承诺之原理和应用 - sigma承诺
主页
- 微信公众号:密码应用技术实战
- 博客园首页:https://www.cnblogs.com/informatics/
- GIT地址:https://github.com/warm3snow
简介
在上一篇文章《密码学承诺之原理和应用 - 概览》中,我们详细介绍了常见的密码学承诺原理,本节我们将重点介绍Sigma承诺的实现和应用。
Sigma承诺
Sigma承诺
是一种特殊的承诺方案,允许发送方向接收方证明自己拥有某个明文,而不透露明文的具体内容。零知识证明承诺方案根据在证明阶段是否交互可以分为:
- 交互式零知识证明承诺:发送方和接收方之间需要交互,发送方向接收方发送证明,接收方验证证明。
- 非交互式零知识证明承诺:发送方可以在不与接收方交互的情况下生成证明,接收方可以验证证明。
本篇文章我们主要针对非交互式Sigma承诺进行详细介绍。
Sigma承诺的构造
非交互式Sigma承诺的构造基于Fiat-Shamir heuristic,具体流程如下:
- [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承诺证明
正确性证明
因此接收方收到的\((e,z)\)满足验证验证等式,因此按照Sigma承诺协议流程,验证方Receiver可以正确验证
隐藏性证明
非严格证明,由于Receiver仅知道\((e,z,G,Q)\),根据离散对数问题的困难性假设,Receiver无法计算出\(m\)的值,保证了承诺的隐藏性。
绑定性证明
假设Receiver可以找到不同的\((r_1, m_1)\),使得\(e_1 = H(Q, A_1)\),则有:
而实际上根据\(e_1\)的计算公式,\(e_1 = H(Q_1, C_1)\), 因此根据假设
根据哈希函数的性质,发送者很难找到不同的哈希原象满足上述等式,因此与假设矛盾,因此Sigma承诺具有绑定性。
零知识性证明
非严格证明,由于Receiver仅知道\((Q, C, e, z)\),并且基于该已知信息,无法计算出\(m\)和\(r\)的值,保证了承诺的零知识性
Sigma承诺实现
以下测试工具基于golang
实现,读者可以通过git clone
下载代码并进行编译,或者通过go install
进行安装。
gossl命令行工具
- 直接安装
➜ gossl git:(master) go install github.com/warm3snow/gossl@latest
go: downloading github.com/warm3snow/gossl v0.0.0-20240926033959-072365c6c49c
- 下载代码并编译安装
➜ git clone https://github.com/warm3snow/gossl.git
➜ cd gossl && go install
- 查看帮助信息
➜ 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承诺命令
- gossl支持的承诺算法列表
➜ gossl git:(master) gossl commitment list
Supported commitment algorithm list:
hash
elgamal
pedersen
pedersen_ecc
pedersen_ecc_nizk
sigma
注:gossl中实现的sigma承诺,默认基于椭圆曲线P256实现,当前不支持通过命令行参数指定其他椭圆曲线。
- 生成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
- 验证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