密碼主要用于軍事,無論古今中外,概莫能外。據(jù)《六韜》所載,3000年前由姜子牙發(fā)明了“陰符”,這就是最初的密碼。后被廣泛運用于我國古代維護國家安全的軍事活動和情報活動中。
西方也同樣如此,著名的凱撒密碼(Caesar cipher),在公元前1世紀(jì),就被用于高盧戰(zhàn)爭中,這是一種簡單易行的單字母替代密碼。戰(zhàn)前凱撒設(shè)計了一種對重要的軍事信息進行加密的方法,即使這些信息被截獲,敵方也不一定能看懂。其實,凱撒密碼字母移位的位數(shù)就是一種簡單易行的單字母替代密碼。密碼輪是利用凱撒密碼來應(yīng)用的,通過把字母移動一定的位數(shù)來實現(xiàn)加密和解密。例如,當(dāng)偏移量是3的時候,所有的字母A將被替換成D,B變成E,以此類推。

現(xiàn)如今信息時代,加密技術(shù)更是無處不在,比如郵箱、網(wǎng)盤等,但是關(guān)于它的實現(xiàn)原理,如何實現(xiàn),你又知道多少呢?由于之前一段時間在研究國密算法的JAVA實現(xiàn),網(wǎng)上找了不少的資料,同時也學(xué)習(xí)了加密的原理和概念,自己整理了一下網(wǎng)上的資料和自己的理解。這一塊東西在日后的工作中是避不開的,多了解一下總有好處,而不是只會簡單的調(diào)用encrypt和decrypt方法,知其然的同時也要知其所以然。
在講解國密之前,我們首先要來了解一下關(guān)于加密的一些基本的知識。 首先加密被分為兩大類,也就是 單向加密和雙向加密 , 雙向加密又可被細分為對稱加密和非對稱加 密,這兩種加密中又存在多種不同的模式。
【單向加密】
單向加密可以簡單的理解成為只能加密,沒法解密,最典型的例子就是 散列算法 (Hash Function),也就是 摘要算法(雜湊算法)
。
這是一種從任意文件中創(chuàng)造小的數(shù)字「指紋」的方法。與指紋一樣,散列算法就是一種以較短的信息來保證文件唯一性的標(biāo)志,這種標(biāo)志與文件的每一個字節(jié)都相關(guān),而且難以找到逆向規(guī)律。因此,當(dāng)原有文件發(fā)生改變時,其標(biāo)志值也會發(fā)生改變,從而告訴文件使用者當(dāng)前的文件已經(jīng)不是你所需求的文件。
這個過程是不可逆的,你摘要了一段東西就意味著你丟棄了原文,你無法用摘要去還原原文來,比如“我今天去二樓食堂吃了雜糧煎餅”,摘要出來是“我吃了煎餅”,你無法從后者去推斷出原文。但是你用同樣的算法對同樣的內(nèi)容,計算出的結(jié)果是肯定一致的。這只是個簡單的例子,實際的摘要算法要更復(fù)雜,里面有自己的算法。你不僅不可能根據(jù)一段通過散列算法得到的指紋來獲得原有的文件,也不可能簡單地創(chuàng)造一個文件并讓它的指紋與一段目標(biāo)指紋相一致。
一個優(yōu)秀的散列算法需要有以下幾個特性:

摘要算法的用途非常廣,我們身邊有很多不經(jīng)意的地方都用到了這個東西,現(xiàn)在大部分的網(wǎng)絡(luò)部署和版本控制工具都在使用散列算法來保證文件可靠性。而另一方面,我們在進行文件系統(tǒng)同步、備份等工具時,使用散列算法來標(biāo)志文件唯一性能幫助我們減少系統(tǒng)開銷,這一點在很多云存儲服務(wù)器中都有應(yīng)用。
現(xiàn)在的QQ、QQ郵箱、百度網(wǎng)盤之類的都有用到這一個技術(shù),否則為什么我們傳一個幾個G的文件只需要幾秒鐘,因為根據(jù)文件計算出來的hash值,在服務(wù)器上找到了同樣的文件,直接從服務(wù)器上拉取即可,不需要再上傳。所以網(wǎng)盤里的資源你再怎么改名字,藏的再深,都是沒有用的,你改變不了散列值,大家分享來分享去,他們不需要點開來看你到底是什么視頻內(nèi)容,只要抓到一個,然后就把所有散列值一樣的都給封掉,變成九秒教育短片。
? 常用的散列算法
MD(Messge Digest)4:
由Rivest于1990年設(shè)計的單向散列函數(shù),能夠產(chǎn)生128比特的散列值。現(xiàn)在它已經(jīng)不安全了。
MD(Messge Digest)5: 由Rivest于1991年設(shè)計的單向散列函數(shù),能夠產(chǎn)生128比特的散列值。MD5的強抗碰撞性已經(jīng)被攻破。也就是說,現(xiàn)在已經(jīng)能夠產(chǎn)生具備相同散列值的兩條不同的消息,因此它也不安全了。
SHA-1、SHA-256、SHA-384、SHA512
SHA-1是由NIST(美國國家標(biāo)準(zhǔn)技術(shù)研究所)設(shè)計的一種能夠產(chǎn)生160比特的散列值的單向散列函數(shù)。現(xiàn)在已不推薦使用。SHA-256、SHA-384、SHA512都是由NIST設(shè)計的單向散列函數(shù),它們的散列值長度分別為256比特、384比特、和512比特。這些單向散列函數(shù)合起來統(tǒng)稱SHA-2。目前SHA-1已經(jīng)被攻破,2還是安全的。
【 雙向加密】
雙向加密是加密算法中最常用的,一方將明文數(shù)據(jù)進行加密,另外一方可以使用一定的手段如算法和密鑰,將密文還原為明文數(shù)據(jù),所以稱之為雙向的。
雙向加密里又分為對稱加密和非對稱加密。
1、 對稱加密(Symmetric Key Encryption)
對稱加密使用一個密鑰,給定一個明文和一個密鑰,加密產(chǎn)生密文,其長度和明文大致相同。解密時,使用的密鑰與加密密鑰相同。
在對稱加密中,分為分組加密和序列密碼。
▲序列密碼
流加密(stream cyphers),一次加密明文中的一個位。是指利用少量的密鑰(制亂元素)通過某種復(fù)雜的運算(密碼算法)產(chǎn)生大量的偽隨機位流,用于對明文位流的加密。解密是指用同樣的密鑰和密碼算法及與加密相同的偽隨機位流,用以還原明文位流。
▲ 分組加密
塊加密(block cyphers),一次加密明文中的一個塊。是將明文按一定的位長分組,明文組經(jīng)過加密運算得到密文組,密文組經(jīng)過解密運算(加密運算的逆運算),還原成明文組。
TODO 這兩者的比較補充一下,流加密講的太少了,這個東西材料也不多。
分組加密又有四種不同的模式,分別如下:
? 電子密碼本模式 Electronic Code Book(ECB)
這個是最簡單的模式,就是將原來的明文給按照固定的長度(也就是密鑰的長度)給拆開來,然后用相同的密鑰進行加密。
缺點是只適合加密小消息,如果明文塊重復(fù)的多,密文里也會有很多的重復(fù),它的明文和密文的對應(yīng)關(guān)系是一致的。

