【05】密码学与隐私保护
5-1 零知识证明
零知识证明介绍
零知识证明的概念
设P(Prover)表示掌握某些信息,并希望证实这一事实的实体,V(Verifier)是验证这一事实的实体。
零知识证明是指P试图使V相信某一个论断是正确的,但却不向V提供任何有用的信息,或者说在P论证的过程中V得不到任何有用的信息。
经典例子:
阿里巴巴(Prover)与四十大盗(Verifier)的故事其中一个片段。阿里巴巴会芝麻开门的咒语,强盗向他拷问打开山洞石门的咒语,他不想让人听到咒语,便对强盗说:“你们离我一箭之地,用弓箭指着我,你们举起右手,我念咒语打开石门,举起左手,我念咒语关上石门,如果我做不到或逃跑,你们就用弓箭射死我。”
这个方案对大盗没损失,也能帮助他们搞清楚阿里巴巴到底是否知道咒语,大家达成一致,强盗举起了右手,阿里巴巴的嘴动了几下,石门打开了;强盗举起左手,阿里巴巴的嘴动了几下,石门又关上了。强盗有点不信,没准这是巧合,多试几次过后,大盗相信了阿里巴巴。这就是最简单易懂的零知识证明。
零知识证明的三性
Completness(完备性)
对于正确的声明,验证者“总是”接受
如果证明方和验证方都是诚实的,并遵循证明过程的每一步,进行正确的计算,那么这个证明一定是成功的,验证方一定能够接受证明方。
Soundness(可靠性)
对于错误的声明,验证方“总是”拒绝
没有人能够假冒证明方,使这个证明成功。即打开房间的钥匙是唯一的。
如果语句为假,不排除有概率欺骗者可以说服诚实的验证者它是真的。
Zero knowledge(零知识)
证明者在交互的过程中不会泄露任何知识的信息
如果语句为真,证明者的目的就是向验证者证明并使验证者相信自己知道或拥有某一消息,而在证明过程中不可向验证者泄露任何有关被证明消息的内容。
证明过程执行完之后,验证方获得了“证明方拥有这个知识”这条信息,而没有获得关于这个知识本身的任何一点信息。
零知识证明的一般过程
证明方和验证方拥有相同的某一个函数或一系列的数值。零知识证明的一般过程如下:
- 证明方向验证方发送满足一定条件的随机值,这个随机值被称为“承诺”。
- 验证方向证明方发送满足一定条件的随机值,这个随机值称为“挑战”。
- 证明方执行一个秘密的计算,并将结果发送给验证方,这个结果称为“响应”。
- 验证方对响应进行验证,如果验证失败,则表明证明方不具有他所谓的“知识”,退出此过程。否则,继续从1开始,重复执行此过程t次。
如果每一次验证方均验证成功,则验证方便相信证明方拥有某种知识,而且此过程中,验证方没有得到关于这个知识的一点信息。
零知识证明的优缺点
优点年
- 随着零知识证明的使用,安全性不会降级,因为该证明具有零知识性质。
- 高效性。该过程计算小,双方交换的信息少。
- 安全性依赖尚未解决的数学难题,如离散对数,大整数因子分解,平方根等。
- 许多零知识证明相关的技术避免了直接使用有政府限制的加密算法,这就给相关产品的出口带来了优势。
缺点
- 生成零知识证明需要大量的算力
- 部分协议需要可信设置
- 部分协议不能抗量子计算
零知识证明的技术架构
当前零知识证明的技术实现架构可以分为五层结构:
1. 底层基础
底层基础算法库是实现零知识证明系统的前提,零知识证明技术依赖有限域计算、矩阵计算、椭圆曲线运算等数学基础原理。
2.证明系统(proof system)
即零知识证明协议。零知识证明有多种协议,因此每一种协议都需要对应一个证明系统。目前应用最为广泛的协议包括gROTH16,Bulletproofs。
3. 电路约束(circuit)
为了完成一次零知识证明,需要先将待证明的实际问题转换成证明协议可以验证的约束关系并以电路的形式表示出来。构造电路约束关系建立在实际问题和证明之间的连接,是零知识证明工程实现中最重要的部分。
电路的构造是难度很大。一方面,由于不同问题所对应的约束关系不同,电路也有所不同;另一方面,构造电路的正确性难以保证,一旦构造的电路不正确,证明结果的可靠性就难以保证,并且尤其对于复杂的问题,约束关系若不完整或者不正确也很难被发现。因此在实际的应用中,如何保证电路实现的正确性,完整性和高效率是尤为关键的一环。
4. 电路组件(gadget)
复杂约束关系中包含了很多复用的简单约束关系,如布尔值证明,范围证明和哈希证明等等。这些约束关系经常被作为一个gadget。开发人员仅需直接调用接口即可正确完成这部分的电路构造。减少了开发过程中的错误并简化了开发人员的工作量。
5. 上层应用
主要分为两大类:
①在应用中直接调用零知识证明库完成电路构造和证明
②为了降低DAPP开发难度,在区块链底层构建工具包集成零知识证明开源工具,如以太坊的SNARK工具箱ZoKrates
零知识证明的分类
交互式证明
基本的零知识证明是交互式(Interactive Zero-knowledge,IZK),需要验证者B向证明者A不断询问一系列有关其所掌握的数据的相关问题,如果均能够给出正确回答,大概率证明者A的确拥有相关数据
下图洞穴中C和D之间有一道门,必须使用密码才能打开才能通过,否则C/D便都是一个死胡同。证明者A(prover)如何能够在不向验证者B(Verifier)暴露秘密,使验证者B相信证明者A知道C/D门的密码
交互式零知识证明中,重复的次数越多,数据的真实性越高。当这个概率足够高时,几乎可以认定信息是真实可信的
验证时间冗长
需要交互双方同时在场
非交互式证明
非交互式零知识证明(Non-Interactive Zero-knowledge,NIZK)将交互次数减少到一次,可实现离线证明和公开验证,不需要互动过程,避免了串通的可能性,大幅减少通信步骤而提高了通信效率
非交互式是非常适合区块链的零知识验证技术,可以在不知道具体交易内容的情况下验证交易的有效性
验证者V想验证证明人P是否有房子钥匙,但是证明人P不想让验证者V看到钥匙。验证所有权
如果验证者V认为椅子只有房子中才有,则验证者V可以认为证明人P的确拥有该房子的钥匙
非交互式证明意味着代码可被部署且自动执行
零知识证明协议
主要零知识证明协议特点对比
Trusted Set-Up | Speed(Verifier+Prover) | Proof Size | Quantum Resistant | |
---|---|---|---|---|
zk-snark | Yes | Middle | Smallest | No |
zk-stark | No | Fastest | Biggest | Yes |
Bulletproofs | No | Slowest | Middle | No |
Trusted Set-Up(可信设置):是否需要可信设置
Speed(Verifier+Prover):证明者生成证明和验证者验证证明所花费的时间总和。
Proof Size:生成零知识证明的大小
Quantum Resistant(抗量子):是否抗量子攻击,在未来量子计算可能会对现有的加密算法带来威胁
zk-SNARK协议证明过程
大部分的ZKP的实例只能应用于一些特殊的场景,而zk-SNARK的方法更加通用,而且已经用C++实现
zk-SNARK过程一:将一个问题描述成QAP
算术电路拍平和R1CS约束
算术电路拍平,技术用一组向量定义算术电路的所有的变量
门向量RICS挑选
挑选向量a,b,c使门1计算成立
完整的RICS系统
多项式表达
采用上述方法计算矩阵A、B、C多项式,得到多项式矩阵
zk-SNARK过程二:抽样实现简洁验证
为了实现QAP多项式验证,传输一个长式子需要花费大量时间,效率比较低。比如ZCash多项式高度达2,000,000,每次验证都需要传输大量数据,不符合简洁性要求。zk-SNARK采用统计学中抽样的方法随机抽取一个值进行验证。
zk-SNARK过程三:利用同态映射隐藏抽样点
Verifier不能直接将抽样点告知证明者,而是提供了t的一系列指数:t^0,t^1,……,t^N的映射值E(1),E(t^1),E(t^2),……,E(t^N)
zk-SNARK改进过程四:KCA(Knowledge of Coefficient test and assumption)
零知识证明技术在区块链应用
从应用层面上,零知识证明在区块链领域的应用大致可以分为三层:
上层应用 | 零知识证明在上层DAPP应用中的直接应用也是其发展的一个重要部分 |
---|---|
底层扩展 | 将零知识证明技术做为底层扩展技术的组成部分,以此支撑三层应用来使用零知识证明技术也是一个重要方向 |
公链基础 | 零知识证明的隐私保护能力和数据压缩能力是其成为公链基础组成技术的主要原因 |
从应用分类上,零知识证明技术在区块链应用上可以大致分为隐私保护和扩容两大类:
隐私保护
在隐私场景中,我们可以借助零知识证明的“不泄露信息”特性,在不泄露交易细节(接收方、发送方、交易余额)的情况下,证明区块链上的资产转移是有效的。
链上资产交易
资产信息是一个人或者一个机构的隐私信息中非常重要的一部分,账户的资产信息及资产交易信息暴露在公开场合这对于资产管理无疑是很大的风险和威胁,而区块链的一个主要特征就是公开的账本,所有的交易信息都公开可追溯,虽然这在一定程度上解决了信息不对称和欺诈的问题,但也确实对账户资产隐私造成了很大的危害。一旦用户与区块链上某个钱包地址关联,那么这个用户的所有资产信息和交易信息都将暴露无遗。
为此,区块链从业者提出了多个解决问题的方案。如更换新地址,混币技术,环签,以及零知识证明。其中零知识证明的优势最为明显,它通过提交完全不泄露任何信息的证明来完成交易的方案,是实现了交易信息完全匿名,同时又能够支持大规模的交易,因此它被广泛采纳用于实现区块链上的资产交易隐私保护。
不仅仅是区块链本身的底层货币,以智能合约为基础的Token资产(如ERC20 Token,ERC721 Token)的资产转移也同样可以使用零知识证明技术来保护交易隐私。
数字身份认证
传统的身份信息认证手段——将用户的个人信息完成认证并保存在服务器后台的方式已经很难保障用户的个人身份信息和隐私安全了,尤其是对于以去中心化为核心特征的区块链领域来说,如何通过技术手段实现在不泄露用户身份信息前提下完成身份认证变得尤为重要。在最初区块链上,仅存在钱包地址账户,这与现实生活中的个人身份并没有直接的关联关系,用户仅依靠持有的私钥来获取账户的所有权。但随着区块链进一步落地应用,基于区块链的应用不免与实际生活和现实个人身份的联系越发密切。
在用户数字身份的认证问题上,零知识证明能够在完成身份认证中的交互的同时,保证用户信息的隐私性和认证结果的正确性。提供证明的一方只需要将已有用户身份信息计算出来的数字上链,验证方即可验证用户身份并且依赖数学手段,可以完全保证身份信息为真实可信的,同时任何人也无法从证明中提取用户个人信息的数据。
监管检查
除了用户的个人身份信息,在如航空,能源,金融,保险等领域,很多的应用场景下都存在着大量的隐私数据,这些数据不能暴露于公众但又必须受到某些机构的监管。当这些领域与区块链相结合时,如何在保护数据隐私的前提下实现对数据的检查和监管变为尤为重要。
零知识证明的隐私保护能力和验证能力完美地解决了这个问题。通过零知识证明技术,这些隐私数据无需直接上链,隐私数据由第三方提供,再由证明者生成合规证明提交上链,而监管方仅需要验证链上提交的证明即可完成监管检查。例如在信用凭证的场景下,由银行提供某用户是否正确支付了税款,再由用户生成数据证明提交上链,监管方完成验证:
- 用户提交的证明是否是根据银行提供的数据生成的证明;
- 用户数据是否达到信用凭证要求
监管检查对于公链的用处并不大,但对于联盟链,尤其是对安全性要求较高,监管力度较大的领域,零知识证明的该项应用非常重要。
扩容
在扩容场景中,不太关注零知识证明技术的“不泄露信息”这个特性,更加关注“证明论断有效”这个特性。由于链上资源是有限的,所以我们需要把大量的计算迁移到链下进行,因此需要有一种技术能够证明这些链下发生的动作是可信的,零知识证明正好可以帮助我们做链下可信计算的背书。
随着越来越被大众所熟悉和认可,区块链本身的性能问题已经难以满足当下的需求。
一方面,由于去中心化网络数据传输和节点同步的约束,致使区块大小非常有限,因此每个区块能够容纳的交易数量很有限,而区块链能存储的数据也很有限;
另一方面,由于区块同步机制的存在,导致交易不能及时处理,这严重阻碍了对响应速度有极高要求的传统应用场景向区块链迁移。
零知识证明仅需要生成很小数据量的证明就可以完成对大批量数据的证明。很多技术专家们一早就注意到零知识证明的这一特性对于解决区块链性能瓶颈所具备的潜力。
早在2018年10月,以太坊创始人Vitalik就曾表示,通过zk-SNARK大规模验证交易,就可以在以太坊扩展资产交易规模。利用zk-SNARK,以太坊上每秒可处理的数据量达到500笔。这是当时以太坊网络每秒所能处理的交易数量的30倍以上。目前很多基于零知识证明的扩容解决方案有很多,主要以链下扩容,链上区块压缩和轻量级客户端三个方向为主。
链下扩容
是指在加密货币的主链之外,建立外围或第二层交易网络的分层结构,即将绝大部分的计算转移到链下或侧链来完成,而主链仅提交极小数据量的计算结果。迄今为止,技术专家们在区块链扩容方面的尝试有很多,并且已经有一些较为成熟的分层方案已经开始落地使用。
实现分层方案的一个最核心的问题就是如何保证从二层网络提交到主链数据的真实性,零知识证明正是解决这一问题的一个重要方案。
首先,零知识证明的重要特性——仅需要生成很小数据量的证明就可以完成对大批数据的证明,这一点非常契合分层方案中在二层完成数据计算而仅向主链提交很小的数据量的需求;其次,零知识证明的数学特性保障了只要提交到主链的数据能够通过验证,那么数据就是正确的,二层网络完成的计算就是可信的。因此,零知识证明技术它在不牺牲原有区块链安全性的前提下实现更高的并发量,并且由于提交到链上的数据变小,而完成一笔交易或执行合约的成本也变得更小。
链上区块压缩
在区块链上,区块的大小是有限的,每个区块所能容纳的交易数量也是有限的,因此如果能够使得每笔交易的数据量缩小,那么区块所能承载的交易数也会增加。所以除了向链下扩展,区块数据压缩也是提高区块链吞吐量的一种重要思路。
使用零知识证明实现的压缩为应用上链也提供了诸多的好处:
- 解决了很多实际业务中处理的数据量很大,根本无法上链的难题。
- 降低了成本 压缩后的数据提交上链,所消耗的手续费也将下降。因而区块压缩技术为更多的应用上链增加了可能性。
与链下扩容类似,实现区块压缩的关键就是如何在验证压缩后的数据的真伪。同样零知识证明在这里依然可以发挥很大的用处。并非要将完整的数据都要提交上链才能保证业务的正确执行,因此可以把链下的许多业务处理过程压缩成一个很小的证明,然后智能合约验证提交的证明就能保证服务节点没办法作弊。
轻量级客户端
随着区块的不停累加和业务的增长,全节点的数量也在不断增加,因此区块链全节点将变得巨大,这使得节点的网络同步以及存储都变得很难。因为一方面,下载几百G甚至几T的全节点数据需要耗费很长时间;另一方面,全节点需要对下载的数据完全校验来确保数据的正确性,在大部分的区块链上校验过程需要将全节点所有的交易按照顺序执行一遍再和下载的状态做比较,每个全节点都要做一次校验,因此这个过程非常消耗时间。
受制于硬件设备的要求和运行全节点的复杂性,使得同步全节点对于大部分普通用户来说非常困难,这严重阻碍了区块链的大规模应用。因此如果通过技术手段解决以上问题构建出轻量级客户端是区块链应用可以大规模商业化的必备要素。
因此零知识证明的压缩能力再一次发挥作用。同时利用零知识证明的验证能力,可以在不牺牲安全性的前提下很好地解决区块同步期间每个全节点都要重复执行验证交易区块数据的问题。所以说零知识证明为构建轻量级客户端提供了很好的方案。
目前有一个Coda项目,提供零知识证明的不断递归能力将目前几十GB的区块链账本压缩到20K,而这个数据量使得哪怕是移动端设备都可以轻而易举地完成区块同步。
零知识证明在区块链中的应用案例
ZCash
ZCash作为匿名加密货币项目,开始只是作为比特币的加密匿名层存在,后来因为其优秀的隐私性成为独立的加密货币
ZCash交易模式参考了BTC的UXTO模型,ZCash交易原始的输入输出保存在note结构体
Note结构
- 持有者的公钥:a_pk,又称收款人地址
- 面额:value,又被简称为v,代表这笔note的代币数值
- 随机数:rho,是每一条note的唯一标识,当一条note被消费了之后,这个值会被放置到nullifier表中,代表这条note已经被消费了,再次进行消费同一条note的时候,会触发双花错误,即交易双花防护机制
- 随机数:r
用向量组代表note表示为:note=<a_pk,v,r,rho>
note commitment
作为交易的输出,表示一张新note被签发。一个有效的commitment是一张note存在的证明,然而从它包含的信息中并不知道是哪张note,也就是无法知道所有者是谁,金额多少
commitment=HASH(recipient address,amount,rho,r)
note nullifier
作为交易的输入表示一张老支票将作废。和比特币一样,一个交易的输入一定是另一个交易的输出,因此nullifier对应唯一一个commitment(结合commitment的定义,也就唯一对应一张note),但从它包含的信息并不能推导出是哪个commitment(如果可以的话,ZCash交易便可被追踪,因而丧失隐私性)
nullifier = HASH(r)
ZCash隐私交易流程
Anna决定将金额为v1的note1转给Carl,他的公钥/地址是PK4,流程如下
- 随机挑选一个序列号r4,并以此产生note4 =(PK4,v1, r4,rho);
- 秘密地将note4发给Carl;
- 将note1的nullifier,即nf2 = HASH(r1),以及新产生的note4的commitment,即其哈希值HASH(note4)广播给所有节点
- Anna在发布使用note1的时候还要向节点出示称为π的零知识证明凭据,根据π信息能够证明:转账方通过私钥SK、公钥PK、支票序列号r计算后的哈希值,与在签发列表中存在的哈希值一致,来证明转账方的note存在
- 矿工确认note存在后,就会在作废列表中查询,如果没有此笔note的作废记录,则证明转账方note有效(防止双花)。然后再在作废列表中,把当前note的序列号哈希计算后的值记录在作废列表中,表明此笔note已经作废,同时为收款方签发新的note
节点能够知道的只有note1的nf2和note4的C4,他们对收款人地址,金额是多少都一无所知,无法从π推断出有关PK1、sk1和r1的任何信息
ZCash零知识自证
π足以证明提供人知道能满足以下条件的PK1,sk1(PK1对应的私钥)和r1的值
- 用PK1、r1复原的note数据结构,其哈希值存在于commitment集合中,用以支付的note是有效的;
- sk1是PK1的公钥Anna有权使用note1
- HASH(r1) = NF2,nullifier与commitment一致
ZCash利用zk-SNARK零知识证明技术
- ZCash中交易信息描述成一个QAP
- 抽样实现简洁验证
- 利用同态映射隐藏抽样点
zk-Rollup
zkRollup就是基于零知识证明的二层扩容方案(layer2),链下进行复杂的计算和证明的生成,链上进行证明的校验并存储部分数据保证数据可用性
relayer收集用户的交易,交易收集完成后relayer会执行每个交易(校验余额,校验nonce,校验签名,执行状态转换),当交易执行完成后会产生一个新的Merkle tree Root,为了证明链下状态转移是正确的,replayer会在交易执行完成后生成一个零知识证明的proof
relayer把 prev state root,post state root,交易数据和proof证明提交至链上合约,合约校验proof通过后会将新的状态写入到链上,合约不需要单独校验每笔交易的合法性,只需要校验proof是否有效,降低了链上gas消耗
- 将主链作为存储媒介,而非共识引擎
- 将交易压缩,并在链下达成状态共识
- 用零知识证明保证链下状态共识的安全性
zk-Rollup证明生成与验证
- 链下交易证明生成
- 每个具体交易问题抽象成数学表达式,zk-Rollup将多个交易打包,生成一个数学表达式的形式表示,再将其拍平表达成一个算数电路,也就是生成电路表达。
- 有了这个电路表达之后,再构造一个约束系统,最常用的是R1CS(rank-1 constraint system,一阶段约束系统)
- 有了这套约束系统之后,再把这个问题转化成多项式可满足的一个问题,即QAP问题
- QAP问题得到之后,再用ZK-SNARK算法系统去给出生成最终的证明
- 链上验证
- 智能合约根据构造的ZK-SNARK算法对proof正确性进行验证
- 如果proof正确且合约中保存的状态与PREV_STATE相等,那么新的状态POST-STATE将会被记录对合约中,替换原有的状态
5-2 同态加密
同态加密概述
同态加密的定义
问题情境
小王有一大块金子,他想找人把这块金子打造成一个金手链。他既需要工人可以对金块进行加工,同时又不能让工人得到任何金子
- 不能让工人直接加工金子,因为个人可能会顺手牵羊;
- 也不能让工人不接触金子,不对金子进行处理加工,那样金子无法变成金手链
问题提出
- 将金子锁在一个密闭的盒子里面,盒子里安装了固定的手套;
- 工人带着手套可以对盒子内部的金子进行处理,但无法取出任何东西;
- 加工完成后,小王拿回盒子,把锁打开,取出手链
以上方案可以很好地解决以上问题,工人只能通过暗箱内部自带的手套对金子进行加工,无法取出金子。等到工人加工完后,将锁打开便可获得金手链以及剩余的金子残料
暗箱加工金手链的原理与同态加密原理有异曲同工之处。
同态加密概念
同态加密是1978年Rivest、Adleman和Dertouzos三人提出的用于进行秘密计算的构想,构想又被称为隐私同态。秘密计算的发起者,首先用自己的公钥对数据进行加密,将加密结果发送给其他参与者,其他参与者直接对密文进行函数运算,并将结果返回给发起者,发起者解密数据获取运算结果。运算过程中计算参与方无法获取发起方的原始明文数据。同态加密主要包含以下四个算法:
- 密钥生成算法:输入安全参数λ,输出公钥pk和私钥sk
- 密文生成算法:给出一个明文m∈{0,1}*,用公钥pk加密明文m,得到密文e
- 密文运算算法:输入公钥pk,t个输入的电路C,密文e,输出新密文e'
- 明文生成算法:输入私钥pk和密文e'进行解密运算,输出明文m'
同态加密发展
同态加密流程
密钥生成、加密元数据、密文运算、解密运算结果
同态加密特性
密文运算
计算着无法获取原始数据及运算结果,因为:
- 准确窃取发起者的密钥
克服:发起者主机的安全防护
等待:发起者泄露私钥
猜测:弱密钥
- 攻破公钥密码体制
截获:发起者的加密消息
推断:加密者的私钥(离散对数,大整数分解等数学难题)
公钥密码
同态加密技术理论基础是公钥密码体制
- RSA
- ElGamal公钥体制
- 格密码理论
同态加密算法优劣
优势
- 密文运算:保护原数据不被窃取
- 密文传输:保护数据不被窃听破解
- 基于密码学难题:从理论上保证安全性
- 低成本:只需要消耗少量内存及算力
- 应用便捷:热插拔,方便部署
劣势
- 部分算法不抗量子攻击:仅基于格理论的同态算法抗量子攻击
- 部分算法存在精度损失:全同态加密算法存在这一问题
- 部分算法交互成本高:加性同态加密算法存在这一问题
- 部分算法公平性不足:加性同态加密算法存在这一问题
同态加密算法
密码基础理论
公钥密码体制
采用两个密钥,其中一个称为公钥,对外公开,用于加密变换,任何人都可以得到,另外一个称为私钥,用于解密变换,只有用户才有,已知密码算法及公钥,无法推出私钥
公钥密码体制依赖于数学难题:
- 大整数分解难题(RSA)
- Zp域上的离散对数问题(DH)
- EC上点域的离散对数问题(EC)
格理论
格上难题
- 最短向量问题SVP:给定格基B,找出格L(B)的最短向量
- 最近向量问题CVP:给定格基B和一目标向量t,找出格L(B)中离T最近的向量
半同态加密算法
概述
算法定义:支持对密文进行部分形式的计算
算法分类:加法同态、乘法同态
代表算法
- Paillier算法:1999年提出,属于加法同态加密算法
- ElGamal算法:1985年提出,属于随机化的乘法同态加密算法
- RSA算法:1977年提出,属于非随机化的乘法同态加密算法
应用场景:联邦学习、DSS数字签名标准、非同态场景
RSA算法
算法地位:经典的公钥加密算法
理论基础:大整数分解困难问题
算法功能:公钥加密,数字签名
算法局限:未采用填充模式的原始RSA算法才满足乘法同态特性
算法弱点:原始RSA算法在加密过程中没有使用随机因子,相同密钥加密相同明文所得的结果也相同,攻击者可能通过选择明文攻击得到原始数据
ElGamal算法
算法地位:ISO同态加密国际标准中唯一指定的乘法同态加密公钥密码算法
算法作用:公钥加密,数字签名
算法特性:随机化加密算法,且满足乘法同态特性
理论基础:有限域中离散对数难题
Paillier算法
理论基础:合数剩余类问题
算法地位:ISO同态加密国际标准中唯一指定的加法同态加密公钥密码算法
同态理论:将复杂计算需求以一定方式转化为纯加法的形式
算法特性:支持加法同态和数乘同态
算法流程
全同态加密算法
概述
算法定义:支持对密文进行任意形式的计算
理论基础:格代数结构
算法发展
- 第一代:Gentry方案:2009年提出,效率较低
- 第二代:BGV/BFV方案:2012年提出,基于算数电路,可实现快速整数算术运算
- 第三代
- GSW方案:2013年提出,支持任意布尔电路,基于近似特征向量
- CKKS方案:2017年提出,可实现浮点数近似计算
Gentry方案概述
算法特点:支持对每个比特进行加法和乘法同态运算
理论基础:电路模型
基本原理:在类同态加密算法的基础上引入“Bootstrapping”方法控制运算过程中的噪音增长
将解密过程转化为同态运算电路
生成新的公私钥对
对原私钥和含有噪音的原密文进行加密
用原私钥的密文对原密文的密文进行解密
BGV/BFV方案概述
理论基础:容错学习问题/环上容错学习问题假设;代数格上的困难问题
技术基础:模交换技术
算法特点:支持对每个比特进行加法和乘法同态运算
开源支持:HElib
密文和密钥以向量表示
模交换技术用于控制密文同态运算产生的噪声
GSW方案概述
理论基础:容错学习问题/环上容错学习问题假设
算法特性:基于近似特征向量,密文为矩阵形式,矩阵相乘不会导致矩阵维数的改变,解决了以往方案中密文向量相乘导致的密文维数膨胀问题,无需进行用于降低密文维数的密钥交换过程
开源支持:Inpher TFHE
CKKS方案概述
理论基础:容错学习问题/环上容错学习问题假设
算法特性:支持针对实数或复数的浮点数加法和乘法同态运算,得到的计算结果为近似值,适用于不需要精确结果的场景
开源支持:HElib和SEAL
同态加密在区块链中的应用
应用概况
华为区块链:提供同态加密库,对用户的交易数据用其公钥进行加密保护,交易时进行密文运算,账本数据密文保存
趣链Hyperchain:采用Paillier同态加密算法实现区块中交易金额和账户余额的加密
BCOS:采用Paillier同态加密算法实现区块中交易金额和账户余额的加密
同态加密应用流程
加密账本及交易
交易数据加密上链参与计算
账本数据加密存储密文参与运算
合约编译
上链的数据通过调用paillier库完成加密,链上的密文数据通过调用paillier预编译合约实现密文的同态加运算,密文返回业务层后,通过调用paillier库完成解密,得到执行结果
5-3 多方安全计算(MPC)
安全多方计算概述
安全多方计算起源
安全多方计算技术(MPC或SMPC,Secure multi-party computation)
指在无可信第三方的情况下,多个参与方协同计算一个约定函数,除计算结果以外,各个参与方无法通过计算过程中的交互数据推断出其他参与方的原始数据。
安全多方计算起源于1982年姚期志院士提出的姚氏百万富翁问题。
两个百万富翁在街头偶遇,双方想要知道谁更有钱,但他们都不想暴露自身的资产金额,如何在不借助第三方的情况下,得出谁更富有的结论。
百万富翁问题
一个简化的问题模型
假设两个富翁张三和李四,财产均在1千万到1亿之间,他们也只想做千万级的比较,即每个人只在乎是否在千万级别上谁更富有
二人分别用1~10中的一个数字代表自己千万级的财富,如何知道谁的数字更大一些?
假定(半诚实对手模型):
- 两人都值得信任,不会作假
- 两人都希望诚实地比较出谁更富有
- 两人都希望知道对方财产到底是多少
一个“解决方案”
有人提出:放一个天平,两边放上封闭的盒子,让两个百万富翁分别在两边放入质量相同的苹果,有几千万就放几个,最后看哪边重就可以了。
——这样可以吗?
——不可以!
不可忽略一个条件——不存在可信的第三方!
天平谁来提供?提供天平者可以知道一切的。
经典解决方案
假设张三拥有3000万(X=3),李四拥有4000万(Y=4)
- 张三找10个盒子,按0!9顺序摆好,并按照自己的财富值分别放不同颜色的球(小于财富值,放绿球;等于财富值,放黄球;大于财富值放红球),然后把10个盒子上锁;
- 李四根据自己的财富值为相应的盒子再加一把锁,然后撕掉序号,并把其他盒子销毁;
- 张三李四分别开锁,查看盒子里面到底是什么颜色的球。即可得到谁更富有的答案:绿球——张三比李四富有;黄球——两人一样富有;红球——李四比张三富有。
安全多方计算框架模型
安全多方计算的形式化描述
n个计算参与方分别持有数据x1,x2,…,xn,协议的目的是利用各方的秘密数据计算一个预先达成的共识函数
(y1,y2,...,yn) = f(x1,x2,…,xn)
此时任意一方可以得到对应的结果yi,但无法获得其他任何信息。
多方参与的计算模型
在传统分布式计算模型下,分布式计算由中心节点组织协调各参与方的计算进程,各参与方的原始数据对第三方来说毫无秘密可言,很容易造成数据泄露。
在MPC计算模式下,不需要可信第三方收集所有参与节点的原始明文数据,只需要各参与节点之间相互交换数据即可,而且交换的是处理后的数据,保证其他参与节点拿到数据后,也无法反推原始明文数据,确保了各参与方数据的私密性。
MPC技术框架
每个数据持有方均可发起协同计算任务。
当一个MPC计算任务发起时,枢纽节点负责路由寻址和计算逻辑传输。
各个MPC节点根据计算逻辑,在本地数据库完成数据提取、计算,并将输出计算结果路由到指定节点,从而多方节点完成协同计算任务。
在保证输入隐私性的前提下,各方得到正确的数据反馈,整个过程中本地数据没有泄露给其他任何参与方。
安全多方计算特点
安全多方计算理论主要研究参与者间协同计算及隐私信息保护问题,其特点包括:
输入隐私性:必须保证各方私密输入独立,计算时不泄露任何本地数据。
计算正确性:参与各方就某一约定计算任务,通过约定MPC协议进行协同计算,计算结束后,各方得到正确的数据反馈
去中心化:各参与方地位平等,不存在任何有特权的参与方或第三方,提供一种去中心化的计算模式。
安全多方计算组成
安全多方计算不是一种单一的技术,它是由一系列技术组成的集合。通用的组成结构主要包括两层:支撑技术层以及MPC协议层。
安全多方计算关键技术
混淆电路(Garbled Circuit,GC)
混淆电路是由姚期志先生提出的针对半诚实敌手模型的两方安全计算协议。
核心思想是通过加密和扰乱电路的值来掩盖数据信息。
基于混淆电路技术可以构造出通用的安全多方计算协议。
单个电路的混淆电路设计工作原理
混淆电路是将任何函数的计算问题转化为由“与门”,“或门”和“非门”组成的布尔逻辑电路,再利用加密技术构建加密版本的布尔逻辑电路。
加密混淆过程
Alice首先给每条线指定两个随机的Key(密钥),分别对应0和1。
Alice用这些密钥加密真值表,并将该表打乱后发送给Bob。
这一加密+打乱的过程,就是混淆电路的核心思想。
解密分析过程
Bob收到加密表后,如何计算?
Alice把自己的输入对应的Key(密钥)发给Bob。同时把和Bob有关的Key都发给Bob。
然后Bob根据自己的输入挑选相关的Key,并根据收到Alice的Key与自己的Key,对上述加密表的每一行尝试解密,最终只有一行能解密成功,并提取出相应的Kz。
Bob将Kz发给Alice。Alice通过对比,得知计算结果是0还是1。从而解密得到最后结果。
秘密共享(Secret Sharing,SS)
通过将秘密信息分割成若干的秘密份额并分发给多人掌管,以此来达到风险分散和容忍入侵的目的。
秘密共享方案由一个秘密分割算法和一个秘密重组算法构成,包含秘密分发者、秘密份额持有者和接收者三类角色。
秘密分发者持有秘密信息并且负责执行秘密分割算法,并将秘密份额分发给秘密份额持有者。
当接收者希望重组秘密信息时,将从一组授权的秘密份额持有者中收集秘密份额,并执行秘密重组算法计算秘密信息,当有充分的秘密份额就可以重新恢复出秘密信息。
基本原理
- 获取数据。参与者将每个数字x拆散成多个数x1,x2,...,xn,并将这些数分发给多个参与者s1,s2,...,sn。
- 本地计算。各参与方用自己本地的数据进行计算,并交换一些数据,计算结束后的结果仍分散在各参与方那里。
- 得出结果。所有服务器最终将所有计算结果数据整合起来,得出最终数据。
举个例子
以计算A、B、C平均工资为例。
假设A工资10万,他把自己的薪资信息拆分后,分发给了B(2万)和C(5万),B和C进行相同逻辑拆分。
不经意传输(oblivious transfer,OT)
是一个密码学协议,指的是数据发送方有N个数据,数据接收方请求接收一个数据,发送方收到请求后随机发送一个数据,并且自己并不知道发送的是哪个数据。这种方法保护了被选择之外数据的隐私性。
不经意传输是一种可保护隐私的双方通信协议,接收者的隐私不被发送者所知道,使通信双方以一种选择模糊化的方式传送消息。
几种形式
1选1 | 发送者Alice发送一条消息给接收者Bob,而Bob以1/2的概率接收到信息,在结束后Alice并不知道Bob是否接收到了信息,而Bob能确信地知道自己是否收到了信息。 |
---|---|
2选1 | Alice给Bob发送两条消息(m1,m2),Bob能够在不知道另外一条消息的内容的情况下得知其中一条消息的内容,且Alice不知道Bob选择的哪条消息。 |
n选1 | 是2选1的一般推广。Alice给Bob发送n条消息,Bob能够在不知道另外其他消息的内容的情况下得知其中一条消息的内容,且Alice不知道Bob选择的哪条消息。 |
n选k | 是更加一般化的一种情形。指的是Bob从Alice的n个输入中得到m个。 |
基于RSA的1out2不经意传输的实现过程
- 发送者Alice生成两对RSA公私钥,并将两个公钥puk0,puk1发送给接收者Bob。
- Bob生成一个随机数δ,并用收到的两个公钥之一加密随机数,并将密文结果发送给Alice。
- Alice用自己的两个私钥分别解密收到随机数密文,并得到两个解密结果k0,k1,并将两个结果分别与要发送的两条信息进行异或(k0异或M0,k1异或M1),并将两个结果e0,e1发给Bob。
- Bob用自己的真实随机数与收到的e0,e1分别做异或操作,得到的两个结果中只有一条为真实数据,另外一条为随机数。
同态加密(Homomorphic Encryption,HE)
基本概念
是指满足密文同态运算性质的加密算法,即数据经过同态加密之后,对密文进行特定的计算,得到的密文计算结果在进行对应的同态解密后的明文等同于对明文数据直接进行相同的计算,实现数据的“可算不可见”
分类
加法同态 | 如果满足f(A)+f(B)=f(A+B),我们将这种加密函数叫做加法同态 |
---|---|
乘法同态 | 如果满足f(A)*f(B)=f(A*B),我们将这种加密函数叫做乘法同态 |
全同态加密 | 如果一种同态加密算法支持对密文进行任意形式的计算(即满足加法和乘法),则称其为全同态加密 |
---|---|
半同态加密或部分同态加密 | 如果支持对密文进行部分形式的计算,例如仅支持加法、仅支持乘法或支持有限次加法和乘法,则称其为半同态加密或者部分同态加密 |
门限签名方案(TSS)钱包
基于安全多方计算的密钥管理
在数字货币里拥有账户的私钥就表示拥有了资金的所有权。为了提高资产安全,尤其是大额资产,目前有两种方案
多重签名
原理:通常需要有多个私钥(N),只有当其中的M个私钥参与的签名,才可以动用资产。
特点:把私钥交给不同人保管,可以提高安全性。即使部分私钥被泄露,只要没有超出容错范围,资产依然安全。
密钥共享
原理:将密钥分成多个部分并以冗余方式分开保管。发起交易时,将一定数量的密钥重新组装为密钥进行签名。
特点:可以容忍部分密钥被盗的风险,同时解决了多签费用高的缺点。不过有一个主要缺点,当密钥被重新组装时,会为攻击者提供了获取密钥的可乘之机。
门限签名方案
基本概念
门限签名方案(Threshold signatures,简称TSS),结合了多重签名和密钥共享的优点,它基于多方安全计算技术,使用多个分片的密钥轮流进行(交易)签名,生成最终有效的签名。
门限签名方案与多重签名、密钥共享方案的不同点
- 多签需要M/N个签名,而门限签名需要多方都参与签名
- 多签是链上进行的,费用较高,且实现方案差别很大。而门限签名是链下的纯密码学的计算生成签名,兼容性更强
- 多签可以异步进行签名,而门限签名要求所有参与方在线
- 密钥共享在将密钥分片后需要重构出密钥来签名,存在单点故障和重构出的密钥被泄露的可能。而门限签名不需要重构出密钥。
Zengo钱包
介绍
ZenGo钱包的密钥管理就是运用了门限签名方案,它使用两个独立(部分)私钥来取代传统的单个私钥模式。其中一个密钥保存在手机上,另一个存储在ZenGo服务器上,在进行交易的时候,手机和ZenGo服务器通信共同完成签名。
5-4 盲签名
盲签名概念及特性
盲签名定义
- 盲签名用于文件的书写和签名人并不是同一方场景。
盲签名举例说明
将隐藏的文件放进信封里,当文件在信封中,任何人不能读取内容。除去盲因子的过程即打开信封取出文件的过程。对文件进行盲签名就是通过在信封里放一张复写纸,因此签名者可以在不打开信封的情况下进行签名并透过复写纸签到文件上。
1983年David Chaum提出。签名者无法看到原始内容的前提下对信息进行签名。盲签名主要是为了实现防止追踪(unlinkability),签名者无法将签名内容和结果进行对应。典型的实现包括RSA盲签名。
电子货币是比特串,容易被复制和多次使用。为了避免双重支付问题,David Chaum提出了一个基于RSA算法的盲签名方案,并用它构造了一个基于盲签名的在线电子银行系统,银行可以在线实时检查Coin是否已经花掉。
该方案可以解决双重支付问题,但是实用性不高。主要原因是银行数据库数据量庞大,实时搜索耗时过长。
- 签名人仅起到为文件背书的作用。
- 盲签名的两个显著特点:
签名者对消息的内容是不可见;
签名被公开后,签名者不能追踪签名。
盲签名特征
- 不可伪造性。除了签名者本人外,其他人无法伪造签名者身份生成有效的盲签名。这是一条最基本的性质。
- 不可抵赖性。签名者一旦签署了某个消息,他无法否认自己对消息的签名。
- 盲性。签名者虽然对某个消息进行了签名,但无法了解消息的具体内容。
- 不可跟踪性。一旦消息的签名公开后,签名者不能确定自己何时签署的这条消息。
盲签名方案的一般过程
一个盲签名方案一般包括四个过程:
- 系统初始化:产生方案中的所有系统参数;
- 密钥对生成:产生用户的私钥和公钥;
- 签名:用户使用私钥对消息进行盲签名,签名过程可以公开也可以不公开:
- 盲化:用户将盲化因子注入待签名的消息;
- 盲签名:签名者对盲化过的消息进行签名;
- 去盲:用户从盲化签名(对盲化过的消息)去除盲化因子,获得去盲化的签名(待签名消息);
- 验证:验证者利用公开的系统参数、验证方法和签名者的公钥对给定消息的签名进行验证。
盲签名的分类
根据算法的功能分类
- 完全盲签名:由David Chaum于1987年提出,完全盲签名实现了签名的完全匿名性,任何人无法准确的追踪到签名。
- 要求银行实时在线;
- 完全匿名性易带来负面影响
- 限制性盲签名:解决了电子现金的二次花费问题,原理是将用户身份信息嵌入到签名中,当用户二次花费时可以准确地追踪到用户的身份信息。
- 防止重花费
- 实现了离线银行系统
- 公平盲签名:公平盲签名引入一可信的第三方,以便在需要对签名进行追踪的情况下,为签名者准确地追踪到签名。
- 防止不法分子进行敲诈勒索以及洗黑钱等非法行为。
- 部分盲签名:在盲签名的基础上增加一个公共信息,该公共信息由签名者和用户在签名之前商议得到,由签名者在签名过程中把这些公共信息嵌入签名中,且该公共信息不能被删除或非法修改。
- 签名前需要签名者和用户共同协商一个公共信息;
- 公共信息可以包括电子货币的有效期、面值等。
- 群盲签名:群签名和盲签名的有机结合,兼有群签名和盲签名的特性。
- 可以实现多个银行匿名地分发不可跟踪的电子现金;
- 签名者无法将消息签名对与某个具体的签名协议联系起来。
盲签名经典算法
基于RSA签名的盲签名算法
David Chaum 1982年提出盲签名概念并基于RSA算法设计了第一个盲签名方案。其安全性基于大整数分解问题。
1. 密钥生成
2. 盲化
3. 签名
4. 去盲化
5. 签名正确性验证
6. 安全性分析
基于Schorr签名的盲签名算法
1. Schorr签名
Schorr签名方案是一个短签名方案,其安全性是基于离散对数困难性和哈希函数单向性。
假设p和q是大素数,q能被p-1整除,q是大于等于160bit的整数,p是大于等于512bit的整数,g是有限域GF(p)中元素,从{0,1,...,p-1}取值,且 1 mod p。在有限域GF(p)中求解离散对数得到g的值非常困难。
- 密钥生成
- Alice选择随机数x为私钥,其中1<x<q;
- Alice计算公钥 y ≡
;
- 签名算法
- Alice首先选择随机数k,这里1<k<q;
- Alice计算 e = h(M,
mod p)
- Alice计算 s = k - x ▪ e (mod q)
- Alice输出签名(e,s)
- 验证算法
- Bob计算
mod p =
▪
mod p
- Bob验证 e = h(M,
mod p)是否成立,则输出“Accept”,否则输出“Reject”
- Bob计算
2. 盲签名算法描述
不可追踪性
基于身份的盲签名算法
1. 系统参数生成
KGC执行以下步骤生成系统参数和主私钥:
- 选择双线性对 e: G×G →
,P为G的生成元;
- 生成随机数 s∈
作为主私钥;
- 计算系统公钥
= s ▪ P和公开参数 g = e(P,
);
- 选择两个哈希函数H:{0,1}*→
,H1:{0,1}*→G;
- 保存主私钥s,公布系统参数{G, q,
, g, H, H1}
2. 用户私钥生成
KGC执行以下步骤生成用户私钥:
- 计算
= H1(1D);
- 技术用户私钥
= s ▪
;
基于身份的签名算法
给定系统参数,消息m,私钥,签名者执行以下步骤产生签名:
- 生成随机数 r∈
并计算 w = e( r ▪ P,,
);
- 计算 h = H(m,w) mod q;
- 计算 S = h ▪
+ r ▪
- 输出签名(h,S)
基于身份的验证算法
给定系统参数,消息m,签名(h,S),验证者执行以下步骤验证签名:
- 计算w' = e(S,P) e(
,
)
- 检查h和H(m, w')是否相等,如果相等则输出“Accept”,否则输出“Reject”
容易验证e( r ▪ P,, ) = e(S,P) e(
,
)
正确性成立!
3. 盲签名
盲性
很显然
不可追踪性
根据 R = r ▪ P,w = e(β ▪ +R+α ▪ P,
),h= H(m,w) mod q,h' = h + β mod q,S' = h' ▪
+ r ▪
和 S = S' + α ▪
,表明基于身份的盲签名算法无法提供不可追踪性:
- 签名者保存所有盲签名过程中的记录(r, R,h', S');
- 给定(m, h, S),签名者计算β‘ = h' - h mod q和T = α ▪
= S - S' mod q;
- 签名者计算w' = e(β' ▪
+R,
)e(P,T)并判定H(m,w')和h是否相等;
- 如果相等则找到了签名记录,否则遍历所有记录(r, R,h',S')
盲签名在区块链的应用
混币技术
一笔交易的输入必然是某一笔交易的输出,因此很容易找出交易的相关性
为了断开和
之间的连接,保护区块链隐私,诞生了混币技术
Mixcoin协议方案
混币服务器掌握A的和
之间的连接,存在泄漏用户隐私的问题
Blindcoin协议方案
- M公布盲签名
,作为追责凭证
- A公布去盲签名
,作为M向指定输出地址发送交易的凭证
- 用户对输出地址采用盲签名,保护用户交易信息
Blindcoin保证了没有被动对手可以在特定的混合中链接输入/输出地址对。因此,Blindcoin在同时参与混合的所有非恶意用户集合内实现k-匿名性。除了混币服务器的资源外,对可以同时参与混币的用户数没有任何限制,因此参与者越多,匿名集就越大。
通过使用盲签名方案隐藏参与者的输入/输出地址映射,实现了对混合服务的匿名性。
5-5 群签名
群签名概念及特性
群签名概念
群签名,即群数字签名。在一个群签名方案中,一个群体中的任意一个成员可以以匿名的方式代表整个群体对消息进行签名。与其他数字签名一样,群签名是可以公开验证的,而且可以只用单个群公钥来验证。
群签名是一种类似于数字签名的密码原语,其目的在于允许用户代表群签名消息,并在该群内保持匿名。也就是说,看到签名的人可以用公钥验证该消息是由该群成员发送的,但不知道是哪一个。同时,用户不能滥用这种匿名行为,因为群管理员可以通过使用秘密信息(密钥)来消除(恶意)用户的匿名性。
群签名方案的关键是“群管理员”,它负责添加群成员,并能够在发生争议时揭示签名者身份。在一些系统中,添加成员和撤销签名匿名性的责任被分开,并分别赋予给群管理员和撤销管理员。
群签名是一个中心化的签名结构,该结构的算法都是群处理员定的,形成签名者的隐私没有做到真实的保证。
群签名主要特点
- 群特性。只有群中成员能够代表群体签名
- 验证简单性。接收者可以用公钥验证群签名
- 无条件匿名保护。接收者不能知道由群体中哪个成员所签
- 可追查性。发生争执时,群体中的成员或可信赖机构可以识别签名者
群签名的安全性特性
完整性:群成员的有效签名始终验证正确,无效签名则始终验证失败。
不可伪造性:只有群成员才能创建有效的群签名
匿名性:给定一个群签名后,如果没有群管理员的密钥,则无法确定签名者的身份,至少在计算上是不可行的
可跟踪性:给定任何有效的签名,群管理员应该能够确定签名者的身份。(这也暗示了只有群管理员才能破坏其匿名性)
不关联性:给定两个消息及其签名,我们无法判断签名是否来自同一签名者。
无框架:即使所有其他成员相互串通(包括和管理员串通),他们也不能为非群成员伪造签名。
不可伪造的跟踪验证:撤销管理员不能错误地指责签名者创建了他本没有创建的签名
抗合谋攻击:即使所有群成员相互串通,他们也不能产生一个合法的不能被跟踪的群签名。
群签名方案流程
入群:群成员在入群之前都会向群处理进行申请入群,通过后,申请人会和群处理员达到交互式协议,该协议可生成群成员的私钥。群处理员对该密钥进行签名,并颁发给申请人,结束入群。群成员群处理员将群公钥对外揭露。
签名:群成员通过自己的群密钥和群公钥对消息进行签名,得到群签名。
验证:通过输入群公钥和群签名用揭露的某种验证方法进行验证,返回值只有真假,验证者无法计算得到签名者是群公钥里的详细人员,只知道该签名者归于群公钥里的,可以代表集体。
打开:群处理员可以通过群签名得到消息是哪个群成员进行签名的。
第一步,系统建立 Setup
第二步,加入 Enroll(GIM, Ui)
第三步,签名 Sign(gpk,uski,m)
第四步,验证 Verify(gpk,RL,m,s)
第五步,追踪 Open(gtk,Y,m,s)
第六步,撤销 Revoke(grk,Ui)
群签名经典算法
基于PKI的群签名算法——LC98群签名
1. Setup():
群管理者执行:
- 选择两个大素数p和q,且q|p-1(q能被p-1整除)
- 选择GF(p)中阶为q的生成元g
- 随机选择xT∈[1,q-1]为群的主私钥
- 计算yT =
mod p
- 群管理者公钥为 Y = (p,q,g,yT)
2. Enroll():
5. Open():
由于群管理者保存了用户Ui的身份,证书(ri, si),参数(yi, ki),则可以根据证书判断签名的群成员身份。
基于身份的群签名算法——CZK03算法
Gap Diffie-Hellman群
令G1是由生成元p产生的循环加法群,它的阶为素数q,假设G1中求逆和乘法是有效的,我们将以下问题引入G1
DLP:已知两个元素P和Q,找到一个整数n∈,使得等式Q = nP成立。
CDHP:已知P,aP,bP,其中a,b∈,计算abP
DDHP:已知P,aP,bP,cP,其中a,b,c∈,判断等式c ≡ ab mod p是否成立
如果DDHP可以在多项式时间内解出,但没有多项式时间算法可以在不可忽略的概率下解出CDHP或DLP,则我们称G1为Gap Diffie-Hellman群。
CZK03算法流程
群签名在区块链的应用
近年来,匿名数字货币发展迅猛:门罗币(Monero)、ZCash、Blindcoin,……,它们在数字货币交易中保护了用户的隐私。然而,由于它们的匿名性,可能会导致一些新的威胁,更糟糕的是,在匿名的掩护下很难追踪犯罪。
一种在匿名数字货币中跟踪付款人的高效可连接群签名
- 使用可连接群签名来实现支付者的真实身份跟踪。这种方法能够同时保障匿名数字货币交易中的匿名性和可靠性。
- 该方案利用线性加密来帮助群管理器跟踪群成员的身份,并通过生成VR-SDH三元组的零知识证明(ZKPK)来生成群签名。如果一个群成员对同一个消息签名两次,那么两个签名就可以公开链接,这可以用于匿名数字货币的双花检测。
在公共资源的管理,重要军事情报的签发,重要领导人的选举,电子商务重要新闻的发布,金融合同的签署等事务中,群签名都可以发挥重要作用。
比如群签名在电子现金系统中可以有下面的应用:
可以利用群盲签名来构造有多个银行参与与发行电子货币的、匿名的、不可跟踪的电子现金系统。在这样的方案中有许多银行参与这个电子现金系统,每个银行都可以安全地发行电子货币。这些银行形成一个群体受中央银行的控制,中央银行担当了群管理员的角色。
群签名研究方向
- 如何安全有效地废除群成员:即如何设计一个废除群成员的方法,使得一个群成员被删除后,原来的私钥和成员证书不能再用于签名,而且不影响他原来所做的签名的安全性。现有的群签名方案都不能安全有效地废除群成员。
- 如何设计高效的打开签名的算法:即如何使群管理员不需要大的计算就可以打开签名而确定出签名人的身份。
- 寻找一些安全高效的新的群签名算法:现有的相对安全高效的群签名方案,基本上都依赖于RSA签名体制、双重离散对数、离散对数的方根、效率都不是很理想。因此,寻求新的安全高效的群签名算法是很有必要的。
- 如何在电子商务等领域广泛地使用群签名:在现有的文献中,关于群签名在电子商务领域的应用还不多见。由于群签名对签名人能够提供好的匿名性,同时又能使群管理人在必要的时候可以打开签名而撤销匿名性,所以可以广泛地应用于电子商务中的许多方面。只要找到高效使用的群签名算法,群签名在电子商务中的应用必会走向实用。
- 对于群签名相关的数字签名及其应用的研究:与群签名相关的数字签名及其应用的研究还不够。分级群签名、群盲签名、多群签名等都有实际应用背景,然而对它们的研究才处于起步阶段。
5-6 环签名
环签名概述
环签名定义
问题提出
Bob是某公司职员,他想向公司法务部门检举上司的违规行为,他要使公司法务部门确信此消息来自本公司职员,同时又不想泄露自己的身份(保证匿名性),以免遭到上司报复。
- Bob不能通过用一般的数字签名把消息传给公司法务部门,因为虽然公司法务部门会相信这个消息来自公司职员,但同时会暴露Bob的身份;
- Bob也不能通过一般的匿名方式把消息传给公司法务部门,因为虽然Bob的身份不会暴露,但公司法务部门不能确信消息来自本公司职员,没有理由相信消息是真实的。
- 群签名也不能解决这个问题,因为群签名的生成需要群成员的合作,群管理者可以打开签名。如果群管理者受到上司的控制,Bob的身份就会暴露。
环签名可以很好地解决以上问题,所有的公司职员构成一个环,Bob把消息经过环签名后传给公司法务部门,在不暴露Bob身份的前提下法务部门可以通过验证环签名的正确性,确信签名来自公司内部员工。
环签名概念
环签名是2001年Rivest,Shamir和Tauman三人提出的签名者模糊的数字签名。并提出一种新型的基于RSA的环签名算法,通常被视为第一个环签名算法。在环签名生成过程中,真正的签名者任意选择一组成员(包含它自身)作为可能的签名者,用自己的私钥和其他成员的公钥对文件进行签名。签名者选取的这组成员称作环(Ring),生成的签名称作环签名(Ring Signature)。环签名主要包括以下三个算法:
密钥生成算法:输入安全参数k,为每一个用户生成公私钥对(
,
),1 ≤ i ≤ n;
签名生成算法:输入消息m,一组公钥 L ={,
, ...,
}及签名者的私钥
,输出对m的签名R;
签名验证算法:输入(m, R),输出“True”或“False”。
环签名发展
环签名流程
环签名特性
完全匿名性
攻击者即便非法获取了所有环成员的私钥,他能确定出真正签名者的概率不会超过1/r,r是环中成员(可能是签名者)的个数。
- 准确获取签名者私钥
完成:获取所有环成员私钥
验证:所有私钥以确认用户身份
- 网络监听猜测签名者身份
攻克:通信内网的主机防护
监听:所有成员通信过程
猜测:统计分析猜测成员身份
不可伪造性
环中其他成员不能伪造真实签名者的签名,攻击者即使在获得某个有效环签名的基础上也不能以不可忽略的优势成功伪造一个新消息的合法签名。
- 攻破公钥密码体制
截获:伪造目标成员发送的带有环签名的消息
推断:签发者的私钥(离散对数,大整数分解等数学难题)
- 窃取签名者私钥
克服:成员主机的安全防护
或者
等待:成员泄露私钥
或者
猜测:弱密钥
环签名算法
RST签名算法
概述
诞生:2001年由Rivest,Shamir和Tauman三人提出
地位:第一个环签名算法
基础理论:
单向陷门函数
RSA签名算法
密钥组合函数
流程
(1) 密钥对生成
生成陷门函数,公布函数并保存陷门信息。(即
*
= 1 mod φ(
))
(2) 环签名生成
给定待签名消息m,签名者π,密钥和所有环成员公钥
,
,…,
,签名者通过以下步骤生成环签名:
- 选取密钥k:计算 k = h(m) 或 k = h(m,
,
,…,
)
- 选取随机粘合值:随机选择初始(粘合)值 v ∈
;
- 选取随机值
:为所有其他环成员选择
∈
(1 ≤ i ≤ r, i G π),并计算
=
mod
- 求解
:根据
(1 ≤ i ≤ r, i G π),求满足如下等式的
(
,
,…,
) = v
组合函数的性质2保证了方程可解;
5. 对陷门函数求逆:根据和陷门信息(私钥)求逆
=
(
)即
=
mod
6. 输出环签名:对m的环签名为一个(2r+1)元组
(,
,…,
;v;
,
,…,
)
(3)环签名验证
根据消息的m的签名(,
,…,
;v;
,
,…,
),验证者通过以下方式验证环签名:
- 应用陷门函数:对i = 1,2,...,r计算
=
(
)
- 获取密钥k:计算加密密钥k = h(m)或k = h(m,
,
,…,
)
- 验证环等式:验证
是否满足
(
,
,…,
) = v
若等式成立,环签名为有效签名,否则为无效签名。
AOS环签名算法
概述
诞生:2002年Abe等给出了一种把任意数字签名转换为环签名的方法,并给出了基于Schnorr签名的设计方案
地位:通用环签名构造算法
基础理论:Schnorr签名算法
流程
设第i个用户的私钥为,公钥为
=
mod p,签名者π的密钥对为(
,
),随机生成公钥集 L = {
,
,
}(0 ≤ π ≤ r-1),并执行以下过程产生签名:
(1)签名生成
- 选择随机数
∈
并计算
= H(L,M,
mod p);
- 选择随机数
∈
并计算
= H(L,M,
mod p),这里i = π+1,...,r-1,0,1,...,π-1
- 计算
- 输出环签名(
,
,
,...,
)
(2)签名验证
- 计算
=
mod p和
= H(L,M,
),这里i= 0,1,...,r-1
- 验证
= H(L,M,
)是否成立,如果成立则输出“Accept”,否则输出“Reject”
= H(L,M,
mod p)= H(L,M,
mod p)
ZK环签名算法
概述
诞生:2002年ZHANG等给出了一种基于身份签名算法的环签名构建方法
地位:基于身份的环签名构造算法
基础理论:基于身份的签名算法
流程
设第i个用户的身份为,私钥为
。签名者π随机生成身份集L={
,
,...,
}(0 ≤ π ≤ r-1),并执行以下过程产生签名:
(1)环签名生成
- 随机选择A∈G,计算
= H(L||m||e(
,P));
- 随机选取
∈G,计算
= H(L||m||e(
,P)e(
(
),
)),这里i = π+1,...,r-1,0,1,...,π-1
- 计算
= A -
;
- 签名者输出环签名(
,
,
,...,
)
(2)环签名验证
给定,
,
,...,
,m和L,i = (0,1,2,...,r-1,r) 依次计算
= H(L||m||e(
,P)e(
(
),
)),若
=
验证通过,否则验证失败
= H(L||m||e(
,P)e(
(
),
)) = H(L||m||e(A,P))
环签名应用
CryptoNote
协议概述
诞生:2013年,Saberhagen等人基于环签名技术提出了CryptoNote协议
作用:保护区块链中交易节点隐私
技术基础:环签名
特性:
不可追踪性(对每个交易输入,所有可能的交易发起者都是可能的)
不可链接性(对任意两个交易输出,不能证明他们是否发送给了同一用户)
匿名性(匿名交易)
设计:
接收者每次都生成新地址并从私密通道传递给发送者
一次性公私钥对的方式
协议流程
交易发起者
生成随机数与接收者公钥计算一次性公钥,作为交易的目标地址,并在交易中公布随机数对应的交易公钥。
交易接收者
用私钥与交易公钥计算一次性公钥判断是否为交易目标地址:如果匹配,则能用私钥对该输出资产进行签名并花费。
数字货币
ByteCoin
一种不可追溯的、去中心化加密货币,自2012年以来一直开展私密、即时交易
技术:CryptoNote协议
算法:CryptoNight
特征:
区块处理速度(2分钟)
无法追踪支付
PoW机制-使用者表决系统
CPU/GPU挖矿
BoolBerry
诞生:2014年5月17发布的一种完全安全且匿名的加密货币
定位:基于环签名的新型密码虚拟货币
特征:
使用前缀交易识别
采用Wild Keccak算法
分离的钱包
一次性交易
区块链使用POW模式
DigitalNote
定位:一种基于CryptoNote匿名技术的完全安全且匿名的加密货币
特征:
基于环签名的匿名事务
基于不可追踪的加密信息传递
抵制ASIC的POW挖矿算法
开源QT钱包,全节点
核心使用多重签名技术
块存储使用多重签名技术
使用基于CPU的POW挖矿完成XDN分发
Monero
诞生:于2014年一个衍生自比特币基于CryptoNote协议的开源加密货币
特征:
基于环签名的交易过程
基于不可追踪的加密信息传递子地址
隐蔽一次性公钥地址
5-7 分布式密钥
分布式密钥概念
密码学中,通常由一个可信的权威系统构建公私钥对,以标识用户身份、确保资产所有权、校验用户操作权限、加解密及读取数据
——非对称密码技术
然而,这种系统存在单点故障和密钥托管的问题。
分布式密钥
- 分布式密钥产生不依赖任何可信的第三方
- 通过分布式节点控制各种资产的私钥
- 可以实现对分布式系统的原生支持
分布式密钥加解密
分布式密钥产生
分布式密钥产生(distributed key generation,简称DKG)
通过多方参与,计算共享的公钥与私钥集,分布式密钥产生不依赖任何可信的第三方。
在(t,n)-DKG中,n为节点数量,t为阈值,DKG协议允许n个节点共同产生密钥,使得任何数量大于阈值t的节点子集都能使用该共享密钥,然而任何数量少于阈值t的节点子集都没有对该共享密钥的任何知识。
实现要点
Pedersen提出了第一个信息论安全的非交互式可验证秘密分享方案,简称Pedersen-VSS,也提出了具有同态性质的安全的承诺方案。基于这两个方案,Pedersen引入了分布式密钥产生(DKG)的概念。
可验证秘密共享
可验证秘密共享(verifiable secret sharing,简称VSS)是DKG的基本构造块。
回顾:什么是秘密共享?
秘密共享是信息安全和数据保密中的重要手段,最早由Shamir和Blakley提出的。
秘密共享由两个算法——秘密份额分配算法和秘密的恢复算法构成。
在执行秘密份额分配算法时,分发者将秘密分割成若干份额在一组参与者中进行分配,使得每个参与者都得到关于该秘密的一个秘密份额;
秘密的恢复算法保证只有参与者的一些特定的子集才能有效地恢复秘密,其他子集不能有效地恢复秘密,甚至得不到关于秘密的任何有用信息。
可验证秘密共享实现
最直接的秘密字符串分片方式——无法保障安全性
利用拉格朗日多项式插值法的秘密构造方式
核心思想
t个点可以确定一个t-1阶多项式对应的曲线。
方法
每一个秘密分片都相当于多项式曲线上的一个点:
- 只要收集不同点的数目达到t个,就可以通过拉格朗日多项式插值算法求解出多项式中代表秘密的系数值。
- 如果点的数目不足t个,对应的多项式有无限多个,对应的秘密可能是任意值,对秘密的机密性保护达到了信息论安全。
Shamir秘密共享
(t,n)门限秘密共享机制
将秘密分为n份,任意t份都可以完整地恢复出拆分前的秘密。
构造过程如下:
- 将秘密S作为多项式的第0阶常量系数,其余t-1个系数随机生成,由此构造出一个t-1阶的多项式,对应的曲线为C。
- 在曲线C上随机选n个不同的点,将其分发给n个参与者。
- 只要不小于t个参与者同意使用自己的点参与协同运算,便可恢复出曲线C对应的多项式,取其中第0阶常量系数,便可获得秘密S。
算法流程
当有k个不同的点,...,
时,任意两个
均不相同,可唯一确定k-1阶的多项式q(x),使得对任意的i,均满足q(
) =
。
将其推广到(k,n)阈值机制可为:
将数据D表示为number数字,切分为数据段,取任意的k-1阶多项式
,其中
,对n段信息计算,有:
所以,对于任意k个数据段子集,可通过多项式插值的方式计算多项式q(x)的系数,然后可计算出完整的D值,D = 。若仅知道k-1个数据段,则无法计算相应的D值。
可验证秘密共享
提出
为了检验共享的正确性,出现了可验证的秘密共享方案。
Benny Chor等人1985年论文《Verifiable secretsharing and achieving simultaneity inthepresence of faults》首次提出了Verifiable Secret Sharing可验证的秘密共享的概念。
在一些秘密共享应用中,客户端需要验证持续的交易(deal)来避免交易方(dealer)的恶意行为。一种拥有这种可验证性保证的模式被称之为可验证秘密共享(verifiable secret sharing, VSS)。
典型的可验证秘密共享实现
Feldman-VSS
Feldman于1987年首先提出了第一个不需要可信机构的非交互式(t,n)门限VSS协议(以后简称为Feldman-VSS)。该协议能够抵抗包括分发者在内的(n-1)/2个恶意参与者的合谋攻击。
系统参数:
p是大素数,q是p-1的大素数因子;g是中的一个q阶元素;k是门限值,n是分享者的人数。
具体协议如下:
1)共享分发:
分发者D随机选择一个k-1阶多项式为要分享的秘密。
作为共享,秘密地发送给
,计算并广播
。
2)共享验证:
每一参与者检验是否
。
如果等式不成立,那么所收到的共享
是无效的。
3)秘密恢复:
当k个或多于k个参与者合作恢复秘密时,每一参与者向其他合作者广播自己的共享
。当所有合作者的共享都被验证为有效时,合作者可根据拉格朗日多项式插值法计算出秘密s。
Pedersen-VSS
Pedersen给出了一个具有同态性质的安全的承诺方案,并基于拉格朗日多项式插值法,提出了第一个信息论安全(无条件安全)的非交互式可验证秘密共享方案(以后简称为Pedersen-VSS)。该方案的信息速率为1/2,与Feldman-VSS一样具有较高的效率。
Pedersen-VSS在安全性方面具有以下性质:
- 如果分发者在协议中始终是诚实的,那么所有诚实的参与者持有的份额能够以拉格朗日多项式插值法确定出唯一的一个t-1次多项式。
- 方案中提供了在秘密恢复阶段用于检验每一份额的正确性的信息,因此在即使有恶意参与者存在的情况下,份额集合的任何包含t个正确份额的子集都可用来正确地恢复出秘密。
- 至多能与t-1个分享者合谋的攻击者,在协议中所得到的信息是独立于被分享的秘密的,因此所分享的秘密是信息论安全的。
同态承诺
同态承诺是一种允许一个人向其他人提交任何选定数值而又不泄露该值的密码协议,承诺提交后不能更改,且事后可公开验证。同态承诺允许在提交的承诺上进行计算而不失去承诺的保密、不可更改及事后可验证的特征。
分布式密钥产生机制
两个阶段
一个(t,n)— DKG模式包含两个阶段:共享阶段(sharing phase)和重建阶段(reconstruction phase)
共享阶段
每个节点将一个秘密
分发到n个节点,其中K为足够大的加法循环群。在共享阶段结束之后,每个诚实节点
持有分布式秘密s中的一个共享
,
是由线性组合计算出来的。
重建阶段
每个节点广播它的共享秘密
',一个重建函数用于计算秘密s = (
',
',...,
')或者判断出
是恶意的节点。对于诚实的节点
’=
,而对恶意节点
‘可能不同于
甚至没有
’。
分布式密钥场景使用
DKG在区块链中的应用
区块链作为分布式系统,区块链中的节点通过DKG分布式地产生密钥,克服单点故障以及单个节点不可信任问题。
例如AnnChain OG共识算法中,DKG与门限签名算法(BLS)结合,DKG的秘钥作为门限签名秘钥,保证任意2/3的共识节点对一笔消息进行门限签名,都能够恢复出公钥并进行验证,具有拜占庭容错性。
分布式私钥控制在区块链中的应用
采用分布式节点来控制区块链系统中各种资产的私钥,将数字资产的使用权和所有权进行分离,使得链上资产的控制权能够安全地转移到非中心化系统中,同时将原链上的资产映射到跨链中,实现不同区块链系统间的资产流通和价值转移。
基于TEE的分布式密钥协商及其在区块链中的应用
基于TEE的分布式密钥协商协议
该协议可保证在去中心化系统中公平可信产生密钥并全网共享、共识,并通过安全计算硬件保证密钥生成、派生、轮转、密钥存储等协议在整个密钥管理生命周期的密钥安全。
在蚂蚁链中的应用
蚂蚁链分布式密钥管理DKMS是以区块链技术为特点,实现了安全、灵活的分布式密钥协商协议即管理机制,依托可信执行环境为安全底座,可满足隐私保护、隐私计算、业务系统等场景下链上/链下密钥全生命周期管理。
蚂蚁链隐私保护合约链采用分布式密钥协商功能,无需依赖外部KMS。
以下是蚂蚁链普通合约链和通用隐私保护合约链的交易处理流程对比
5-8 TEE隐私保护技术
TEE隐私保护技术定义
可信计算
早期可信计算研究主要以TCG(国际可信计算工作组)组织为主,国内处于跟随阶段。
可信计算的发展
TEE隐私保护技术定义
TEE(trusted execution environment)可信执行环境是基于硬件安全实现内存隔离的安全计算技术,可以在保证数据计算效率的前提下实现隐私保护,是隐私计算的主流技术路线之一
基本思想
在硬件中为敏感数据单独分配一块隔离的内存,所有敏感数据的计算都在分配的内存中完成,除授权的接口外,硬件中的其他部分无法访问获取隔离内存中的信息。
区块链隐私保护的要求
复杂的应用场景通常要求区块链隐私保护至少具备以下四方面的能力
区块链的隐私保护体现在对全生命周期的保护上,需要保护交易本身、合约代码、全局状态数据以及交易回执。
TEE相关保护机制
(1)合约保护
TEE环境从技术上实现了隐私性能的大幅提升
网络中物理节点之间的信任无需建立在节点拥有者本身的相互信任上
能够在保证区块链状态保密的情况下,处理用户的请求
TEE合约链中的合约有两类:
明文合约 | 隐私合约 |
---|---|
通过明文交易部署的合约,合约执行过程中的全局状态明文存储于区块链节点本地数据库,调用接口完全开放 | 通过隐私交易发起部署,在TEE中执行,所有的全局状态加密存储,调用接口有限放开。 字节码和相应的状态数据加密存储,仅在TEE内部解密可见;相应的回执和状态加密存储在外部数据库。 |
在进行交易时,禁止隐私交易和明文交易进行相互调用
(2)交易数据隐私保护
TEE合约链中的合约有两类:
明文交易 | 隐私交易 |
---|---|
公开且未进行隐私保护的区块链交易过程。 交易内容以明文形式发送至区块链节点运行并明文记录 | 启用了隐私保护的交易,其执行过程中产生的全局状态数据以及交易回执均采用密码学技术进行加密保护 交易内容只有在TEE内才安全可见 |
隐私交易默认对发送者以外的人不可见
TEE合约链支持加密交易发送,保护交易全生命周期的隐私性:
- 交易加密,通过信道保护发送给节点,到达节点后交由TEE保护
- 隐私交易进入TEE后解密,完成必要的检查后开始执行
- 执行完成后所有合约状态加密存储。生成加密回执
- 交易发送者通过客户端SDK提供的接口完成回执解密
(3)远程认证
远程认证(Remote Attestation)是可信执行环境机密计算中的关键技术之一,是一种远程审计设备可信状态的手段。流程为:
远程认证通过与公私钥加密结合可以保证发出的信息只被发出证明要求的程序读取,而不给窃听者。
(4)隐私数据存证
融合了TEE的区块链平台提供原生存证数据的加密数据存储上链,为存证类业务提供灵活的数据隐私链上流转,通过不同隐私存证合约设置不同的信封密钥保证合约层存证数据上链的隔离,并结合隐私合约的授权整体实现隐私数据存证的链上数据流转及授权
特性
- 支持使用隐私交易发送原生存证交易数据
- 加密原生存证数据可定义为合约级
- 支持隐私合约级创建生成公私钥对以及导出公钥能力
(5)隐私交易授权管理
通用隐私保护合约链支持用户自定义隐私权限控制:
合约编写者可根据需求指明合约调用、查询等权限,保证合约数据隐私自主可控
权限控制模型支持合约层面的灵活定制和无缝升级
典型应用场景
双链通供应链金融服务平台
eWTP
Electronic World Trade Platform(eWTP)是全球电子贸易平台,为中小企业提供全球贸易的基础平台。
利用通用隐私保护合约链的隐私存证数据流转特性,在保持高性能的同时借助合约授权能力,使得监管方能够进行全流程监管
相关文章:
【05】密码学与隐私保护
5-1 零知识证明 零知识证明介绍 零知识证明的概念 设P(Prover)表示掌握某些信息,并希望证实这一事实的实体,V(Verifier)是验证这一事实的实体。 零知识证明是指P试图使V相信某一个论断是正确的,但却不向…...
Flink SQL与Doris实时数仓Join实战教程(理论+实例保姆级教程)
目录 第一章:Regular Joins 深度解析 1.1 核心原理与适用场景 1.2 电商订单 - 商品实时关联案例 1.2.1 数据流设计 1.2.2 Doris 表设计优化 1.2.3 性能调优要点 第二章:Interval Joins 实战应用 2.1 时间区间关联原理 2.2 优惠券使用有效性验证 2.2.1 业务场景说明 …...
DeepSeek 助力 Vue 开发:打造丝滑的范围选择器(Range Picker)
前言:哈喽,大家好,今天给大家分享一篇文章!并提供具体代码帮助大家深入理解,彻底掌握!创作不易,如果能帮助到大家或者给大家一些灵感和启发,欢迎收藏关注哦 💕 目录 Deep…...
68页PDF | 数据安全总体解决方案:从数据管理方法论到落地实践的全方位指南(附下载)
一、前言 这份报告旨在应对数字化转型过程中数据安全面临的挑战,并提供全面的管理与技术体系建设框架。报告首先分析了数字化社会的发展背景,强调了数据安全在国家安全层面的重要性,并指出数据安全风险的来源和防护措施。接着,报…...
【Github每日推荐】-- 2024 年项目汇总
1、AI 技术 项目简述OmniParser一款基于纯视觉的 GUI 智能体,能够准确识别界面上可交互图标以及理解截图中各元素语义,实现自动化界面交互场景,如自动化测试、自动化操作等。ChatTTS一款专门为对话场景设计的语音生成模型,主要用…...
【Spring详解一】Spring整体架构和环境搭建
一、Spring整体架构和环境搭建 1.1 Spring的整体架构 Spring框架是一个分层架构,包含一系列功能要素,被分为大约20个模块 Spring核心容器:包含Core、Bean、Context、Expression Language模块 Core :其他组件的基本核心ÿ…...
Spring Boot(8)深入理解 @Autowired 注解:使用场景与实战示例
搞个引言 在 Spring 框架的开发中,依赖注入(Dependency Injection,简称 DI)是它的一个核心特性,它能够让代码更加模块化、可测试,并且易于维护。而 Autowired 注解作为 Spring 实现依赖注入的关键工具&…...
Machine Learning:Optimization
文章目录 局部最小值与鞍点 (Local Minimum & Saddle Point)临界点及其种类判断临界值种类 批量与动量(Batch & Momentum)批量大小对梯度下降的影响动量法 自适应学习率AdaGradRMSPropAdam 学习率调度优化总结 局部最小值与鞍点 (Local Minimum & Saddle Point) 我…...
wordpress get_footer();与wp_footer();的区别的关系
在WordPress中,get_footer() 和 wp_footer() 是两个不同的函数,它们在主题开发中扮演着不同的角色,但都与页面的“页脚”部分有关。以下是它们的区别和关系: 1. get_footer() get_footer() 是一个用于加载页脚模板的函数。它的主…...
Windows Docker运行Implicit-SVSDF-Planner
Windows Docker运行GitHub - ZJU-FAST-Lab/Implicit-SVSDF-Planner: [SIGGRAPH 2024 & TOG] 1. 设置环境 我将项目git clone在D:/Github目录中。 下载ubuntu20.04 noetic镜像 docker pull osrf/ros:noetic-desktop-full-focal 启动容器,挂载主机的D:/Github文…...
设计模式14:职责链模式
系列总链接:《大话设计模式》学习记录_net 大话设计-CSDN博客 1.概述 职责链模式(Chain of Responsibility Pattern)是一种行为设计模式,它允许将请求沿着处理者链传递,直到有一个处理者能够处理该请求。这种模式通过…...
Golang GORM系列:GORM并发与连接池
GORM 是一个流行的 Go 语言 ORM(对象关系映射)库,用于简化数据库操作。它支持连接池和并发访问功能,这些功能对于高性能、高并发的应用场景非常重要。本文结合示例详细介绍gorm的并发处理能力,以及如何是哟个连接池提升…...
linux笔记:shell中的while、if、for语句
在Udig软件的启动脚本中使用了while循环、if语句、for循环,其他内容基本都是变量的定义,所以尝试弄懂脚本中这三部分内容,了解脚本执行过程。 (1)while循环 while do循环内容如下所示,在循环中还用了expr…...
【Java】逻辑运算符详解:、|| 与、 | 的区别及应用
博客主页: [小ᶻ☡꙳ᵃⁱᵍᶜ꙳] 本文专栏: Java 文章目录 💯前言💯一、基本概念与运算符介绍💯二、短路与与非短路与:&& 与 & 的区别1. &&:短路与(AND)2. …...
Java 设计模式之解释器模式
文章目录 Java 设计模式之解释器模式概述UML代码实现 Java 设计模式之解释器模式 概述 解释器模式(interpreter):给定一个语言,定义它的文法的一种表示,并定义一个解释器,这个解释器使用该表示来解释语言中的句子。如果一种特定…...
关于前后端分离跨域问题——使用DeepSeek分析查错
我前端使用ant design vue pro框架,后端使用kratos框架开发。因为之前也解决过跨域问题,正常是在后端的http请求中加入中间件,设置跨域需要通过的字段即可,代码如下所示: func NewHTTPServer(c *conf.Server, s *conf…...
Linux下ioctl的应用
文章目录 1、ioctl简介2、示例程序编写2.1、应用程序编写2.2、驱动程序编写 3、ioctl命令的构成4、测试 1、ioctl简介 ioctl(input/output control)是Linux中的一个系统调用,主要用于设备驱动程序与用户空间应用程序之间进行设备特定的输入/…...
Windows 环境下 Grafana 安装指南
目录 下载 Grafana 安装 Grafana 方法 1:使用 .msi 安装程序(推荐) 方法 2:使用 .zip 压缩包 启动 Grafana 访问 Grafana 配置 Grafana(可选) 卸载 Grafana(如果需要) 下载 G…...
【操作系统】操作系统概述
操作系统概述 1.1 操作系统的概念1.1.1 操作系统定义——什么是OS?1.1.2 操作系统作用——OS有什么用?1.1.3 操作系统地位——计算机系统中,OS处于什么地位?1.1.4 为什么学操作系统? 1.2 操作系统的历史1.2.1 操作系统…...
基于SSM+uniapp的鲜花销售小程序+LW示例参考
1.项目介绍 系统角色:管理员、商户功能模块:用户管理、商户管理、鲜花分类管理、鲜花管理、订单管理、收藏管理、购物车、充值、下单等技术选型:SSM,Vue(后端管理web),uniapp等测试环境&#x…...
第3章 .NETCore核心基础组件:3.1 .NET Core依赖注入
3.1.1 什么是控制反转、依赖注入 杨老师在书中进行了一系列的文字阐述,总结一下就是:软件设计模式中有一种叫做【控制反转】的设计模式,而依赖注入是实现这种设计模式的一个很重要的方式。也就是说学习依赖注入,是学习怎样实现控…...
排序与算法:插入排序
执行效果 插入排序的执行效果是这样的: 呃……看不懂吗?没关系,接着往下看介绍 算法介绍 插入排序(Insertion Sort)是一种简单直观的排序算法。它的工作原理是通过构建有序序列,对于未排序数据,…...
uniapp 打包安卓 集成高德地图
接入高德地图 let vm this;uni.chooseLocation({success: function (res) {// console.log(位置名称: res.name);// console.log(详细地址: res.address);// console.log(纬度: res.latitude);// console.log(经度: res.long…...
python爬虫系列课程2:如何下载Xpath Helper
python爬虫系列课程2:如何下载Xpath Helper 一、访问极简插件官网二、点击搜索按钮三、输入xpath并点击搜索四、点击推荐下载五、将下载下来的文件解压缩六、打开扩展程序界面七、将xpath.crx文件拖入扩展程序界面一、访问极简插件官网 极简插件官网地址:https://chrome.zzz…...
win10系统上的虚拟机安装麒麟V10系统提示找不到操作系统
目录预览 一、问题描述二、原因分析三、解决方案四、参考链接 一、问题描述 win10系统上的虚拟机安装麒麟V10系统提示找不到操作系统,报错:Operating System not found 二、原因分析 国产系统,需要注意的点: 需要看你的系统类…...
基于微信小程序的宿舍报修管理系统设计与实现,SpringBoot(15500字)+Vue+毕业论文+指导搭建视频
运行环境 jdkmysqlIntelliJ IDEAmaven3微信开发者工具 项目技术SpringBoothtmlcssjsjqueryvue2uni-app 宿舍报修小程序是一个集中管理宿舍维修请求的在线平台,为学生、维修人员和管理员提供了一个便捷、高效的交互界面。以下是关于这些功能的简单介绍: …...
分布式同步锁:原理、实现与应用
分布式同步锁:原理、实现与应用 引言1. 分布式同步锁的基本概念1.1 什么是分布式同步锁?1.2 分布式锁的特性 2. 分布式锁的实现方式2.1 基于数据库的分布式锁实现原理优缺点示例 2.2 基于 Redis 的分布式锁实现原理优缺点示例Redlock 算法 2.3 基于 ZooK…...
Chrome多开终极形态解锁!「窗口管理工具+IP隔离插件
Web3项目多开,继ads指纹浏览器钱包被盗后,更多人采用原生chrome浏览器,当然对于新手,指纹浏览器每月成本也是一笔不小开支,今天逛Github发现了这样一个解决方案,作者开发了窗口管理工具IP隔离插件ÿ…...
FreeSwitch的应用类模块
FreeSWITCH 应用类模块(Applications)完整表格 模块名称功能描述mod_callcenter提供呼叫中心功能,支持队列、座席管理、监控等。mod_conference提供多方会议功能,支持音频、视频会议。mod_blacklist提供黑名单功能,阻…...
【蓝桥杯集训·每日一题2025】 AcWing 6123. 哞叫时间 python
6123. 哞叫时间 Week 1 2月18日 农夫约翰正在试图向埃尔茜描述他最喜欢的 USACO 竞赛,但她很难理解为什么他这么喜欢它。 他说「竞赛中我最喜欢的部分是贝茜说 『现在是哞哞时间』并在整个竞赛中一直哞哞叫」。 埃尔茜仍然不理解,所以农夫约翰将竞赛以…...
Unity 淡入淡出
淡入(Fade in):类似打开幕布 淡出(Fade out):类似关上幕布 方案一 使用Dotween(推荐) using DG.Tweening; using UnityEngine; using UnityEngine.UI;public class Test : MonoB…...
PBR光照模型相关知识
PBR是基于物理的光照模型,与lambert光照模型以及Blinn-Phong光照模型有所不同 一、三种光照模型的区别 原理基础 Lambert 光照模型:基于朗伯余弦定律,该定律表明,漫反射光的强度与入射光的方向和物体表面法线的夹角的余弦值成正比…...
【Go | 从0实现简单分布式缓存】-2:HTTP服务端与一致性哈希
本文目录 一、回顾1.1 复习接口 二、http标准库三、实现HTTP服务端四、一致性哈希 本文为极客兔兔“动手写分布式缓存GeeCache”学习笔记。 一、回顾 昨天已经开发了一部分项目,我们先来看看项目结构。 分布式缓存需要实现节点间通信,建立基于 HTTP 的…...
STM32 低功耗模式
目录 背景 低功耗模式 睡眠模式 进入睡眠模式 退出睡眠模式 停止模式 进入停止模式 退出停止模式 待机模式 进入待机模式 退出待机模式 程序 睡眠模式 休眠模式配置 进入休眠模式 退出睡眠模式 停止模式 停止模式配置 进入停止模式 退出停止模式 待机模式…...
AI 百炼成神:逻辑回归, 垃圾邮件分类
第二个项目:逻辑回归垃圾邮件分类 项目代码下载地址:https://download.csdn.net/download/m0_56366541/90398247 项目目标 学习逻辑回归的基本概念。使用逻辑回归算法来实现垃圾邮件的分类。理解如何处理文本数据以及如何评估分类模型的性能。项目步骤 准备数据集 我们将使…...
#渗透测试#批量漏洞挖掘#Apache Log4j反序列化命令执行漏洞
免责声明 本教程仅为合法的教学目的而准备,严禁用于任何形式的违法犯罪活动及其他商业行为,在使用本教程前,您应确保该行为符合当地的法律法规,继续阅读即表示您需自行承担所有操作的后果,如有异议,请立即停止本文章读。 目录 Apache Log4j反序列化命令执行漏洞 一、…...
Docker__持续更新......
Docker 1. 基本知识1.1 为什么有Docker?1.2 Docker架构与容器化 画图解释 画图解释2. 项目实战 1. 基本知识 1.1 为什么有Docker? 用一行命令跨平台安装项目,在不同平台上运行项目。把项目打包分享运行应用。 1.2 Docker架构与容器化 准备机器,在机…...
什么是语料清洗、预训练、指令微调、强化学习、内容安全; 什么是megatron,deepspeed,vllm推理加速框架
什么是语料清洗、预训练、指令微调、强化学习、内容安全 目录 什么是语料清洗、预训练、指令微调、强化学习、内容安全语料清洗预训练指令微调强化学习内容安全什么是megatron,deepspeed,vllm推理加速框架语料清洗 语料清洗是对原始文本数据进行处理的过程,旨在去除数据中的…...
Ubuntu虚拟机NDK编译ffmpeg
目录 一、ffmpeg源码下载1、安装git(用于下载ffmpeg源码)2、创建源码目录,下载ffmpeg源码 二、下载ubuntu对应的NDK,并解压到opt下1、下载并解压2、配置 ~/.bashrc 三、源码编译、1、创建编译脚本2、脚本文件内容3、设置可执行权限并运行4、编译的结果在…...
SQLAlchemyError: A transaction is already begun on this Session.
资料 sqlalchemy 事务 - 简书 在 SQLAlchemy 中,事务是通过会话来管理的。当你开始一个事务(例如使用 async with db.begin()),它会开启一个新的事务,并在事务块结束时自动提交或回滚。如果在同一个会话中,…...
STM32 HAL库USART串口DMA IDLE中断编程:避坑指南
HAL_UART_Receive接收最容易丢数据了,STM32 HAL库UART查询方式实例 可以考虑用中断来实现,但是HAL_UART_Receive_IT还不能直接用,容易数据丢失,实际工作中不会这样用,STM32 HAL库USART串口中断编程:演示数据丢失, 需要在此基础优化一下. STM32F103 HAL库USART串口…...
打造一个有点好看的 uniapp 网络测速软件
大家好,我是一名前端小白。今天想和分享一个有点好看的网络测速 uniapp 组件的实现过程。这个组件不仅外观精美,而且具有完整的功能性,是一个非常适合学习和实践的案例。 设计理念 在开始coding之前,先聊聊设计理念。一个好的测…...
DeepSeek AI 视频创作完整指南:从注册到制作
DeepSeek AI 视频创作完整指南:从注册到制作 前言 DeepSeek作为国产AI的新星,不仅在代码能力上表现出色,在创意内容生成方面同样令人惊艳。本教程将带您从注册到实操,完整体验DeepSeek的强大功能。 第一步:获取Deep…...
DeepSeek学术指南:DeepSeek在学术翻译改写能力应用操作案例!
DeepSeek:助力学术研究的智能工具 DeepSeek作为一种先进的智能工具,为学术研究提供了强大的支持。它不仅能够处理复杂的学术文本,还能在翻译和润色方面表现出色,极大地提高了学术写作的效率和质量。通过其强大的语言处理能力&…...
栈回溯基础
指令集区分 thumb指令集 长度:thumb指令通常是 16 位。特点:thumb 指令集是为了压缩指令集长度减少程序占用空间。对齐方式:2字节对齐,存放 thumb 指令的地址一般会被1,设置为奇数,用于表示地址上存放的是…...
JavaScript系列(76)--浏览器API深入
JavaScript浏览器API深入 🌐 浏览器提供了丰富的API,使JavaScript能够与浏览器环境进行交互。本文将深入探讨常用的浏览器API、最佳实践和性能优化技巧。 核心浏览器API 🌟 💡 小知识:浏览器API是连接JavaScript与浏…...
计算机网络(3)TCP格式/连接
1、TCP三大特点:面向连接、可靠、基于字节流 2、如何唯一确定一个TCP连接?TCP四元组:源地址、源端口、目的地址、目的端口 源地址和目标地址的字段(32 位)是在 IP 头部中,作用是通过 IP 协议发送报文给对方主机源端口和目标端口…...
下载安装运行测试开源vision-language-action(VLA)模型OpenVLA
1. 安装 项目官网OpenVLA 首先按照官网提示的以下代码,执行创建环境->安装最小依赖->git克隆项目等 # Create and activate conda environment conda create -n openvla python3.10 -y conda activate openvla# Install PyTorch. Below is a sample comma…...
3D与2D机器视觉机械臂引导的区别
3D与2D机器视觉在机械臂引导中的主要区别如下: 数据维度 2D视觉:仅处理平面图像,提供X、Y坐标信息,无法获取深度(Z轴)数据。 3D视觉:处理三维空间数据,提供X、Y、Z坐标及物体的姿态…...
网站搭建基本流程
需求分析: 实现网站搭建的过程:首先进行网站的需求性分析 网站可分为前台系统和后台系统,由不同的功能拆分为不同的模块 如下是一个电商网站可以拆分出的模块: 在编写代码前,我们要先对网站进行架构,通过…...