数字签名与加密算法-上【mix指南之区块链】
为什么要开一个区块链的系列?引用mixlab社区里的熊叔(ML94)的话:
“
如果把人比作手机,价值观、态度和习惯是这个操作系统底层,领域技能更像是系统上的app。技能不会的话装一个就好,如果大家有好的“app”,可以相互推荐,如果自己没有装这个“app”,也可以借别人的。
”
mixlab无界社区为大家提供了一个跨界的平台,不止于跨界人才的交流(人),更多的还有跨领域技能的指南(内容)。所以,开始会更新一些区块链技术的文章。
最近感受比较深的方法,分享给大家:
mix方法:不让概念限制想象力,更多地关注原理本身。当我们掌握了概念对应的原理本身,就可以跳出概念本身的限制,基于原理,自由创作我们想象中的产品。
本期从密码学的背景知识出发,帮助读者快速理解数字签名、加密算法,结合DIY实践指南,从代码层面掌握技术原理,为以后灵活使用提供基础,最后根据技术的特点,为UX设计梳理了几条参考~
1 密码学
密码学是研究编制密码和破译密码的技术科学,包括编码学及破译学。研究密码变化的客观规律,应用于编制密码以保守通信秘密的,称为编码学;应用于破译密码以获取通信情报的,称为破译学。
保密通信是密码学产生的动因,除了保守通信密码之外,密码学还有很多相关的应用场景,例如:
数字签名:数字签名可以代替传统的手写签名,数字签名具有更好的防伪造性。
秘密共享:指将一个秘密信息利用密码技术分拆成N个信息,分发给N个人员,只有K(K≤N)个合法人员的信息才可以恢复该秘密信息。利用秘密共享技术可以控制任何需要多个人共同控制的信息、命令等。
认证功能:在公开的信道上进行敏感信息的传输,采用签名技术验证消息的真实性、完整性,以及实现对通信主体的身份验证。
除了以上的基本功能,具体的应用如电子商务系统、电子现金系统、电子选举系统、电子招投标系统、电子彩票系统等等。当然,还有区块链。
2 加密算法
密码学最核心的就是加密算法,我们了解下加密算法的分类:对称加密算法,非对称加密算法和哈希算法。
2.1 对称加密
symmetric cryptography
又称公共密钥加密
common-key cryptography
指使用相同密钥进行加密和解密的加密算法。类似于我们常规理解的邮箱密码,我们把邮箱密码共享了,那所有人都可以拿着这个密码查看我们的邮箱。所以对称加密算法的安全性取决于加密密钥的保存情况,是不能随意泄露的。
2.2 非对称加密
asymmetric cryptography
又称公钥加密
public-key cryptography
指使用不同密钥进行加密和解密的加密算法。我们首先会生成2把钥匙,一把是公钥,可以随意公开,类似于银行卡的卡号;一把是私钥,需要自己保管好,相当于银行给你的U盾。
2.3 散列算法
Hash算法
也称为哈希算法,是一种单向算法。Hash,一般翻译做“散列”,也有直接音译为“哈希”。
用户可以通过Hash算法对目标信息生成一段特定长度的唯一的字符串(Hash值),生成后不能通过这个字符串重新获得目标信息。过程是不可逆的,因而是一种单向算法。
Hash算法常用在不可还原的密码存储、信息完整性校验等场景中。
2.4 如何选择加密算法
1)运行速度
非对称加密算法的运行速度比对称加密算法的速度慢很多,当我们需要加密大量数据时,建议采用对称加密算法,提高加解密速度。
2)签名
对称加密算法不能实现签名,因此签名只能采用非对称加密算法。
3) 安全性
由于对称加密算法的密钥管理是一个复杂的过程,密钥的管理直接决定着安全性,因此当数据量很小时,可以考虑采用非对称加密算法。
综上,通常采用的方式是:采用非对称加密算法管理对称算法的密钥,然后用对称加密算法加密数据,这样我们就集成了两类加密算法的优点,既实现了加密速度快的优点,又实现了安全方便管理密钥的优点。
3 散列算法
也称为消息摘要算法,哈希算法。摘要算法的本事就是可以把一大段的字符串,例如本文的所有文字,映射到一个固定长度的字符串上,并且可以保证字符串是唯一的。所以形象地称为“摘要”。摘要算法主要使用SHA算法。
3.1 安全散列算法 SHA
Secure Hash Algorithm
是一个密码散列函数家族,是FIPS(美国联邦信息处理标准)所认证的安全散列算法。算法的核心是一个散列函数又称哈希函数,杂凑函数,它是一个单向加密的过程,即从明文到密文的不可逆映射,只有加密过程没有解密过程。所以,加密后的字符串,只有自己看得懂。
3.2 摘要算法的特点
1) 抗碰撞
对于任意两个不同的数据,其hash值相同的可能性极小;对于一个给定的数据,找到和它hash值相同的数据极为困难。
2)抗篡改
对于一个数据,哪怕只改动其一个比特位,其hash值的变动也会非常大。
3.3 实践SHA算法
掌握其输入、输出:
输入:任意长度的字符串
输出:固定长度的字符串
通过改变输入,感受输出的字符串变化,可以通过以下站点体验:
http://emn178.github.io/online-tools/sha256.html
引用SHA算法的JS库:
https://github.com/emn178/js-sha256
输入试试:
sha256('mixlab')
4 非对称加密算法
4.1 RSA算法
RSA是1977年由罗纳德·李维斯特(Ron Rivest)、阿迪·萨莫尔(Adi Shamir)和伦纳德·阿德曼(Leonard Adleman)一起提出的。当时他们三人都在麻省理工学院工作。RSA就是他们三人姓氏开头字母拼在一起组成的。RSA算法是第一个能同时用于加密和数字签名的算法。RSA是被研究得最广泛的公钥算法,从提出到现今的三十多年里,经历了各种攻击的考验,逐渐为人们接受,被普遍认为是最优秀的公钥方案之一。
RSA算法,私钥加密内容,只能公钥解密,公钥加密内容,只能私钥解密。对应的有2种典型的应用模式。
4.2 加密模式
——公钥加密内容
1)用户A先生成公钥及私钥,公钥是可以公开的,私钥只有用户A才拥有;
2)用户B拿A公开的公钥,对数据“Hello Mixlab”进行加密,加密后的数据记为“x58ml”;
3)用户B把“x58ml”发送给用户A;
4)用户A用自己的私钥解密“x58ml”,获得原数据“Hello Mixlab”
在3)的过程中,如果被用户C窃取到了数据“x58ml”,因为C没有A的私钥,所以C无法获得原数据。
如图所示:
cryptico.js
https://github.com/wwwtyro/cryptico
我们用JS库cryptico.js做一下实验,新建一个html文件,引入cryptico.js库,chrome浏览器打开console面板,输入:
//1 ------生成公钥私钥-------
var PassPhrase = "mixlab";
var Bits = 1024;
var MattsRSAkey = cryptico.generateRSAKey(PassPhrase, Bits);
var MattsPublicKeyString = cryptico.publicKeyString(MattsRSAkey);
var A={
private:MattsRSAkey,
public:MattsPublicKeyString
};
var B={
public:MattsPublicKeyString,
data:"Hello Mixlab"
};
//2 ------用户B拿A的公钥,加密数据-------
B.encryptionData = cryptico.encrypt(B.data, MattsPublicKeyString).cipher;
//3 ------用户B把加密后的数据发送给用户A-------
A.encryptionData=B.encryptionData;
console.log('打印出来看看A收到的加密后的数据',A.encryptionData);
//4 ------用户A用自己的私钥解密-------'
var DecryptionResult = cryptico.decrypt(A.encryptionData, A.private);
console.log('打印出来看看解密后的数据',DecryptionResult)
在如果用户C对B传递给A的加密数据进行了篡改,即用户C用A的公钥,伪造了假信息(如:“SB”)并进行加密,传递给A。这个时候,A收到的数据,解密后信息显示“SB”,A以为是B发来的…… ……
我们如何保证B发给A的数据没有经过第三方篡改呢?这时就要用到签名,上文的过程改造一下:
1)用户A先生成公钥及私钥,公钥是可以公开的,私钥只有用户A才拥有;
2)用户B拿A公开的公钥,对数据“Hello Mixlab”进行加密,加密后的数据记为“x58ml”;
3)用户B,对数据“Hello Mixlab”通过哈希算法得到摘要"f78843...8b"。
4)用户B用A的公钥,对摘要进行加密,加密后对数据长记为“qwer123”
5)用户B把“x58ml”及“qwer123”发送给用户A;
6)用户A用自己的私钥解密“x58ml”和“qwer123”,获得原数据“Hello Mixlab”,及原数据对应的摘要"f78843...8b"
7)用户A对原数据“Hello Mixlab”进行哈希算法,比对下是否与摘要"f78843...8b"相同,若相同则信息是正确的,传输过程中没有被篡改。
如图所示,如果用户C自己也造了个对应的加密数据及摘要加密数据呢?那就是B实在太不小心,把加密后的两组数据同时传送,或者传送过程中标注得太明白,被C猜出来了分别代表的含义。
但是因为公钥是公开的,所以在加密模式中我用户A知道到底是谁发送数据给我他。
4.3 认证模式
——私钥加密内容
在认证模式中,发送方用私钥加密数据,给接收方发送数据,接收方用公钥解密,因为私钥是唯一的,所以只要数据解析成功就可以知道数据发送方是谁。
这如图所示。
总结下,
加密模式:公钥加密,私钥解密是秘送;
认证模式:私钥加密,公钥解密是签名。
5 数字签名
《中华人民共和国电子签名法》2005年正式实施,可靠的电子签名与手写签名或者盖章具有同等的法律效力。电子签名并非是书面签名的数字图像化。其实是一种电子代码,利用它,收件人便能在网上轻松验证发件人的身份和签名,同时还能验证出文件的原文在传输过程中有无变动。
电子签名是一种泛化的概念,数字签名可认为是电子签名的一种实现方式。数字签名技术的实现需要使用到非对称加密算法和哈希算法。
这两种算法在前面都已经介绍了,签名技术使用的算法,有各种变种,例如:
代理签名算法:为了让别人可以代理他进行签名;
群签名算法:一个群体中的任意一个成员可以以匿名的方式代表整个群体对消息进行签名;
环签名算法:一种简化的群签名,环签名中只有环成员没有管理者,不需要环成员间的合作;
门限签名算法:一个群体中至少达到一定固定数目的人参与才可产生证明自己是文件发送者;
不可否认签名算法:没有签名者的同意,接受者不能把它给第三方看的签名……
信息量很庞大,此部分读者可以根据自己的需要查找资料深入了解。
未完待续,敬请期待下篇。
区块链相关文章推荐:
参考资料:
百度百科
维基百科
Github
https://github.com/bitcoin/bitcoin
-------------------------------
对技术感兴趣的读者可以继续了解下技术圈的这些小伙伴们:
猿天地
简介:
猿天地以程序猿用户为主,提供各种开发相关的技术内容。JAVA方向为主(Spring Boot, Spring Cloud,Sharding JDBC,Elastic Job,Mongodb等)。互联网时代,技术从未如此简单,我们一起前行。
高性能服务器开发
英文ID:easyserverdev
简介:
推崇基础学习与原理理解,不谈大而空的架构与技术术语,分享接地气的服务器开发实战技巧与项目经验,实实在在分享可用于实际编码的技术知识,提供高质量免费技术学习资源,让服务器开发技术通俗化平民化。
猿湿Xoong
简介:
人称「湿兄」or「ptt」,一个忠于原创、爱搞事爱分享的公众号。
既爱进行 bit 级别的算法细究,也能搞出功能完善的有趣程序。职场小鸟,主打 Android 与 Python 技术分享。时不时的抖一抖自己刚涨的见识,聊一聊程序员的风骚趣事。
Java工会
简介:
秉承着技术改变世界,程序创造未来的宗旨,专注于java技术分享。为读者提供专业的技术解决方案,架构规划,求职面试等最新讯息。Talk is cheap, show me the code!
Kirito的技术分享
简介:
【Kirito的技术分享】主要分享 Java 相关的技术,源码分析,与开发相关的最佳实践,时而聊聊个人感悟。
尚程功夫
简介:
打磨编程技术,提高职场认知,码农的世界不只是coding. 作者 Steven, 工科硕士,躬耕于嵌入式领域十余载,多年美国纽约工作经验;目前从事机器人导航技术的研发。喜欢ROS、SLAM、机器人以及无人机的小伙伴们可以关注哦;这里不仅仅有技术,还不定期写一些职场认知,代表作「我的爸爸是码农」「新版李雷与韩梅梅」
编程一生
简介:
一个有逻辑、有观点、有温度、有调性的技术公众号~作者是一个有日本东京、美国硅谷工作经验,有百项技术发明专利,十一年程序媛。
欢迎一起探索技术~
-------------------------------
活动预告:
第4期的mixlab线下活动即将在7.14号@上海举办
-------------------------------
mixlab社区介绍:
中文:无界社区
英文:mixlab
定位:去中心化、非盈利、全球化
价值观:跨界 开放 互助 学习 创新
愿景:让每个人无限可能
mixlab社区人群来源于GoogleBrain、微软、华为、阿里鲁班、腾讯、旷视、三角兽、物灵科技、众安保险、美团、360等,还有高校背景的人员,包括MIT、CMU、UoM、清华、上交大、同济等等,汇集了机器学习、自然语言处理、前端、后端、产品经理、UI设计师、建筑设计师、高校教师、CEO等,每天都会讨论跨界问题。
附一则寻人启示:昵称为 Lucas 的用户,你填写的申请表里,微信号联系不上你……
赞赏的方式可以是点广告~