惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

S
Security Archives - TechRepublic
MongoDB | Blog
MongoDB | Blog
量子位
博客园 - 叶小钗
罗磊的独立博客
cs.AI updates on arXiv.org
cs.AI updates on arXiv.org
Hacker News: Ask HN
Hacker News: Ask HN
MyScale Blog
MyScale Blog
GbyAI
GbyAI
Help Net Security
Help Net Security
Y
Y Combinator Blog
Engineering at Meta
Engineering at Meta
Hacker News - Newest:
Hacker News - Newest: "LLM"
Latest news
Latest news
H
Hacker News: Front Page
Blog — PlanetScale
Blog — PlanetScale
雷峰网
雷峰网
Microsoft Azure Blog
Microsoft Azure Blog
P
Proofpoint News Feed
C
CXSECURITY Database RSS Feed - CXSecurity.com
Scott Helme
Scott Helme
S
Schneier on Security
博客园 - 司徒正美
Hugging Face - Blog
Hugging Face - Blog
S
Security @ Cisco Blogs
Recorded Future
Recorded Future
S
Securelist
博客园 - Franky
Application and Cybersecurity Blog
Application and Cybersecurity Blog
A
About on SuperTechFans
N
News and Events Feed by Topic
AI
AI
T
Tenable Blog
N
News | PayPal Newsroom
C
Cybersecurity and Infrastructure Security Agency CISA
V
V2EX - 技术
T
Threat Research - Cisco Blogs
Cisco Talos Blog
Cisco Talos Blog
L
LINUX DO - 热门话题
N
Netflix TechBlog - Medium
S
SegmentFault 最新的问题
T
The Blog of Author Tim Ferriss
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
Google Online Security Blog
Google Online Security Blog
S
Security Affairs
Webroot Blog
Webroot Blog
D
Darknet – Hacking Tools, Hacker News & Cyber Security
博客园 - 三生石上(FineUI控件)
C
Comments on: Blog
G
GRAHAM CLULEY

博客园 - 网鱼

Twitter的分布式自增ID雪花算法snowflake (Java版) 雪花算法:生成分布式全局唯一ID Java 8中处理集合的优雅姿势——Stream 消息中间件选型分析——从Kafka与RabbitMQ的对比来看全局 从概念到底层技术,一文看懂区块链架构设计(附知识图谱) 以太坊源码分析——BlockChain 超级账本实践——基于docker从零搭建联盟链 Hyperledger Fabric V1.0– 开发者快速入门 超级账本Fabric教程(一):超级账本入门 区块链技术基础语言(三十二):Go语言网络编程(下) 区块链技术基础语言(三十一):Go语言网络编程(上) 区块链技术基础语言(三十):Go语言常用工具包(下) 区块链技术语言(二十九)—Go语言常用工具包(上) 区块链技术语言(二十八)——Go语言并发编程(下) 区块链技术语言(二十七)——Go语言并发编程(上) 区块链技术语言(二十六)——Go语言异常处理 区块链技术语言(二十五)——面向对象:接口 - 网鱼 区块链技术语言(二十四)——Go语言面向对象:匿名组合 区块链技术语言(二十三)——Go语言面向对象:方法
数据加密共享与签名方案
网鱼 · 2019-03-15 · via 博客园 - 网鱼

最近在研究区块链的时候关注了一下加密技术,小有心得,于是设计了一款数据加密共享与签名的方案,希望能够为做电子合同,数据存证,数据共享的朋友有所帮助吧。

业务场景

一、电子合同

Alice和Bob需要签订一个合同,而Charlie是中介,也需要在看到该合同上并签字,而Dave是外人,不参与这个合同的签订,所以不允许看到合同的内容。

二、数据存证

