一、前言
在了解加密原理前,我們來(lái)看看這樣一個(gè)故事。
小紅和小明是情侶,一天,小紅給小明發(fā)短信說(shuō):“親愛(ài)的,我銀行卡上沒(méi)有錢(qián)了,你給我轉(zhuǎn)1萬(wàn)塊錢(qián)吧。”有過(guò)上當(dāng)受騙經(jīng)歷的人都知道這有可能是小偷偷了小紅手提包,然后拿手機(jī)發(fā)的短信。不過(guò)我們小明學(xué)過(guò)加密原理,于是他回復(fù)說(shuō):“你直接拿我的銀行卡刷吧,密碼加上我們第一次約會(huì)的日期就是663156。”很明顯,只有小明和小紅知道他們第一次約會(huì)是什么時(shí)候,假設(shè)是2008年4月1號(hào),那么小紅就可以根據(jù)計(jì)算663156-200841=462315得到銀行卡密碼,就可以消費(fèi)了。
這就是加密的本質(zhì),將信息與密鑰相加得到加密后的信息。只有知道密鑰的人才能解密。
二、什么是秘鑰
既然加密需要密鑰,那么密鑰是什么呢?
密鑰是作用于加密時(shí)的一串密碼,通過(guò)密鑰進(jìn)行信息加密,傳輸,到達(dá)接收者和監(jiān)聽(tīng)者,由于接收者也有密鑰,所以接收者可以根據(jù)密鑰進(jìn)行解密。從而防止通訊信息泄露。
三、什么是對(duì)稱(chēng)加密
前言講的故事就是一個(gè)對(duì)稱(chēng)式加密,小明和小紅都知道第一次約會(huì)的日期。所以傳統(tǒng)的對(duì)稱(chēng)式加密需要通訊雙方都保存同一份密鑰,通過(guò)這份密鑰進(jìn)行加密和解密。所以非對(duì)稱(chēng)加密也稱(chēng)為單密鑰加密。
對(duì)稱(chēng)加密的優(yōu)勢(shì)在于加解密速度快,但是安全性較低,密鑰一旦泄露,所有的加密信息都會(huì)被破解。同時(shí)密鑰的傳輸和保密也成為難題。為了解決密鑰傳輸?shù)膯?wèn)題,出現(xiàn)通過(guò)密鑰交換建立共享密鑰的技術(shù)。具體如何建立共享密鑰呢?我們往下看。
3.1建立共享密匙
在小明、小紅和小偷的三人世界中,由于小明是學(xué)過(guò)加密原理的,知道迪菲–赫爾曼密鑰交換(Diffie-Hellman Key Exchange),所以他知道如何建立共享密鑰。
3.1.1顏料混合把戲:
接下來(lái)我們看看如何通過(guò)顏料混合把戲建立共享密鑰吧。
假設(shè)在房間中有小明、小紅和小偷三個(gè)人,每個(gè)人各自擁有相同顏色的顏料。在房間的正中間也有這些顏料。接下來(lái),小明要和小紅建立共享密鑰了。此時(shí),小明對(duì)大家說(shuō):“我要用藍(lán)色。”然后小明從自己的顏料里選擇了黃色,這個(gè)黃色就是小明的私鑰,小紅和小偷都不知道。小明將自己的私鑰黃色與公鑰藍(lán)色混合后,得到了一種不能分解的顏色,我們就叫“小明-藍(lán)色”吧(雖然大家都知道黃+藍(lán)變綠,但是這里我們?yōu)榱酥朗钦l(shuí)的混合色,還是以名字加公鑰顏色來(lái)稱(chēng)呼),然后小明將“小明-藍(lán)色”公布了出來(lái)。同樣,小紅聽(tīng)到了小明說(shuō)用藍(lán)色后,也選擇了自己的私鑰紅色與公鑰藍(lán)色混合,得到了“小紅-藍(lán)色”并公布了出來(lái)。
此時(shí),房間中小明、小紅、小偷三人都知道了幾個(gè)信息。
1.他們都用了藍(lán)色
2.小明公布了“小明-藍(lán)色”(小紅和小偷不知道是什么顏料與藍(lán)色的混合)
3.小紅公布了“小紅-藍(lán)色”(小紅和小偷不知道是什么顏料與藍(lán)色的混合)
接下來(lái),見(jiàn)證奇跡的時(shí)刻到了,小明拿到“小紅-藍(lán)色”與自己的私鑰“黃色”混合,得到“小紅-藍(lán)色-小明”的新顏料。同樣的,小紅拿到“小明-藍(lán)色”與自己的私鑰“紅色”混合,得到“小明-藍(lán)色-小紅”。大家發(fā)現(xiàn)了嗎?“小紅-藍(lán)色-小明”和“小明-藍(lán)色-小紅”是一模一樣的顏色。而小偷不知道小明和小紅的私鑰顏色,無(wú)法混合出與他們相同的顏色。
至此,共享密鑰建立起來(lái)了。在了解了共享密鑰的建立過(guò)程后,我們將告別實(shí)體顏料,采用數(shù)字的方式來(lái)建立共享密鑰。
注:大家可能想到了,小偷可以根據(jù)自己的顏料與公鑰“藍(lán)色”混合,嘗試得出“小明-藍(lán)色”和“小紅-藍(lán)色”。這樣的方法稱(chēng)之為窮舉法,也就是嘗試所有的可能性,進(jìn)行信息破解,所以加密算法在理論上都是可以通過(guò)窮舉法破解的,只不過(guò)實(shí)際上,超級(jí)計(jì)算機(jī)都需要計(jì)算萬(wàn)億年才能窮舉出所有可能性。
3.1.2乘法把戲:
首先,我們假設(shè)乘法如同顏料混合一樣,是不能分解的,看看如何用乘法與數(shù)字建立共享密鑰。
小明公開(kāi)了一個(gè)數(shù)字5,然后小明選擇了一個(gè)私人數(shù)字4,然后利用乘法將兩者混合起來(lái),得到“小明-5”(20),接下來(lái)小紅也選擇了一個(gè)私人數(shù)字7得到“小紅-5”(35),小明拿到35*4=140,小紅拿到20*7=140。共享密鑰建立完成。
大家也發(fā)現(xiàn)了,小偷知道20,35,5這三個(gè)數(shù)字后,用除法就能算出小明和小紅的私鑰。所以,接下來(lái)我們將了解實(shí)際使用中的如何使用乘法把戲來(lái)防止私鑰被計(jì)算出來(lái)的。
3.2迪菲–赫爾曼密鑰交換算法
我們都知道冪運(yùn)算,但是要讓計(jì)算機(jī)計(jì)算就比較難了。所以,我們會(huì)用冪運(yùn)算作為建立共享密鑰的乘法把戲。同時(shí),我們還要了解鐘算的原理,這里的鐘可以理解成我們經(jīng)??吹降臅r(shí)鐘,我們常見(jiàn)的時(shí)鐘最大是12,如果當(dāng)前是10點(diǎn),過(guò)了4個(gè)小時(shí)后,就變成了下午2點(diǎn)。也就是(10+4)mod12=2。了解了鐘算和冪運(yùn)算后,就開(kāi)始進(jìn)入正題吧。
還是小明、小紅和小偷的房間,小明聲明了鐘為11,冪運(yùn)算的底為2,接下來(lái)小明和小紅分別選擇了自己的私鑰4和7。
第一步,小明混合自己的“小明-11,2”得到,小紅混合自己的“小紅-11,2”得到。
第二步,小明拿到“小紅-11,2”(7)進(jìn)行計(jì)算,小紅拿到“小明-11,2”(5)進(jìn)行計(jì)算。
大家注意到了嗎,小明和小紅建立了共享密鑰3,而小偷無(wú)法根據(jù)已知的11,2,5,7這幾個(gè)數(shù)字計(jì)算出密鑰或小明小紅的私鑰。有了共享密鑰后,小明和小紅就可以安全進(jìn)行加密傳輸了。
迪菲-赫爾曼密鑰交換
3.3 AES對(duì)稱(chēng)加密過(guò)程
AES的全稱(chēng)是Advanced Encryption Standard,是最流行的對(duì)稱(chēng)加密算法,其加解密速度快。AES支持128位,192位,256位三種長(zhǎng)度的密鑰,密鑰越長(zhǎng)安全性越高。AES加密時(shí)會(huì)把明文切分成許多小塊的明文,然后對(duì)每塊明文單獨(dú)加密,將加密后的密文傳送出去,接收方再將密文切塊解密,得到明文。如下圖所示:
AES加密原理
上一步中小明和小紅已經(jīng)協(xié)商好了密鑰3。接下來(lái)就可以通過(guò)對(duì)稱(chēng)加密進(jìn)行通信了。
在小明、小紅和小偷的房間中,小明想把密碼“462315”告訴小紅,于是:
第一步:將密碼按照一位的長(zhǎng)度進(jìn)行切分(實(shí)際中通常按128位進(jìn)行切分);就變成了“4”“6”“2”“3”“1”“5”;
第二步:對(duì)每塊明文通過(guò)密鑰3進(jìn)行加密,結(jié)果就是“795648”,然后小明告訴小紅和小偷:“我的密碼是795648”;
第三步:小紅拿到密文后,對(duì)密文進(jìn)行切塊,對(duì)每塊通過(guò)密鑰3進(jìn)行解密,就得到了正確的密碼“462315”,而小偷由于不知道密鑰,就無(wú)法解密出正確的信息。
四、什么是非對(duì)稱(chēng)加密
在對(duì)稱(chēng)加密中,加密和解密使用的是同一份密鑰。所以,在非對(duì)稱(chēng)加密中,加密和解密使用的是不同的密鑰。非對(duì)稱(chēng)加密中的密鑰分為公鑰和私鑰。公鑰顧名思義就是公開(kāi)的,任何人都可以通過(guò)公鑰進(jìn)行信息加密,但是只有用戶私鑰的人才能完成信息解密。非對(duì)稱(chēng)加密帶來(lái)了一個(gè)好處,避免了對(duì)稱(chēng)式加密需要傳輸和保存同一份密鑰的痛苦。
現(xiàn)在最流行的非對(duì)稱(chēng)加密算法就是RSA加密算法,具體是怎么做的呢,我們繼續(xù)往下看。
3.3 RSA加密過(guò)程
維基百科是這么解釋的:RSA加密算法是一種非對(duì)稱(chēng)加密算法,在公開(kāi)密鑰加密和電子商業(yè)中被廣泛使用。RSA是由羅納德·李維斯特(Ron Rivest)、阿迪·薩莫爾(Adi Shamir)和倫納德·阿德曼(Leonard Adleman)在1977年一起提出的。當(dāng)時(shí)他們?nèi)硕荚诼槭±砉W(xué)院工作。RSA就是他們?nèi)诵帐祥_(kāi)頭字母拼在一起組成的。
前面我們講了如何通過(guò)鐘算和冪函數(shù)建立不可逆(計(jì)算機(jī)可以通過(guò)窮舉法計(jì)算出私鑰,實(shí)際場(chǎng)景中就算是超級(jí)計(jì)算機(jī)也要計(jì)算幾萬(wàn)億年之久)的共享密鑰。由于小紅是小明的女朋友,小明天天在小紅面前給她講RSA加密算法的原理,所以小紅也知道怎么得出自己的公鑰和私鑰。接下來(lái)我們一起跟著小紅的腳步,看看RSA加密的公鑰和私鑰是怎么計(jì)算出來(lái)的。
第一步:小紅選擇了兩個(gè)很大的質(zhì)數(shù)p和q,這里為了便于計(jì)算,選擇2和11;
第二步:計(jì)算p和q的乘積n=p*q=2*11=22;
第三部:計(jì)算n的歐拉函數(shù)φ(n)=(p-1)*(q-1)=10;
第四步:選擇一個(gè)小于φ(n)且與φ(n)互質(zhì)的整數(shù)e,,這里選擇e=7;
第五步:計(jì)算e對(duì)于φ(n)的模反元素(ed modeφ(n)=1)d,d=3
到這里小紅就得到了他自己的公鑰(n,e)和私鑰(n,d)。其中n就是鐘大小,e和d就是冪函數(shù)的冪。接下來(lái)就通過(guò)計(jì)算出來(lái)的公鑰和私鑰進(jìn)行數(shù)據(jù)的加解密。
還是小明、小紅和小偷三個(gè)人,小紅對(duì)大家說(shuō),我的公鑰是(22,7),小明知道了小紅的公鑰后,想講自己的信息“14”告訴小紅,于是就用小紅公開(kāi)的公鑰進(jìn)行加密。
具體步驟如下:
第一步:小明根據(jù)要加密的信息14進(jìn)行計(jì)算,得到加密后的信息20,然后將20告訴小紅和小偷;
第二步:小紅有自己的私鑰,將加密信息20進(jìn)行解密,,得到了小明想傳遞給小紅的信息。而小偷呢,知道22,7,20,但是不知道小紅的密鑰(22,3),無(wú)法解密出正確的信息。
RSA加密算法在數(shù)字簽名中也發(fā)揮著巨大的作用,假設(shè)小偷可以假冒小紅,說(shuō)小紅的公鑰是(22,9),而小明不知道是小偷假扮的,按照小偷的公鑰加密后,結(jié)果被小偷解密了。數(shù)字簽名的作用就是防止信息被篡改,小紅說(shuō)她的公鑰是(22,7)的同時(shí),使用私鑰給這段信息(通常使用MD5值計(jì)算簽名)加上簽名,小明得到公鑰(22,7)和簽名13,小明拿到簽名后利用公鑰計(jì)算出信息是否被篡改。
五、加密的實(shí)際作用
本文使用的很小的數(shù)來(lái)進(jìn)行加密原理的講解,為了是讀者可以方便進(jìn)行計(jì)算。在實(shí)際使用中(n,e)都是特別大的數(shù),其中n的長(zhǎng)度都在768以上,1024長(zhǎng)度被認(rèn)為是基本安全的。
(1230186684530117755130494958384962720772853569595334792197322452151726400507263657518745202199786469389956474942774063845925192557326303453731548268507917026122142913461670429214311602221240479274737794080665351419597459856902143413=
33478071698956898786044169848212690817704794983713768568912431388982883793878002287614711652531743087737814467999489
×
36746043666799590428244633799627952632279158164343087642676032283815739666511279233373417143396810270092798736308917)
六、總結(jié)
最后總結(jié)一下,首先我們通過(guò)一個(gè)詐騙短信的例子,引出了加密的原理就是信息+密鑰,密鑰就是對(duì)信息進(jìn)行加解密的一串?dāng)?shù)字。然后通過(guò)顏料混合把戲形象的演示了如何建立共享密鑰。在使用乘法建立共享密鑰的過(guò)程中,學(xué)習(xí)了鐘算和冪運(yùn)算,接著我們了解了RSA加密算法的過(guò)程,通過(guò)兩個(gè)質(zhì)數(shù)生成公鑰和私鑰,最后,我們根據(jù)公鑰進(jìn)行信息加密,再通過(guò)私鑰完成信息解密。
七、寫(xiě)在最后
或許看到這里,大家心里還有許多疑惑。為什么小明和小紅建立共享密鑰時(shí),通過(guò)幾次冪運(yùn)算和鐘算就能得到一樣的共享密鑰?為什么RSA加密算法要用兩個(gè)質(zhì)數(shù)?為什么通過(guò)公鑰加密的信息可以通過(guò)私鑰解開(kāi)?
加密算法的背后,是一道道迷人的數(shù)學(xué)難題,而RSA加密算法之所以被廣泛運(yùn)用,是因?yàn)橐粋€(gè)名為整數(shù)分解的古老數(shù)學(xué)問(wèn)題,你可以輕易找到兩個(gè)很大的質(zhì)數(shù)相乘得到一個(gè)結(jié)果n,但是要將這個(gè)結(jié)果n分解回兩個(gè)質(zhì)數(shù)就變得極其困難。盡管這個(gè)所謂的“整數(shù)分解”問(wèn)題被研究了數(shù)個(gè)世紀(jì),還沒(méi)人能找到一個(gè)足夠高效的通用方法解決它,并對(duì)標(biāo)準(zhǔn)RSA鐘大小造成危害。
數(shù)學(xué)史中充滿了未解決的問(wèn)題,盡管這些迷人的問(wèn)題缺乏任何實(shí)際應(yīng)用,卻單靠其美學(xué)特質(zhì)就吸引了數(shù)學(xué)家進(jìn)行深入探究。令人頗感驚訝的是,許多這類(lèi)迷人但顯然無(wú)用的問(wèn)題后來(lái)都有了很大的實(shí)用價(jià)值,這一價(jià)值只有在問(wèn)題被研究數(shù)個(gè)世紀(jì)后才得以破解。整數(shù)分解這一問(wèn)題由來(lái)已久。對(duì)其最早的嚴(yán)肅研究似乎是在17世紀(jì),由數(shù)學(xué)家費(fèi)馬(Fermat)和梅森(Mersenne)進(jìn)行的。歐拉(Euler)和高斯(Gauss)兩位數(shù)學(xué)“泰斗”也在接下來(lái)的世紀(jì)里對(duì)這一問(wèn)題做出了貢獻(xiàn)。但直到公鑰加密于20世紀(jì)70年代被發(fā)明,分解大數(shù)字的困難才成為一個(gè)實(shí)際應(yīng)用的關(guān)鍵。