- VisualStudio2022插件的安装及使用-编程手把手系列文章
- pprof-在现网场景怎么用
- C#实现的下拉多选框,下拉多选树,多级节点
- 【学习笔记】基础数据结构:猫树
作者:@warm3snow https://github.com/warm3snow 微信公众号:密码应用技术实战 博客园首页:https://www.cnblogs.com/informatics/ 标签:技术分享模板 。
承诺方案(Commitment Scheme)是一个重要的密码学原语(cryptographic primitive), 承诺方案是一种加密协议,允许发送者承诺一个选择的值(或声明),同时对接收者保持隐藏,而接收者能够在稍后验证所承诺的值。承诺方案通常可以分为两个阶段.
密码学承诺方案在多个领域有广泛的应用,以下是一些主要的应用场景:
承诺方案是一个三元组, 包含\((Commit, Open, Verify)\),其中:
承诺值有两个属性:
注:以上两种描述并不严谨 。
承诺方案一般涉及到两方,发送方和接收方。发送方选择一个明文\(m\)和一个随机数\(r\),计算承诺值\(C\),并发送\(C\)给接收方。在某个时刻,发送方打开承诺,揭示\(m\)和\(r\)。接收方使用\(C\)和揭示的\(m\)和\(r\)验证承诺的正确性.
常见的承诺方案有 哈希承诺、ElGamal承诺、Pedersen承诺和 Sigma承诺等。虽然承诺方案的实现方式不同,但其基本原理相似.
关键流程如下:
[01] 发送承诺:Sender选取随机数\(r\), 并计算\(m\)的承诺值\(C\),发送给Receiver。(这里的随机数\(r\)是为了保证每次承诺的值不同) [02] 打开承诺:Sender打开承诺,揭示\(m\)和\(r\)。 [03] 验证承诺:Receiver重新计算承诺值\(C^{'}\),并验证\(C^{'}\)和\(C\)是否相等。相等则认为承诺验证通过,否则承诺验证失败.
哈希承诺是一种简单的承诺方案,通过哈希函数来实现承诺。假设\(H\)是一个哈希函数,\(m\)是明文.
哈希承诺的构造如下:
哈希承诺的隐藏性和绑定性是基于哈希函数的性质,哈希函数是单向函数,接收方无法从承诺值\(C\)推导出明文\(m\)。同时,哈希函数是抗碰撞的,发送方无法找到两个不同的\(m\),使得\(C = H(m)\).
哈希承诺隐藏性较差,在明文空间有限的情况下,可能会发生碰撞; 哈希承诺对于相同的明文\(m\),承诺值\(C\)是固定的,虽然引入随机数\(r\)可以解决这个问题,但会破坏绑定性,因为发送方可以在保证\(m||r\)不变的情况下,随便更改\(m\)和\(r\)的值.
ElGamal承诺是一种基于离散对数问题的困难性假设构造的承诺方案。假设\(G_p\)是阶为\(q\)的循环群,\(g, h\)是生成元, \(m\)是明文 。
ElGamal承诺的构造如下:
ElGamal承诺的隐藏性和绑定性是基于离散对数问题的困难性假设,接收方无法从承诺值\(C\)推导出明文\(m\),发送方无法找到两个不同的\((r_1, m_1)\)和\((r_2, m_2)\),使得\(C = (g^{r_1}, m_1 \cdot h^{r_1}) = (g^{r_2}, m_2 \cdot h^{r_2})\).
假设发送方找到两个不同的\((r_1, m_1)\)和\((r_2, m_2)\),使得\(C = (g^{r_1}, m_1 \cdot h^{r_1}) = (g^{r_2}, m_2 \cdot h^{r_2})\),则有:
与假设矛盾,因此ElGamal承诺具有绑定性.
Pedersen承诺是一种基于离散对数问题的困难性假设构造的承诺方案。假设\(G_p\)是阶为\(q\)的乘法群,\(g, h\)是独立生成元,\(m\)是明文。 Pedersen承诺的构造如下:
Pedersen承诺的隐藏性和绑定性是基于离散对数问题的困难性假设,接收方无法从承诺值\(C\)推导出明文\(m\),发送方无法找到两个不同的\((r_1, m_1)\)和\((r_2, m_2)\),使得\(C = g^{m_1} \cdot h^{r_1} = g^{m_2} \cdot h^{r_2}\).
假设发送方找到两个不同的\((r_1, m_1)\)和\((r_2, m_2)\),使得\(C = g^{m_1} \cdot h^{r_1} = g^{m_2} \cdot h^{r_2}\),则有:
由于\(g\)和\(h\)是独立生成元, 即它们生成的子群没有重叠,这意味着\(g^{m_1 - m_2} = h^{r_2 - r_1}\)只有在\(_1 - m_2 = 0\)和\(r_2 - r_1 = 0\)时才成立,即:
与假设矛盾,因此Pedersen承诺具有绑定性.
Pedersen承诺也可以基于ECC构造,假设\(G\)和\(H\)是椭圆曲线上的点,\(m\)是明文,\(r\)是随机数.
- 承诺阶段:发送方选择一个明文\(m\)和一个随机数\(r\),计算承诺值\(C = mG + rH\),并发送\(C\)给接收方。
- 打开阶段:发送方揭示明文\(m\)和随机数\(r\)。
- 验证阶段:接收方重新计算承诺值\(C^{'} = mG + rH\),并验证\(C^{'}\)和\(C\)是否相等。
隐藏性和绑定性略,与上述类似。
Pedersen承诺有一个重要的性质:同态性。即两个Pedersen承诺的和等于明文的和的Pedersen承诺。假设\(C_1 = g^{m_1} \cdot h^{r_1}\)和\(C_2 = g^{m_2} \cdot h^{r_2}\)是两个Pedersen承诺,\(m_1, m_2\)是明文,\(r_1, r_2\)是随机数。则有:
使用ECC构造的Pedersen承诺也具有同样的性质。如下:
Pedersen承诺的同态性可以用于保证密态的加法性,即两个密文的和等于明文的和的密文。如在门罗币中,矿工节点通过验证Pedersen承诺可以检查交易UTXO的输入和是否等于输出和(是否凭空产生门罗币).
在上一章中介绍的承诺方案中,发送方和接收方之间的通信是明文的,即接收方可以获得发送方的明文信息。在某些情况下,发送方希望向接收方证明自己拥有某个明文,而不透露明文的具体内容。这时,可以使用 零知识证明承诺方案.
零知识证明承诺是一种特殊的承诺方案,允许发送方向接收方证明自己拥有某个明文,而不透露明文的具体内容。零知识证明承诺方案根据在证明阶段是否交互可以分为:
Sigma承诺是一种基于离散对数问题的困难性假设构造的零知识承诺方案。Sigma承诺的交互式证明流程如下:
等式左边等于等式右边,因此按照Sigma承诺协议流程,验证方Receiver可以正确验证 。
非严格证明,由于Receiver仅知道\(C\),根据离散对数问题的困难性假设,Receiver无法计算出\(r\)的值,保证了承诺的隐藏性.
假设Receiver可以找到两个不同的\((r_1)\)和\((r_2)\),使得\(C = r_1.G = r_2.G\),则有:
与假设矛盾,因此Sigma承诺具有绑定性.
非严格证明,由于Receiver仅知道\((Q, C, e, z)\),并且基于该已知信息,无法计算出\(m\)的值,保证了承诺的零知识性 。
Sigma承诺也可以使用Fiat-Shamir heuristic构造为非交互式零知识证明承诺。具体流程如下:
Sigma承诺的非交互式零知识证明承诺的正确性、隐藏性、绑定性和零知识性证明与交互式零知识证明承诺类似。需要注意的是:
Pedersen承诺也可以构造为零知识承诺方案。 下面我们直接介绍非交互式版本的Pedersen零知识承诺方案.
Pedersen零知识承诺的隐藏性、绑定性与Pedersen承诺类似。需要注意的是:
等式左边等于等式右边,因此按照Pedersen零知识承诺协议流程,验证方Receiver可以正确验证. 。
非严格证明,由于Receiver仅知道\((C, P, x^{'}, y^{'})\),并且基于该已知信息,无法计算出\(m\)和\(r\)的值,保证了承诺的零知识性.
下表对比了哈希承诺、ElGamal承诺、Pedersen承诺和Sigma承诺的性质:
承诺方案 | 隐藏性 | 绑定性 | 同态性 | 零知识性 | 性能 | |
---|---|---|---|---|---|
哈希承诺 | 差 | 差 | 否 | 否 | 高 |
ElGamal承诺 | 好 | 好 | 是 | 否 | 较高 |
Pedersen承诺 | 好 | 好 | 是 | 否 | 较高 |
Sigma承诺-交互式 | 好 | 好 | 是 | 是 | 一般 |
Sigma承诺-非交互式 | 好 | 好 | 是 | 是 | 较高 |
Pedersen零知识承诺-非交互式 | 好 | 好 | 是 | 是 | 较高 |
通过对比发现,Pedersen承诺和Sigma承诺是比较优秀的承诺方案,具有隐藏性、绑定性和同态性。Sigma承诺是一种零知识承诺方案,可以保证发送方向接收方证明自己拥有某个明文,而不透露明文的具体内容。Pedersen承诺具有同态性,可以用于保证密文的加法性。因此,Pedersen承诺和Sigma承诺在实际应用中具有广泛的应用.
本文介绍了承诺方案的基本原理和常见的承诺方案,包括哈希承诺、ElGamal承诺、Pedersen承诺和Sigma承诺。承诺方案是一种重要的密码学原语,可以用于保证发送方的承诺值对应的明文,同时隐藏明文的具体内容。承诺方案在多个领域有广泛的应用,包括电子投票、拍卖、安全多方计算、数字签名、区块链和加密货币、身份验证和游戏理论等。通过对比发现,Pedersen承诺和Sigma承诺是比较优秀的承诺方案,具有隐藏性、绑定性和同态性。Pedersen承诺具有同态性,可以用于保证密文的加法性。Sigma承诺是一种零知识承诺方案,可以保证发送方向接收方证明自己拥有某个明文,而不透露明文的具体内容。因此,Pedersen承诺和Sigma承诺在实际应用中具有广泛的应用.
希望通过本文的介绍,读者对承诺方案有一个更深入的了解,为实际应用提供参考.
最后此篇关于密码学承诺原理与应用-概览的文章就讲到这里了,如果你想了解更多关于密码学承诺原理与应用-概览的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。
Internal Server Error: /admin/account/customuser/add/ Traceback (most recent call last): File "C:\
有问题!虽然我发现几乎相似的线程但没有帮助:( 我编写了一个 php 脚本来从我的 MySQL 数据库中获取注册用户的数量。该脚本在我的本地主机上运行良好;它使用给定的用户名、密码和主机名,分别是“r
我正在做一项基于密码的作业,我将 key 和消息放在单独的数组中。我想创建第三个数组,其中包含围绕消息大小的 key ,如下所示: message keykeyk 我已经在这个问题上苦苦挣扎了一段时间
我的几个客户要求我实现图形密码检查器,例如 关于如何实现这种 UI 有什么想法吗? 最佳答案 试着看看这个:https://code.google.com/p/android-lockpattern/
我正在使用 MAMP,每次登录 phpMyAdmin 时,都会收到以下错误/警告消息: the configuration file now needs a secret passphrase (bl
我正在尝试通过将 Visual Studio 2013 连接到我的测试机来调试 WDF 驱动程序。它创建一个名为 WDKRemoteUser 的用户,并在进行测试时尝试自动登录。有人知道这个用户的密码
使用具有指定用户名和密码的 SVN 提交。我希望服务器抛出错误;所以我可以告诉我的用户他/她的密码错误。 相反,在使用错误密码提交后: svn commit "test_file.txt" --use
我正在尝试实现 friend 推荐。 它从节点“你”开始。而且,我想找到节点“安娜”。 换句话说,这是我的两个或更多 friend 共同认识的人。上面的示例节点是 Anna。 如果您的帮助,我将不胜感
我都尝试过 wget --user=myuser --password=mypassword myfile 和 wget --ftp-user=myuser --ftp-password=mypass
我的一位用户提示说,每当他尝试使用默认管理界面(Django 的管理员)添加新用户(auth.User)时,新用户名和密码都会自动填充他自己的。 问题是他在登录时要求 Firefox 记住他的用户名/
我们正在开发一款应用(当然)用于应用购买 (IAP)。我已完成指南中的所有操作以启用 iap,并且一切正常,直到我想要购买为止。 部分代码: MainViewController.m -(vo
我试图创建两个可选匹配项的并集(如下所示),但我得到的不是并集,而是两者的交集。我应该如何更改此查询以获得所需的联合? optional match (a:PA)-[r2:network*2]-(b:
我想将Ansible用作另一个Python软件的一部分。在该软件中,我有一个包含其用户名/密码的主机列表。 有没有一种方法可以将SSH连接的用户/密码传递给Ansible ad-hoc命令或以加密方式
嗨,我在使用xampp的Apache Web服务器上收到错误500。直到我使用.htaccess,.htpasswd文件,错误才出现。我搜索了,但找不到语法错误。我只有1张图片和要保护的索引文件。以下
我一直使用它来编辑用户帐户信息: $this->validate($request, [ 'password' => 'min:6', 'password_confirmation'
我需要使用InstallUtil来安装C# Windows服务。我需要设置服务登录凭据(用户名和密码)。这一切都需要默默地完成。 有没有办法做这样的事情: installutil.exe myserv
已关闭。此问题不符合Stack Overflow guidelines 。目前不接受答案。 这个问题似乎不是关于 a specific programming problem, a software
如果我有一个随机的、16 个字符长的字母数字盐(不同大小写),它是为每个用户生成和存储的,我是否还需要一个站点范围的盐? 换句话说,这样好吗? sha1($user_salt . $password)
我正在开发一个空白程序,该程序将允许用户创建一个帐户,以便他们可以存储其余额和提款/存款。用户输入用户名和密码后,如何存储这些信息以便用户可以登录并查看其余额?我不一定要尝试使其非常安全,我只是希望能
我正在尝试寻找一种通用方法来搜索没有链接到另一个节点或节点集的节点或节点集。例如,我能够找到特定类型(例如 :Style)的所有节点,这些节点以某种方式连接到一组特定的节点(例如 :MetadataR
我是一名优秀的程序员,十分优秀!