最近在研究区块链的时候关注了一下加密技术,小有心得,于是设计了一款数据加密共享与签名的方案,希望能够为做电子合同,数据存证,数据共享的朋友有所帮助吧。
业务场景
一、电子合同
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的哈希值是否和解密相同。
4.解密合同
Bob作为合同的乙方,在收到Alice上传并签名的合同后,他首先需要验证合同的签名A是否正确,如果正确则说明该合同确实是Alice签名的,而且没有被篡改过。但是网上存在的合同是密文M,那么Bob该怎么查看合同内容呢?因为Bob有自己的私钥,他可以解锁出解密文件的随机密钥,用这个密钥再去解密加密文件,就能够看到原始文件了。
5.加签合同
接下来Bob需要加签合同,那么他的做法和步骤3签名合同是类似的,只需要用自己的私钥对密文进行签名,然后把签名放到网络上即可。