小朋友都能懂的計算機算法 - 加解密
電話手表
小明最近很開心,
媽媽給他買了一塊電話手表。
他的好朋友小輝早就有電話手表了。
小明在科學(xué)課上覺得有點無聊,
就悄悄用電話手表給小輝發(fā)消息,
二人你來我往,
上課又開始變得有意思了。

小明放學(xué)回家,
媽媽一臉嚴肅的說:
辣條好吃嗎?
小明被問了個措手不及:
我,他,你,那個,這個…. 沒有??!
小明心里想,
不應(yīng)該啊,
難道發(fā)消息還被監(jiān)控了?
又大又壞的網(wǎng)絡(luò)世界
小明以為他和小輝之間發(fā)消息是這樣的:

實際發(fā)消息的過程是這樣的,
實際上還要復(fù)雜的多:

這個“買辣條”的重大消息,
中間經(jīng)過了數(shù)十上百個節(jié)點的中轉(zhuǎn),
最后才到達小輝的手機上。
這其中的每一個中轉(zhuǎn)節(jié)點都能看到這條消息,
而恰好其中一個中轉(zhuǎn)節(jié)點是電話手表廠的,
而電話手表廠悄悄的把消息轉(zhuǎn)給了媽媽。
還好是媽媽,
都是為了你好!
但這是一個又大又壞的網(wǎng)絡(luò)世界,
網(wǎng)絡(luò)上有無數(shù)的壞的中轉(zhuǎn)節(jié)點,
隨時想要截獲你的消息,
比如銀行密碼,
比如支付寶賬號等等。
那該怎么辦呢?
這可是至關(guān)重要的,
現(xiàn)在我們每天都離不開網(wǎng)絡(luò)了。
所以不管你是不是計算機行業(yè)的,
不管你是大朋友還是小朋友,
都應(yīng)該學(xué)習一點密碼學(xué)知識,
增強自己的防騙能力。
這些密碼學(xué)知識看似高深,
其實都來源于生活,
也很容易懂。
傳紙條
小明和小輝知道了電話手表通話并不安全,
于是他們決定用新辦法 - 傳紙條!
這次他們要討論一下周六幾點去買辣條。
但是這個時間不能被其他同學(xué)知道,
否則他們可能會來搶辣條,
總之不能讓他們知道幾點去買!

但傳紙條的過程必須要經(jīng)過其他同學(xué)。
于是他們決定給紙條的內(nèi)容加密!
紙條上就寫著一個數(shù)字,

這表示18點去買辣條。
但如果就這么把紙條傳過去,
必然被其他同學(xué)知道,
到時候他們來搶辣條就不好了!
于是他們決定給數(shù)字加密,
加密方法很簡單,
就是給這個數(shù)字加上小明的年齡11,
那么紙條上的數(shù)字不再是18,
而成了29。
18 + 11 = 29
小明在紙條上寫了29:

小輝看到以后把29減去11就得到了18。
29 - 11 = 18
而其他同學(xué)并不知道需要減去11,
所以不知道29是什么意思,
也猜不出小明他們是18點去買辣條。
對稱加密
這就是最簡單的加密算法。
因為這種算法加密和解密過程都要用到同一個數(shù)字,
這種算法被稱為對稱加密算法,
這個用來加解密的數(shù)字被稱為秘鑰,
要發(fā)送的內(nèi)容(18)被稱為明文,
加密后的內(nèi)容(29)被稱為密文。

這個過程很簡單:
發(fā)送者把明文使用秘鑰加密成密文
接受者通過同一個秘鑰把密文再轉(zhuǎn)成明文
這個過程很簡單,
但有個關(guān)鍵點:
小明和小輝必須都知道這個秘鑰11,
而其他同學(xué)必須不知道這個秘鑰
否則這個加密就沒用了。
不要小看這個對稱加密算法,
這個算法現(xiàn)在使用極其廣泛,
你幾乎每天都在使用!
雖然真正使用的秘鑰和算法不會像11這么簡單,
但思路和道理是完全一樣的。
這些復(fù)雜的對稱算法中最出名的叫做AES,
英文名是Advanced Encryption Standard,
中文名是高級加密標準。
這個算法的秘鑰可不是簡單的11,
而是一個128,192或者256位的二進制數(shù)字,
它的算法也不是簡單的加上秘鑰,
而是先把明文分割成一個個小塊,
再對這些塊經(jīng)過10或者14道各種運算最后才得到密文,
這個密文可以用同一個秘鑰再計算出明文。
中間的網(wǎng)絡(luò)節(jié)點拿到的數(shù)據(jù)是完全混亂的,
在不知道秘鑰的情況下如果想要破解明文,
需要多長時間呢?
我們來算一下:
假設(shè)秘鑰長度是256,
它的組合一共有2的256次方,
這個數(shù)字大的超出你想象!
轉(zhuǎn)換成10進制以后是:

