区块链中现代密码学

安全多方计算

安全多方计算起源于1982年姚期智的百万富翁问题。后来Oded Goldreich有比较细致系统的论述。

姚氏百万富翁问题是由华裔计算机科学家、图灵奖获得者姚启智教授首先提出的。该问题表述为:两个百万富翁Alice和Bob想知道他们两个谁更富有,但他们都不想让对方知道自己财富的任何信息。该问题有一些实际应用:假设Alice希望向Bob购买一些商品,但她愿意支付的最高金额为x元;Bob希望的最低卖出价为y元。Alice和Bob都非常希望知道x与y哪个大。如果x>y,他们都可以开始讨价还价;如果z<y,他们就不用浪费口舌。但他们都不想告诉对方自己的出价,以免自己在讨价还价中处于不利地位。

该方案用于对两个数进行比较,以确定哪一个较大。Alice知道一个整数i;Bob知道一个整数j, Alice与B0b希望知道究竟i>=j还是j>i,但都不想让对方知道自己的数。为简单起见,假设j与i的范围为[1,100】。Bob有一个公开密钥Eb和私有密钥Db。

安全多方计算(Secure Multi-Party Computation)的研究主要是针对无可信第三方的情况下, 如何安全地计算一个约定函数的问题. 安全多方计算在电子选举、电子投票、电子拍卖、秘密共享、门限签名等场景中有着重要的作用。

同态加密

同态加密(Homomorphic Encryption)是很久以前密码学界就提出来的一个Open Problem。早在1978年,Ron Rivest, Leonard Adleman, 以及Michael L. Dertouzos就以银行为应用背景提出了这个概念[RAD78]。对,你没有看错,Ron Rivest和Leonard Adleman分别就是著名的RSA算法中的R和A。

什么是同态加密?提出第一个构造出全同态加密(Fully Homomorphic Encryption)[Gen09]的Craig Gentry给出的直观定义最好:A way to delegate processing of your data, without giving away access to it.

这是什么意思呢?一般的加密方案关注的都是数据存储安全。即,我要给其他人发个加密的东西,或者要在计算机或者其他服务器上存一个东西,我要对数据进行加密后在发送或者存储。没有密钥的用户,不可能从加密结果中得到有关原始数据的任何信息。只有拥有密钥的用户才能够正确解密,得到原始的内容。我们注意到,这个过程中用户是不能对加密结果做任何操作的,只能进行存储、传输。对加密结果做任何操作,都将会导致错误的解密,甚至解密失败。

同态加密方案最有趣的地方在于,其关注的是数据处理安全。同态加密提供了一种对加密数据进行处理的功能。也就是说,其他人可以对加密数据进行处理,但是处理过程不会泄露任何原始内容。同时,拥有密钥的用户对处理过的数据进行解密后,得到的正好是处理后的结果。

有点抽象?我们举个实际生活中的例子。有个叫Alice的用户买到了一大块金子,她想让工人把这块金子打造成一个项链。但是工人在打造的过程中有可能会偷金子啊,毕竟就是一克金子也值很多钱的说… 因此能不能有一种方法,让工人可以对金块进行加工(delegate processing of your data),但是不能得到任何金子(without giving away access to it)?当然有办法啦,Alice可以这么做:Alice将金子锁在一个密闭的盒子里面,这个盒子安装了一个手套。工人可以带着这个手套,对盒子内部的金子进行处理。但是盒子是锁着的,所以工人不仅拿不到金块,连处理过程中掉下的任何金子都拿不到。加工完成后。Alice拿回这个盒子,把锁打开,就得到了金子。

这里面的对应关系是:盒子:加密算法盒子上的锁:用户密钥将金块放在盒子里面并且用锁锁上:将数据用同态加密方案进行加密加工:应用同态特性,在无法取得数据的条件下直接对加密结果进行处理开锁:对结果进行解密,直接得到处理后的结果同态加密哪里能用?这几年不是提了个云计算的概念嘛。同态加密几乎就是为云计算而量身打造的!我们考虑下面的情景:一个用户想要处理一个数据,但是他的计算机计算能力较弱。这个用户可以使用云计算的概念,让云来帮助他进行处理而得到结果。但是如果直接将数据交给云,无法保证安全性啊!于是,他可以使用同态加密,然后让云来对加密数据进行直接处理,并将处理结果返回给他。这样一来:用户向云服务商付款,得到了处理的结果;云服务商挣到了费用,并在不知道用户数据的前提下正确处理了数据;

聚合签名

聚合签名由Boneh等人提出,主要是通过聚合多个签名为一个签名,来提高签名与验证的效率。要对多个用户的数据进行签名,聚合签名能够极大地降低签名计算复杂度。CL就是聚合签名。

零知识证明

零知识证明过程有两个参与方,一方叫证明者,一方叫验证者。证明者掌握着某个秘密,他想让验证者相信他掌握着秘密,但是又不想泄漏这个秘密给验证者。

双方按照一个协议,通过一系列交互,最终验证者会得出一个明确的结论,证明者是或不掌握这个秘密。

对于比特币的例子,一笔转帐交易合法与否,其实只要证明三件事:

发送的钱属于发送交易的人 发送者发送的金额等于接收者收到金额 发送者的钱确实被销毁了 整个证明过程中,矿工其实并不关心具体花掉了多少钱,发送者具体是谁,接受者具体是谁。矿工只关心系统的钱是不是守恒的。

zcash 就是用这个思路实现了隐私交易。

零知识证明的三条性质对应:

(1)完备性。如果证明方和验证方都是诚实的,并遵循证明过程的每一步,进行正确的计算,那么这个证明一定是成功的,验证方一定能够接受证明方。 (2)合理性。没有人能够假冒证明方,使这个证明成功。 (3)零知识性。证明过程执行完之后,验证方只获得了“证明方拥有这个知识”这条信息,而没有获得关于这个知识本身的任何一点信息。

环签名

只有环成员,没有管理者,不需要环成员之间的合作,签名者利用自己的私钥和集合中其他成员的公钥就能独立的进行签名,不需要其他人的帮助,集合中的其他成员可能不知道自己被包含在了其中。 环签名可以被用作成一种泄露秘密的方式,例如,可以使用环形签名来提供来自“白宫高级官员”的匿名签名,而不会透露哪个官员签署了该消息。 环签名适用于此应用程序,因为环签名的匿名性不能被撤销,并且因为用于环签名的组可以被即兴创建。

1)密钥生成。为环中每个成员产生一个密钥对(公钥PKi,私钥SKi) 2)签名。签名者用自己的私钥和任意n个环成员的公钥为消息m生成签名a 3)签名验证。签名者根据环签名和消息m,验证签名是否是环中成员所签。如果有效就接收,如果无效就丢弃。

