密码学中的承诺不同于日常生活中承诺的含义。日常生活中,通常的承诺一般是保证在XXX日期实现某个既定目标或行为,可以是完成某项作业,取得什么进展等等,有点类似合同的性质,到达一特定时间点兑现预先诺言。比如年底前完成销售额1亿的目标,就是一个承诺。
密码学中的承诺与此不同,它是对一个既有的确定性的事实(敏感数据)进行陈诉,保证未来的某个时间有验证方可以验证承诺的真假,也就是说承诺的标的是当前时间的,未来不会发生变化。
密码学承诺包含承诺方和验证方角色,两个使用阶段。
承诺生成(Commit)阶段:
承诺方选择一个暂不公开的敏感数据v,计算出对应的承诺c并公开。
承诺披露(Reveal)阶段:
也称之为承诺打开-验证(Open-Verify)阶段,承诺方公布敏感数据v的明文和其他的必要参数,验证方重复承诺生成的计算过程,比较新生成的承诺与之前接收到的承诺c是否一致,一致则表示验证成功,否则失败。
密码学承诺具备两个特性:
隐匿性(hiding):
做出的承诺是密文形式,在打开承诺之前,验证方不知道承诺方的敏感数据。
绑定性(binding):
一旦承诺生成并公开承诺,承诺方不能将已承诺的敏感数据换成(或解释成)另一个不同的数据。
本文之后提到的承诺,不再加以说明,默认均指密码学承诺。接下来介绍一些常用的承诺。
哈希承诺
哈希承诺,用户可以通过以下公式计算关于敏感数据v的承诺,其中H是一个密码学安全的单向哈希算法。
关于哈希(摘要)算法,有很多,虽然我们没有单独对其进行阐述,但是很容易理解,并且能够查到的公开资料非常多,所以没有赘述。
简而言之,哈希算法是一个单向不可逆且对输入敏感的算法。以此为例,对于不同的输入v,得到的哈希结果c也是不同,准确的说,随机输入一个v,得到的唯一的c是均匀分布的,且无法预测即抗碰撞性。
基于单向哈希的单向性,难以通过哈希值H(v)反推出敏感数据v,提供了一定的隐匿性;基于单向哈希的抗碰撞性,难以找到不同的敏感数据v'产生相同的哈希值H(v),以此提供了一定的绑定性。
举例说明,我有一篇文章将其哈希后结果作为该篇文章的承诺公开,之后任何人要求验证我的承诺,OK,我把原始文章拿出来,对方做一次哈希得到结果等于之前承诺,证明承诺为真。如果我没有那篇文章或者说用别的文章代替,那么哈希结果会发生变化,这样的作弊行为就无法通过验证。这种形式可以作为版权证明的一种方式。
哈希承诺的构造简单、使用方便,满足密码学承诺基本的特性,适用于对隐私数据机密性要求不高的应用场景。
对隐私数据秘密性要求高的场合,哈希承诺提供的隐匿性比较有限,不具备随机性。对于同一个敏感数据v,H(v)值总是固定的,因此理论上可以通过暴力穷举,列举所有可能的v值,来反推出H(v)中实际承诺的v(注:安全性高的哈希函数目前算力破解还很难)。
另外,哈希承诺不具有在密文形式对其处理的附加功能,例如,多个相关的承诺值之间密文运算和交叉验证,对于构造复杂密码学协议和安全多方计算方案的作用比较有限。