? 加密塊鏈模式 Cipher Block Chaining(CBC)
前面一個加密塊輸出的密文與下一個要加密的明文塊進行異或操作,將計算結(jié)果再用密鑰進行加密得到密文。這是一個迭代的過程,所以會在開頭需要一個初始的向量。這個的優(yōu)勢就是密文和明文不再是一一對應(yīng)的關(guān)系,每個相同的明文都摻雜了不同的向量。

? 加密反饋模式 Cipher Feedback Mode(CFB)
首先就是你自己有一個iv初始向量,對整個iv進行加密,然后取前面的高n位,與明文塊的前n位進行異或操作,得到了n位的密文塊0。然后這個被傳入到下一個加密的操作中,首先將原來的iv左移n位,右邊空出來的位置,就放密文塊0,如此反復(fù)。

? 輸出反饋模式 Output Feedback Mode(OFB)
這個和CFB很類似,唯一的區(qū)別就是填入的是K的高n位,而不是前一個密文塊的內(nèi)容。

2、非對稱加密(Asymmetric Key Encryption)
公開密鑰加密(Public-key cryptography),也稱為非對稱加密(asymmetric cryptography),是密碼學(xué)的一種算法,它需要兩個密鑰,一個是公開密鑰,另一個是私有密鑰;一個用作加密的時候,另一個則用作解密。使用其中一個密鑰把明文加密后所得的密文,只能用相對應(yīng)的另一個密鑰才能解密得到原本的明文;甚至連最初用來加密的密鑰也不能用作解密。由于加密和解密需要兩個不同的密鑰,故被稱為非對稱加密。
? 公鑰(Publish Key)加密,私鑰(Private Key)解密
這個過程就相當(dāng)于是A和B要通信,B把公鑰發(fā)給A,或者直接公開在網(wǎng)上,你要給我發(fā)消息,就請用密鑰C來加密,然后B收到加密后的消息c(x)后,就用自己的私鑰來解密,得到實際的明文消息x。
比喻成數(shù)學(xué)公式,就是【d(c(x)) = x】,d就是私鑰,只有接收者自己知道。
? 私鑰(Private Key)加密,公鑰(Publish Key)解密
你自己發(fā)一個消息的時候,用你的私鑰去加密這個消息,然后將你的公鑰公開給所有人,任何人都可以用這個公鑰來解密你的消息。解不開說明私鑰不對,也就是相當(dāng)于,要證明這個消息是你發(fā)的,就是用公鑰解開密文。
接收方可以通過此來判斷消息途中是否有被篡改,也可防止用戶抵賴,所以這個也被稱之為數(shù)字簽名,因為只有你才能把明文a加密成b,且b可以被公鑰解密出來得到明文a,能夠做到這件事情的只有你,其他人都不行。
以上的兩種非對稱加密的方式,更合適在互聯(lián)網(wǎng)環(huán)境下使用,若采用對稱加密, 你無法去保證傳輸密鑰的過程的安全性。
---文末彩蛋---
? 常見的加密算法: TODO
? 證書: TODO
? 加密算法思維導(dǎo)圖: TODO 這邊自己畫一張圖上去
? SSL: TODO 這個可以補充一下啊,尤其是openssl,感覺有好多可以扯的
? 國密算法:
放到下一章節(jié)去,這邊字數(shù)不夠了,這一篇叫,國密預(yù)告,熱身篇
? 參考鏈接
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
作者:小小偉