最近在研究区块链的时候关注了一下加密技术,小有心得,因而设计了一款数据加密共享与签名的方案,但愿可以为作电子合同,数据存证,数据共享的朋友有所帮助吧。算法
Alice和Bob须要签定一个合同,而Charlie是中介,也须要在看到该合同上并签字,而Dave是外人,不参与这个合同的签定,因此不容许看到合同的内容。网络
Alice和Bob在网上玩剪刀石头布的游戏,因为没有第三方的参与,因此Alice必须告诉Bob她已经作出了选择,可是同时又不能告诉Bob她具体出的是什么,Bob一样也是要告诉Alice他已经作出了选择,而又告诉她具体选择是什么。在双方都确认对方作出了选择后,而后各自公布本身的选择,而且能够验证对方公布的结果是否是跟以前告之的一致。区块链
Alice、Bob和Charlie是同事,他们在使用同一个公司网盘共享文件。如今有一个机密项目只有Alice和Bob在参与,他们但愿继续经过公司网盘共享文件,可是同时也不但愿Charlie可以看到他们共享的文件中的内容。后来新同事Dave加入到了该机密项目中,又但愿Dave可以看到共享的文件内容。加密
也就是说用明文经过密钥的加密后获得密文,使用一样的密钥就能够把密文解密为明文。经常使用的对称加密算法是3DES。设计
密钥是有一对(2个,1个叫公钥,1个叫私钥),使用公钥加密的信息,只有对应的私钥才能解密;使用私钥加密的信息,只有对应的公钥才能解密。公钥是能够公开出来的,私钥须要本身保存,不能让其余人知道。目前主要的非对称加密算法有RSA和椭圆曲线加密算法ECC。blog
哈希算法是一种摘要算法,对于任意长度的输入,都输出相同长度的结果,而且输出结果对输入具备敏感性,也就是说输入只是一个小小的变化,就会引发输出巨大的不一样。另外哈希算法还须要扛对撞,也就是说咱们不能轻易找到两个不一样的输入,使得他们的哈希输出相同。经常使用的哈希算法有MD5, SHA256 。游戏
数字签名就是将哈希算法与非对称加密算法结合的一个最好应用。对于一条明文消息M,咱们须要对其进行签名,那么首先就是计算该消息的摘要,也就是哈希值,获得H(M),而后再用咱们的私钥对这个哈希值进行加密,结果就是数字签名。任何人拿到消息M和数字签名后,均可以用咱们的公钥对数字签名进行解密,将解密结果与消息M的哈希值进行对比,若是相同,就说明M没有被更改,同时该签名也是咱们签署的,而不多是别人伪造的签名。get
每一个用户都有本身的私钥和公钥,私钥因为私密性,因此须要加密保存,用户只有输入本身设置的口令后才能解密出本身的私钥。而用户的公钥则公开在系统上,全部用户均可访问。it
Alice如今准备好合同文件M,因为隐私的考虑,因此须要对合同文件加密,而这里加密采用的是对称加密算法,密钥是随机生成的,加密后的合同文件为密文M。Alice但愿合同的乙方Bob还有就是中介Charlie可以看到这个合同(固然Alice本人也须要能看到合同),因此她将这个随机密钥用各自的公钥进行加密,加密后生成了3个密文:密文A、密文B、密文C。如今Alice就能够将加密后的合同密文M以及密文A、密文B、密文C放到网上。io
Alice不须要对明文的合同M进行签名,她须要的是在密文M上进行签名,也就是说先计算出密文M的哈希值“H(密文M)”,而后用本身的私钥A对该哈希值进行加密,这样就能获得签名A。如今Alice把签名A也放在网上,由于Alice的公钥是公开的,因此任何人均可以用公钥A来解密签名A,从而验证密文M的哈希值是否和解密相同。
Bob做为合同的乙方,在收到Alice上传并签名的合同后,他首先须要验证合同的签名A是否正确,若是正确则说明该合同确实是Alice签名的,并且没有被篡改过。可是网上存在的合同是密文M,那么Bob该怎么查看合同内容呢?由于Bob有本身的私钥,他能够解锁出解密文件的随机密钥,用这个密钥再去解密加密文件,就可以看到原始文件了。
接下来Bob须要加签合同,那么他的作法和步骤3签名合同是相似的,只须要用本身的私钥对密文进行签名,而后把签名放到网络上便可。
【上面的文章是我在整理电脑时发现当年写了,没有发布的,如今稍做修改发布出来,但愿对你们有所帮助。】