密码学要做什么?
想要搞清楚密码学研究什么,首先要搞清楚密码学要做什么,要从哪些维度保护信息的安全。然后从各个不同纬度研究其实现安全保护的原理,算法。
应用密码学对信息的保护主要致力于以下几个维度:
- 信息的保密性,防止信息被中间人监听。
- 信息的完整性,防止信息被中间人篡改。
- 信息的不可抵赖性,信息的发送方无法否认自己发送的信息。
- 信息来源的可信性,信息发送方不可被冒充。
下面我们分别从这几个维度讨论其涉及的密码学算法,及简单的原理介绍。
保密性
由于当前互联网中的所有信息都是通过一个共用的全球网络进行传播的,这些信息都是飞翔在一个开放的,不安全的信道中。每一个连接到互联网的路由器都可以轻松的拿到经过它的所有数据包,互联网中这样的路由器千千万万,我们无法保证每一个路由节点的管理员都能安分守己,不随意窃取偷看他人的信息。这些信息又涉及到国家安全,商业机密,用户银行帐号信息等等极其重要的内容。因此对信息进行保密传输已经成为当前互联网的一个基础服务,每个公司都应该有的标配(然而我见过明文传输用户账号密码的公司)。
实现信息的保密性就是对传播的数据进行加密,应用密码学中对信息加密有两种方式:对称加密,非对称加密。
对称加密
“对称”和“非对称”加密的这个“对称”指的的是加密和解密的密钥,顾名思义对称加密的使用的加解密密钥是一致的。
对称加密根据其加密的方式不同又可以分为:分组密码,流密码
- 分组密码
分组密码是比较常用的一种对称加密方式,在加密时将要加密的明文分成固定大小的块,然后再进行加密。常见的算法有DES,3DES,AES。AES算法在使用中有很多种分组模式,以后会出文章重点讲一下。
DES目前认为已经不再安全,所以在实际使用中对称加密要选择3DES或者AES(但是作为早期大量使用的对称加密算法了解一下还是很有必要的)。 - 流密码
常见的流加密算法是RC4,是WEP采用的一种加密算法,早期版本的TLS也支持这种加密算法,但是在2015年发布的RFC 7465中禁止使用RC4算法,禁止原因无非就是这种算法被攻破了。
非对称加密算法
对称加密算法加密和解密使用的密钥不同,根据私钥用于加密还是解密的用途不同,可以分别用于加密和签名。
常见的非对称加密有:大名鼎鼎的RSA和正在迅速崛起的ECC。
- RSA
RSA可以说是目前互联网信息安全保密的半壁江山,1977由Rivest、Shamir 和 Adleman三位数学家合作设计。RSA就是他们三位名字的首字母。
RSA基于大数分解的数学原理,有亚指数级别的加密强度,只能暴力破解。目前常用的长度是1024,2048,已经有团队能够破解760长度的RSA。平常使用时请尽量选择2048位长度(在未来十年内1024位被破解的概率很大)。
我后面会专门出文章详细介绍RSA的原理,会涉及费马小定理,欧拉公式(超级数学大神),请买好瓜坐等! - ECC
ECC中文全称是椭圆曲线加密,其实ECC和我们理解的椭圆没有半毛钱关系,只是听起来一样而已。
ECC基于椭圆曲线域上的离散对数原理,具有指数级别的加密强度,250位长度的ECC密钥加密强度可以超过2048位的RSA强度,由于平常使用时ECC密钥更短,因此ECC更快。所以渐渐的很多非对称加密都开始选用ECC。TLS 3.0中也讲ECC推荐位基础加密算法,废弃了RSA静态蜜月交换。因此在以后的对称密钥交换时推荐大家使用ECDH,但是在签名时不推荐使用ECDSA(有个大坑,有兴趣的同学翻一翻我之前关于ECC的文章,里面有详细介绍)。
完整性
当我们对一段信息进行加密后传输就安全了吗?事情好像没有那么简单!这个世界如此复杂,那些潜伏在网络世界中的大神们更是用尽各种手段窃取,破坏重要的信息。中间人就算无法查看数据的内容但依然可以通过巧妙的篡改(增加或者删除内容)传输信息的部分内容到达攻击目的。
试想在一个期待已久的薪资发放日,你拿到了热气腾腾的5000元薪酬,当你转入余额宝时被终结某个节点的黑客删除了一个0,你存入支付宝的5000元就这样莫名其妙的变成了500,这是多么可怕又可恶的事情。所以数据的完整性校验和加密一样重要!一定得重视!
那么我们我们使用什么方式来确保数据不被篡改呢?智慧的前辈们早就找到了行之有效的方法,那就是在加密传输数据的同时带上数据的摘要值(又叫哈希值)。对端收到数据后重新计算一边信息的摘要和传过来的进行对比就可以知道信息有没有被篡改。
信息的摘要
计算摘要的方法也叫做哈希算法,一个哈希算法要做的事情是把不固定长度的输入映射到一个固定长度的字符集合。通俗点理解就是把一个大的集合一一对应的映射到一个小的集合。
一个好的哈希算法要同时具备以下性质:
- 不可逆性,可以由长的输入计算出短输入,但是无法逆向。
- 抗碰撞性,抗碰撞性要求哈希算法均匀的将输入映射到固定长度的字符集合,不同的信息映射到固定长度的字符集和概率要一样,只要原始信息有一个字节被修改重新计算得到的摘要完全不同。这一条性质非常重!是发现信息被修改的关键所在。
- 固定长度,对于同一个哈希算法不管输入字符多长,输入结果都是固定长度的。
- 快速,在实际使用中我们可能对大量文件计算摘要,因此要求哈希算法要足够快,不能成为性能瓶颈。
要想设计出具备以上性质的哈希函数并不是一件简单的事情,但是好在日常使用中我们不需要自己设计哈希算法,有很多成熟的被广泛使用的哈希算法可供选择。
常见的哈希算法有:MD5,SHA1,SHA256,SHA512。这几个算法计算得到的摘要值长度以此增加,抗碰撞性也不断提高。日常使用中推荐SHA256,这个强度在未来十年是可以保证抗碰撞性的。MD5已经不推荐使用了,听说过彩虹表吧,就是用来碰撞出MD5值的,有时间我也会分享一下彩虹表的的破解原理,可不是简单的存储所有可能的MD5结果然后对比,挺有意思的。
上面列举的几个哈希算法都是不需要密钥的,输入值是要要计算摘要的信息,输出值是摘要结果。还有一种哈希算法是有密钥参与的,最常用的是MAC算法(Message Authentication Code),是在哈希算法基础上增加了密钥,常用在对称加密时对信息进行完整性验证。
这里要强调一个概念:哈希算法并不是加密算法,加密算法有加密和解密两个过程,而哈希算法是不可逆的。如果你以前认为哈希算法是加密算法,看着这篇文章就要记住,哈希不是加密。
信息的不可抵赖性
顾名思义,信息的不可抵赖性就是一旦信息被发送方发出,就无法否认自己发送的信息。(这只是一个技术概念,并不一定完全无法抵赖)。
要做到信息的不可抵赖性就要信息发送方有一个唯一的能确定他身份的机制,别人不可伪造。前面介绍的公私钥机制就能达到这样的效果。
试想一下场景:
- Alice生成一对公私钥Pri_key和Pub_key。
- Alic将公钥公布出去(公示在某个网站或者可以发布信息的地方。)
- Alic要和Bob通信,于是Alic用私钥Pri_key对信息进行加密。
- Bob收到信息后尝试用公开的Pub_key解密,只要信息能正确解密就可以确定这一定是Alic发送的(因为只有Alic有私钥)。
这就是非对称加密进行身份验证的原理。
理论上任何公私钥算法都能实现身份验证的功能,常用的验签算法有:DSA,RSA,ECDSA。
验签机制除了能实现信息的不可抵赖性,还可以验证信息源的可信性。
最后
其实还有一种加密算法叫做同态加密,常用于云存储的数据分析,对同态加密的研究目前还是处于起步阶段,阿里等云比较成熟的公司都在做这件事。对同态加密有兴趣的同学可以自行了解,我也不是清楚。当然有这方面的大牛非常欢迎一起交流一起happy。
以上几个方面基本上就是我们能接触到的密码学常用的各种场景和算法,后面我会找时间详细介绍RSA原理,AES加密,基于ECC的算法ECDH和ECDSA使用中需要注意的地方。时间不是很确定!
困了。。。。。。。。。。。。。。。