群签名

群签名的一般流程

  1. 初始化 群管理者建立群资源,生成对应的群公钥(Group Public Key)和群私钥(Group Private Key)群公钥对整个系统中的所有用户公开,比如群成员、验证者等。
  2. 成员加入 在用户加入群的时候,群管理者颁发群证书(Group Certificate)给群成员。
  3. 签名 群成员利用获得的群证书签署文件,生成群签名
  4. 验证 同时验证者利用群公钥仅可以验证所得群签名的正确性,但不能确定群中的正式签署者。
  5. 打开 群管理者利用群私钥可以对群用户生成的群签名进行追踪,并暴露签署者身份。

1.png

盲签名

盲数字签名(Blind Signature)简称盲签名——是一种数字签名的方式,在消息内容被签名之前,对于签名者来说消息内容是不可见的。1982年大卫·乔姆首先提出了盲签名的概念。盲签名因为具有盲性这一特点,可以有效保护所签署消息的具体内容,所以在电子商务和电子选举等领域有着广泛的应用。

类比例子:对文件签名就是通过在信封里放一张复写纸,签名者在信封上签名时,他的签名便透过复写纸签到文件上。

所谓盲签名,就是先将隐蔽的文件放进信封里,而除去盲因子的过程就是打开这个信封,当文件在一个信封中时,任何人不能读它。对文件签名就是通过在信封里放一张复写纸,签名者在信封上签名时,他的签名便透过复写纸签到文件上。

