密码主要用于军事,无论古今中外,概莫能外。据《六韬》所载,3000年前由姜子牙发明了“阴符”,这就是最初的密码。后被广泛运用于我国古代维护国家安全的军事活动和情报活动中。
西方也同样如此,著名的凯撒密码(Caesar cipher),在公元前1世纪,就被用于高卢战争中,这是一种简单易行的单字母替代密码。战前凯撒设计了一种对重要的军事信息进行加密的方法,即使这些信息被截获,敌方也不一定能看懂。其实,凯撒密码字母移位的位数就是一种简单易行的单字母替代密码。密码轮是利用凯撒密码来应用的,通过把字母移动一定的位数来实现加密和解密。例如,当偏移量是3的时候,所有的字母A将被替换成D,B变成E,以此类推。
现如今信息时代,加密技术更是无处不在,比如邮箱、网盘等,但是关于它的实现原理,如何实现,你又知道多少呢?由于之前一段时间在研究国密算法的JAVA实现,网上找了不少的资料,同时也学习了加密的原理和概念,自己整理了一下网上的资料和自己的理解。这一块东西在日后的工作中是避不开的,多了解一下总有好处,而不是只会简单的调用encrypt和decrypt方法,知其然的同时也要知其所以然。
在讲解国密之前,我们首先要来了解一下关于加密的一些基本的知识。 首先加密被分为两大类,也就是 单向加密和双向加密 , 双向加密又可被细分为对称加密和非对称加 密,这两种加密中又存在多种不同的模式。
【单向加密】
单向加密可以简单的理解成为只能加密,没法解密,最典型的例子就是 散列算法 (Hash Function),也就是 摘要算法(杂凑算法)
。
这是一种从任意文件中创造小的数字「指纹」的方法。与指纹一样,散列算法就是一种以较短的信息来保证文件唯一性的标志,这种标志与文件的每一个字节都相关,而且难以找到逆向规律。因此,当原有文件发生改变时,其标志值也会发生改变,从而告诉文件使用者当前的文件已经不是你所需求的文件。
这个过程是不可逆的,你摘要了一段东西就意味着你丢弃了原文,你无法用摘要去还原原文来,比如“我今天去二楼食堂吃了杂粮煎饼”,摘要出来是“我吃了煎饼”,你无法从后者去推断出原文。但是你用同样的算法对同样的内容,计算出的结果是肯定一致的。这只是个简单的例子,实际的摘要算法要更复杂,里面有自己的算法。你不仅不可能根据一段通过散列算法得到的指纹来获得原有的文件,也不可能简单地创造一个文件并让它的指纹与一段目标指纹相一致。
一个优秀的散列算法需要有以下几个特性:
摘要算法的用途非常广,我们身边有很多不经意的地方都用到了这个东西,现在大部分的网络部署和版本控制工具都在使用散列算法来保证文件可靠性。而另一方面,我们在进行文件系统同步、备份等工具时,使用散列算法来标志文件唯一性能帮助我们减少系统开销,这一点在很多云存储服务器中都有应用。
现在的QQ、QQ邮箱、百度网盘之类的都有用到这一个技术,否则为什么我们传一个几个G的文件只需要几秒钟,因为根据文件计算出来的hash值,在服务器上找到了同样的文件,直接从服务器上拉取即可,不需要再上传。所以网盘里的资源你再怎么改名字,藏的再深,都是没有用的,你改变不了散列值,大家分享来分享去,他们不需要点开来看你到底是什么视频内容,只要抓到一个,然后就把所有散列值一样的都给封掉,变成九秒教育短片。
▪ 常用的散列算法
MD(Messge Digest)4:
由Rivest于1990年设计的单向散列函数,能够产生128比特的散列值。现在它已经不安全了。
MD(Messge Digest)5: 由Rivest于1991年设计的单向散列函数,能够产生128比特的散列值。MD5的强抗碰撞性已经被攻破。也就是说,现在已经能够产生具备相同散列值的两条不同的消息,因此它也不安全了。
SHA-1、SHA-256、SHA-384、SHA512
SHA-1是由NIST(美国国家标准技术研究所)设计的一种能够产生160比特的散列值的单向散列函数。现在已不推荐使用。SHA-256、SHA-384、SHA512都是由NIST设计的单向散列函数,它们的散列值长度分别为256比特、384比特、和512比特。这些单向散列函数合起来统称SHA-2。目前SHA-1已经被攻破,2还是安全的。
【 双向加密】
双向加密是加密算法中最常用的,一方将明文数据进行加密,另外一方可以使用一定的手段如算法和密钥,将密文还原为明文数据,所以称之为双向的。
双向加密里又分为对称加密和非对称加密。
1、 对称加密(Symmetric Key Encryption)
对称加密使用一个密钥,给定一个明文和一个密钥,加密产生密文,其长度和明文大致相同。解密时,使用的密钥与加密密钥相同。
在对称加密中,分为分组加密和序列密码。
▲序列密码
流加密(stream cyphers),一次加密明文中的一个位。是指利用少量的密钥(制乱元素)通过某种复杂的运算(密码算法)产生大量的伪随机位流,用于对明文位流的加密。解密是指用同样的密钥和密码算法及与加密相同的伪随机位流,用以还原明文位流。
▲ 分组加密
块加密(block cyphers),一次加密明文中的一个块。是将明文按一定的位长分组,明文组经过加密运算得到密文组,密文组经过解密运算(加密运算的逆运算),还原成明文组。
TODO 这两者的比较补充一下,流加密讲的太少了,这个东西材料也不多。
分组加密又有四种不同的模式,分别如下:
▪ 电子密码本模式 Electronic Code Book(ECB)
这个是最简单的模式,就是将原来的明文给按照固定的长度(也就是密钥的长度)给拆开来,然后用相同的密钥进行加密。
缺点是只适合加密小消息,如果明文块重复的多,密文里也会有很多的重复,它的明文和密文的对应关系是一致的。
▪ 加密块链模式 Cipher Block Chaining(CBC)
前面一个加密块输出的密文与下一个要加密的明文块进行异或操作,将计算结果再用密钥进行加密得到密文。这是一个迭代的过程,所以会在开头需要一个初始的向量。这个的优势就是密文和明文不再是一一对应的关系,每个相同的明文都掺杂了不同的向量。
▪ 加密反馈模式 Cipher Feedback Mode(CFB)
首先就是你自己有一个iv初始向量,对整个iv进行加密,然后取前面的高n位,与明文块的前n位进行异或操作,得到了n位的密文块0。然后这个被传入到下一个加密的操作中,首先将原来的iv左移n位,右边空出来的位置,就放密文块0,如此反复。
▪ 输出反馈模式 Output Feedback Mode(OFB)
这个和CFB很类似,唯一的区别就是填入的是K的高n位,而不是前一个密文块的内容。
2、非对称加密(Asymmetric Key Encryption)
公开密钥加密(Public-key cryptography),也称为非对称加密(asymmetric cryptography),是密码学的一种算法,它需要两个密钥,一个是公开密钥,另一个是私有密钥;一个用作加密的时候,另一个则用作解密。使用其中一个密钥把明文加密后所得的密文,只能用相对应的另一个密钥才能解密得到原本的明文;甚至连最初用来加密的密钥也不能用作解密。由于加密和解密需要两个不同的密钥,故被称为非对称加密。
▪ 公钥(Publish Key)加密,私钥(Private Key)解密
这个过程就相当于是A和B要通信,B把公钥发给A,或者直接公开在网上,你要给我发消息,就请用密钥C来加密,然后B收到加密后的消息c(x)后,就用自己的私钥来解密,得到实际的明文消息x。
比喻成数学公式,就是【d(c(x)) = x】,d就是私钥,只有接收者自己知道。
▪ 私钥(Private Key)加密,公钥(Publish Key)解密
你自己发一个消息的时候,用你的私钥去加密这个消息,然后将你的公钥公开给所有人,任何人都可以用这个公钥来解密你的消息。解不开说明私钥不对,也就是相当于,要证明这个消息是你发的,就是用公钥解开密文。
接收方可以通过此来判断消息途中是否有被篡改,也可防止用户抵赖,所以这个也被称之为数字签名,因为只有你才能把明文a加密成b,且b可以被公钥解密出来得到明文a,能够做到这件事情的只有你,其他人都不行。
以上的两种非对称加密的方式,更合适在互联网环境下使用,若采用对称加密, 你无法去保证传输密钥的过程的安全性。
---文末彩蛋---
▪ 常见的加密算法: TODO
▪ 证书: TODO
▪ 加密算法思维导图: TODO 这边自己画一张图上去
▪ SSL: TODO 这个可以补充一下啊,尤其是openssl,感觉有好多可以扯的
▪ 国密算法:
放到下一章节去,这边字数不够了,这一篇叫,国密预告,热身篇
▪ 参考链接
http://news.sciencenet.cn/sbhtmlnews/2012/3/255412.shtm
http://blog.csdn.net/fw0124/article/details/8472560
哈希算法:http://www.jianshu.com/p/bf1d7eee28d0
原文地址:https://rdcqii.hundsun.com/portal/article/854.html
作者:小小伟