也就是說要猜出秘鑰需要嘗試這么多次,
就算用超級計算機,
每秒可以猜測20億億次,
都上猜上最少幾十億年的時間,
那時候太陽系都完蛋啦!
這么看AES是很安全的,
這個世界得救了!

等一等,還有一個很關(guān)鍵的問題沒解決,
如果秘鑰被人竊取了就沒有安全可言了,
有秘鑰的中間節(jié)點可以用秘鑰輕松解密!
如何在發(fā)送者和接受者之間傳遞秘鑰呢?
在計算機網(wǎng)絡(luò)上,
沒辦法讓兩臺電腦之間說悄悄話交換秘鑰。
必須有一個方法,
可以讓兩者之間安全的傳遞秘鑰,
而不被中間節(jié)點猜出來秘鑰是什么!
怎么辦?
兩把鑰匙
怎么解決傳遞秘鑰的問題呢?
后來有了解決方法,
我們現(xiàn)在來玩一個游戲:
你在心里想一個3位數(shù),
把這個3位數(shù)乘以91,
然后告訴我結(jié)果的后3位,
我就能算出你心里想的數(shù)字!
信不信?
我們來試一下:
假設(shè)你在心里想了365,
365 x 91 = 33215,
你把 215 告訴我。
從常規(guī)思路去看,
根本沒辦法從215猜出365來!
但是我能:
215 x 11 = 2365
你心里想的就是就是結(jié)果的后3位365!
是不是很神奇?
你可以心里多想幾個3位數(shù)試試看!
哪里冒出來的11?
原理其實也簡單,這是一個數(shù)學(xué)問題。
91 x 11 = 1001
任何1個3位數(shù)乘以1001得到的結(jié)果的后3位都是它自己, 因為1001的后3位是001, 任何1個3位數(shù)乘以1都是它自己!
我把1001分解成了 91 x 11 這兩個數(shù)
我把 91 公開給了你,但是 11 自己秘密保留!
你把心里想的數(shù)字先乘以 91,告訴了我后3位, 只要后3位就夠了,因為前面的位數(shù)不會影響后3位的值,
所以我用你給我的后 3 位再乘以 11 就相當于乘以了 1001
得到的結(jié)果的后 3 位就是你最初想的那個 3 位數(shù)字!
好神奇啊??!
在這里我有兩把鑰匙,
分別是 91和 11,
我把 91公開給所有人,
任何人想要發(fā)消息給我就按照上面的方法加密,
只有我才能用第二把秘密鑰匙11算出你要發(fā)的消息,
別人就算看了我的小紙條也是不可能算出消息內(nèi)容的!
用同樣的方法,
我們可以構(gòu)造出更大更復(fù)雜的鑰匙對,
也不用局限于3位數(shù),
比如我們可以用
19801 x 20201 = 400000001
構(gòu)造出末8位都不會變的加密系統(tǒng),
其中19801和20201構(gòu)成一對鑰匙!
這個方法有點類似于家門口的快遞箱,
任何一個人都可以往箱子里塞入快遞,
但是只有有鑰匙的人可以打卡快遞箱拿到快遞!
區(qū)別是發(fā)送快遞并沒有用公開的鑰匙加密。

這是一個偉大的發(fā)現(xiàn),
這個方法現(xiàn)在應(yīng)用非常廣泛,
可以說是互聯(lián)網(wǎng)加密的基石!
只不過具體實現(xiàn)比我們上面的例子要復(fù)雜的多,
它們可能不是用簡單的乘法,
而是用更復(fù)雜的指數(shù)運算,取模運算等!
非對稱加密
上面的加密方法有兩把??,
第一把??用來加密,
而只有第二把??才能解密,
所以這種方法被稱為非對稱加密。
和前面的對稱加密方法明顯不同,
對稱加密是同一把??用來加密和解密,
這個??決不能公開,
只有發(fā)送者和接受者知道!
而非對稱加密有兩把??,
第一把是公開的,
第二把也是絕對不能公開的,
一旦公開了別人就可以破解密文了。
非對稱加密也被稱為公鑰加密,
因為它的重要性,
本文就用了公鑰加密作為標題!
1976兩位美國的科學(xué)家首先提出這個算法,
他們是Whitfield Diffie 和 Martin Hellman:

他們發(fā)明了Diffie-Hellman密鑰交換算法。
1977年另外三位科學(xué)家,
Rivest、Shamir 和 Adleman,
用類似的原理發(fā)明了一種新的算法。

這種算法用他們3人的名字首字母命名,
叫做RSA算法,

他們還申請了專利,
誰要用這個算法都要給他們錢,
好在每個發(fā)明專利只有20年的有效期,
他們的專利在2000年已經(jīng)失效,
現(xiàn)在地球人都可以免費的使用這個算法啦!
這兩種算法都是公鑰加密算法,
公鑰加密算法使用非常廣泛,
大家經(jīng)常上的淘寶、京東都用了公鑰加密,
這兩年火起來的區(qū)塊鏈技術(shù)更是基于公鑰加密。
你懂了嗎?
對稱加密算法和非對稱加密算法!