一般来说,一个好的盲签名应该具有以下的性质:

不可伪造性。除了签名者本人外,任何人都不能以他的名义生成有效的盲签名。这是一条最基本的性质。 不可抵赖性。签名者一旦签署了某个消息,他无法否认自己对消息的签名。 盲性。签名者虽然对某个消息进行了签名,但他不可能得到消息的具体内容。 不可跟踪性。一旦消息的签名公开后,签名者不能确定自己何时签署的这条消息。 满足上面几条性质的盲签名,被认为是安全的。这四条性质既是我们设计盲签名所应遵循的标准,又是我们判断盲签名性能优劣的根据。

另外,方案的可操作性和实现的效率也是我们设计盲签名时必须考虑的重要

因素。一个盲签名的可操作性和实现速度取决于以下几个方面:

1,密钥的长度; 2,盲签名的长度; 3,盲签名的算法和验证算法。 盲签名具体步骤 1,接收者首先将待签数据进行盲变换,把变换后的盲数据发给签名者。 2,经签名者签名后再发给接收者。 3,接收者对签名再作去盲变换,得出的便是签名者对原数据的盲签名。 4,这样便满足了条件①。要满足条件②,必须使签名者事后看到盲签名时不能与盲数据联系起来,这通常是依靠某种协议来实现的。

1470616442545-m1.png

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏乐享123

加密技术发展

3026
来自专栏Albert陈凯

2018-09-27 白话解释 对称加密算法 VS 非对称加密算法

前端梁 前端梁 ](https://segmentfault.com/u/loveyoung) 1月15日发布

1184
来自专栏一名叫大蕉的程序员

密钥交换有点不安全 No.89

今天聊聊关于对称加密算法中关于密钥的问题。如果对于密码学的基础概念还不太熟悉的可以复习一下我上一篇文章。手把脚看看密码学No.72。 我们都知道对称密钥可以用于...

3939
来自专栏FreeBuf

为什么要用BLAKE2替换SHA-1?| 密码学分析

当哈希碰撞成为现实 如果你在过去的十二年里不是生活在原始森林的话,那么你一定知道密码学哈希函数SHA-1是存在问题的,简而言之,SHA-1没有我们想象中的那么...

2376
来自专栏青蛙要fly的专栏

项目需求讨论 — 手把手带你写RxPermission

首先既然是Rx系列,前提是会Rxjava相关的基本知识,如果没有Rxjava的相关知识,请补好Rxjava相关知识再来看。

1572
来自专栏安智客

密码发展史之古典密码

密码(Cryptology)是一种用来混淆的技术,它希望将正常的、可识别的信息转变为无法识别的信息。密码学是一个即古老又新兴的学科,密码学一词源自希腊文“kry...

2307
来自专栏HansBug's Lab

1820: [JSOI2010]Express Service 快递服务

1820: [JSOI2010]Express Service 快递服务 Time Limit: 10 Sec  Memory Limit: 64 MB Sub...

3286
来自专栏PPV课数据科学社区

【完整案例】如何用R实现空间数据可视化

image.png 流行病学的数据讲究“三间分布”,即人群分布、时间分布和空间分布。其中的“空间分布”最好是在地图上展示,才比较清楚。R软件集统计分析与高级...

8367
来自专栏企鹅号快讯

程序员的花样编程,你到底行不行?

【导读】:说到 C/C++ 代码技巧,也许会有童鞋说 ,这是属于 C/C++ 程序员离职前恶搞之类的抖机灵。即便想,也不能干。别忘了有这样一句编程名言:「在编写...

2185
来自专栏Aloys的开发之路

C/C++大数库简介

在网络安全技术领域中各种加密解密算法的软件实现上始终有一个共同的问题就是如何在普通的PC机上实现大数的运算。我们日常生活中所应用的PC机内部字长多是32位或64...

28110

扫码关注云+社区