Alice和Bob在网上玩剪刀石头布的游戏,由于没有第三方的参与,所以Alice必须告诉Bob她已经做出了选择,但是同时又不能告诉Bob她具体出的是什么,Bob同样也是要告诉Alice他已经做出了选择,而又告诉她具体选择是什么。在双方都确认对方做出了选择后,然后各自公布自己的选择,并且可以验证对方公布的结果是不是跟之前告之的一致。

三、数据共享

Alice、Bob和Charlie是同事,他们在使用同一个公司网盘共享文件。现在有一个机密项目只有Alice和Bob在参与,他们希望继续通过公司网盘共享文件,但是同时也不希望Charlie能够看到他们共享的文件中的内容。后来新同事Dave加入到了该机密项目中,又希望Dave能够看到共享的文件内容。

涉及的密码学

1.对称加密

也就是说用明文通过密钥的加密后得到密文,使用同样的密钥就可以把密文解密为明文。常用的对称加密算法是3DES。

2.非对称加密

密钥是有一对(2个,1个叫公钥,1个叫私钥),使用公钥加密的信息,只有对应的私钥才能解密;使用私钥加密的信息,只有对应的公钥才能解密。公钥是可以公开出来的,私钥需要自己保存,不能让其他人知道。目前主要的非对称加密算法有RSA和椭圆曲线加密算法ECC。

3.哈希

哈希算法是一种摘要算法,对于任意长度的输入,都输出相同长度的结果,并且输出结果对输入具有敏感性,也就是说输入只是一个小小的变化,就会引起输出巨大的不同。另外哈希算法还需要扛对撞,也就是说我们不能轻易找到两个不同的输入,使得他们的哈希输出相同。常用的哈希算法有MD5, SHA256 。

4.数字签名

数字签名就是将哈希算法与非对称加密算法结合的一个最好应用。对于一条明文消息M,我们需要对其进行签名,那么首先就是计算该消息的摘要,也就是哈希值,得到H(M),然后再用我们的私钥对这个哈希值进行加密,结果就是数字签名。任何人拿到消息M和数字签名后,都可以用我们的公钥对数字签名进行解密,将解密结果与消息M的哈希值进行对比,如果相同,就说明M没有被更改,同时该签名也是我们签署的,而不可能是别人伪造的签名。

电子合同的签名方案

1.准备

每个用户都有自己的私钥和公钥,私钥由于私密性,所以需要加密保存,用户只有输入自己设置的口令后才能解密出自己的私钥。而用户的公钥则公开在系统上,所有用户都可访问。

2.加密合同

Alice现在准备好合同文件M,由于隐私的考虑,所以需要对合同文件加密,而这里加密采用的是对称加密算法,密钥是随机生成的,加密后的合同文件为密文M。Alice希望合同的乙方Bob还有就是中介Charlie能够看到这个合同(当然Alice本人也需要能看到合同),所以她将这个随机密钥用各自的公钥进行加密,加密后生成了3个密文:密文A、密文B、密文C。现在Alice就可以将加密后的合同密文M以及密文A、密文B、密文C放到网上。

3.签名合同

Alice不需要对明文的合同M进行签名,她需要的是在密文M上进行签名,也就是说先计算出密文M的哈希值“H(密文M)”,然后用自己的私钥A对该哈希值进行加密,这样就能得到签名A。现在Alice把签名A也放在网上,因为Alice的公钥是公开的,所以任何人都可以用公钥A来解密签名A,从而验证密文M的哈希值是否和解密相同。

image

4.解密合同

Bob作为合同的乙方,在收到Alice上传并签名的合同后,他首先需要验证合同的签名A是否正确,如果正确则说明该合同确实是Alice签名的,而且没有被篡改过。但是网上存在的合同是密文M,那么Bob该怎么查看合同内容呢?因为Bob有自己的私钥,他可以解锁出解密文件的随机密钥,用这个密钥再去解密加密文件,就能够看到原始文件了。

image

5.加签合同

接下来Bob需要加签合同,那么他的做法和步骤3签名合同是类似的,只需要用自己的私钥对密文进行签名,然后把签名放到网络上即可。