加密野史:從山本五十六到中本聰

加密野史:從山本五十六到中本聰

偷襲珍珠港得手後,山本五十六決定偷襲中途島。

他派出四條先鋒航母,航母指揮官們踮起腳尖,舉起望遠鏡,爭相腦補美軍措手不及的畫面時,美軍轟炸機突然從雲裡穿出,遮住了天。

日軍措手不及,幾百架戰機還沒來得及飛、就被悶死在甲板上。

十分鐘內,先鋒航母全部噴火,王牌飛行員們直到被烤焦也沒想到,美國人早就截獲了他們的偷襲情報。

是誰走漏了風聲?

一、對稱加密的軟肋

日軍通訊密碼以複雜出名,由一萬個五位數組成,而且,太平洋戰爭期間升級12次,看似牢不可破,卻難擋百密一疏。

這都怪美軍擊沉過一艘日本潛艇,從船艙裡撈出來一份密碼本,上面記滿密語,美軍由此洞穿日軍80%的密電,並且得知:山本五十六正計劃偷襲AF,但AF究竟在哪裡?

美軍翻到珍珠港被襲前夜的電報,山本五十六要求日本戰機從馬紹爾群島出發,注意避開AF的空中偵察。

加密野史:從山本五十六到中本聰

從地圖上看,AF只能是中途島。

為證實猜想,中途島美軍用明文假報淡水設備故障,日軍截獲情報,扭頭告訴主力部隊:帶上淡水淨化器,因為AF淡水匱乏。美軍截獲消息,確認AF就是中途島。

最終,山本五十六的全部機密像X光片一樣,攤在羅斯福總統的辦公桌上,美國未戰先勝。

物理戰場的贏家,無一不是信息戰場的勝者。就在同時,英國破譯出德軍的密碼,加速了二戰的結束。

二戰時期的國家,真正的家當不是飛機、不是航母,而應該是密碼本。當守護機密的重擔全壓在密碼本上時,卻沒有東西能守護密碼本本身,這是對稱加密的軟肋。

可二戰之後就少有密碼被破的事蹟,特別是80年代美蘇冷戰期間,兩國都使出奶勁破譯對方密電,最後卻都竹籃打水。

為什麼會這樣?這要從非對稱加密的鼻祖RSA算法說起。

二、什麼是RSA算法?

1977年,Rivest、Shamir和Adleman三位教授用名字的首字母命名一種新算法:RSA,可它居然不需要密碼本,這在當時就像吃飯不需要碗筷刀叉。

為什麼會那樣清新脫俗?關鍵在於RSA把密碼本拆分成公鑰和私鑰:公鑰公開,用來加密;私鑰私藏,用來解密。

RSA的原理很簡單,但要先回憶三個初中數學小概念:質數、互質和取模。

質數只能被它本身和1整除的自然數。比如:2、3、5、7、11、13、17……即:我們沒法把一個質數拆成兩個自然數之積。

互質:公約數只有1的兩個正整數,比如:5和72互質。

取模:即除法中的餘數,運算符是mod,比如7 ÷ 3 = 2餘1,所以,7 mod 3 = 1。

RSA用四步設定密鑰(公鑰和私鑰):

1、找兩個質數P和Q,P和Q相乘得到Max,即 Max = P × Q

2、把兩個質數分別減1,相乘得到M,即 M = (P-1) × (Q-1)

3、找一個正整數E,使E與M互質,且 E<M

4、找一個正整數D,使D × E 除以M餘1,即(D × E) mod M = 1

E是公鑰,加密就是讓原文自乘(E-1)次,得到密文。

D是私鑰,解密就是讓密文自乘(D-1)次,得到原文。

我們挑兩個質數:P=7, Q=13

Max = P × Q = 91

M = (P-1) × (Q-1) = 72

隨機選公鑰E=5,因為5與72互質,且5小於72

找到私鑰D=29,因為5 × 29 ÷ 72 餘 1

如果,你想把字符C傳給你朋友,怎麼加密才能抵抗破解?

字符C在ASCII碼中對應的數字是67,加密原理很簡單:

把原文67自乘4次(E-1次),注意:當自乘結果超過Max(Max = 91)時,需將結果取模後再乘。

活體演示:

原文67自乘第1次:

67 × 67 = 4489 > 91

所以,4489 mod 91 = 30

把上一步的結果30拿過來,自乘第2次:

30 × 67 = 2010 > 91

所以,2010 mod 91 = 8

自乘第3次:

8 × 67 = 536 > 91

所以,536 mod 91 = 81

自乘第4次:

81 × 67 = 5427 > 91

所以,5427 mod 91 = 58

自乘4次之後,加密結束,得到密文58。查ASCII碼錶,58對應” : “,把“ : ”發出去,即使被截獲,也不會洩露信息,因為對方沒有私鑰,解不了密。

那麼,掌握私鑰的人如何解密?

很簡單,類似於加密,解密是用密文58自乘28次(D-1次),但每次相乘結果超過Max時,需取模後再乘:

密文58自乘第1次:

58 × 58 = 3364 > 91

所以,3364 mod 91 = 88

把上一步結果88拿過來,自乘第2次:

88 × 58 = 5104 > 91

所以,5104 mod 91 = 8

照葫蘆畫瓢,第3次:

8 × 58 = 464 > 91

所以,464 mod 91 = 9

第4次:

9 × 58 = 522 > 91

所以,522 mod 91 = 67

第5次:

67 × 58 = 3886 > 91

所以,3886 mod 91 = 64

第6次:

64 × 58 = 3712 > 91

所以,3712 mod 91 = 72

第7次:

72 × 58 = 4176 > 91

所以, 4176 mod 91 = 81

第8次:

81 × 58 = 4698 > 91

所以, 4698 mod 91 = 57

第9次:

57 × 58 = 3306 > 91

所以, 3306 mod 91 = 30

第10次:

30 × 58 = 1740 > 91

所以,1740 mod 91 = 11

第11次:

11 × 58 =638 > 91

所以, 638 mod 91 = 1

第12次:

1 × 58 = 58 < 91

58 < 91,所以不用取模,直接把58拖下來乘

第13次 :

58 × 58 =3364 > 91

所以, 3364 mod 91 = 88

我們發現,從第13次開始重複第1次結果:

第14次:8

第15次:9

第16次:67

第17次:64

第18次:72

第19次:81

第20次:57

第21次:30

第22次:11

第23次:1

第24次:58

第25次:88

第26次:8

第27次:9

第28次:67

解密完成,67就是原文。

我們發現,解密過程出現兩道輪迴,實際只有12種可能,而且存在密文與原文相同的情形(第12次),那是因為我們用的是小質數:7和13,現實中的質數稍微大一點:

P =

3388495837466721394368393204672181522815830368604993048084925840555281177

Q =

11658823406671259903148376558383270818131012258146392600439520994131344334162924536139

Max = P × Q =

39505874583265144526419767800614481996020776460304936454139376051579355626529450683609727842468219535093544305870490251995655335710209799226484977949442955603

選用大質數後,解密過程出現的可能性將超千億,概率上不支持破解者發現規律。

另一方面,破解密文的唯一方式是破解密鑰,而Max和公鑰是公開信息,於是,破解私鑰唯一的方法是從Max中分解出P和Q。

已知P和Q計算乘積,普通電腦一瞬間就能算出Max,可如果想把Max拆成P和Q,那就應了一句古話:沒有耕壞的地,只有累死的牛。

我國最拉風的超級計算機神威·太湖之光,裝備4萬個處理器,佔地足足一棟別墅,拆分1個200位數字,至少要等1000年。往前推1000年,那是北宋時期,我國曆史上最善於解密的包青天年方十八。

所以,與其說是在大海撈針,不如說是在太陽系中排查一顆原子,撞上大運的概率比原子還小。

正算容易倒推難,這在密碼學上稱為陷門函數(Trapdoor Function),是非對稱加密安全性的根基。陷門函數像是出站口的旋轉門:出門容易,但想進來,那只有把門拱壞一條路。

加密野史:從山本五十六到中本聰

RSA是古典和現代加密技術的分水嶺,它的誕生堪稱歷史性突破,但和其他突破一樣,隨著歷史一路顛簸,RSA身上懸掛的缺陷也開始叮噹作響。

比如:

有些算法已能拆分特定的大數,所以為求安全,人們會用更大的質數,但這樣,密鑰長度會被拉長,最終拖慢加解密速度。

用戶陷入兩難:拉長密鑰吧不便捷,不拉長密鑰不安全。總得有種更出彩的算法,才能讓人有盼頭。

於是,地平線上又升起一種新算法:橢圓曲線加密。

三、什麼是橢圓曲線加密?

橢圓曲線加密(Elliptic Curve Cryptography )即ECC,1985年由Koblitz和Miller兩位教授發明,被公認為最強的通用加密法。

和RSA一樣,ECC也是非對稱加密:公鑰加密,私鑰解密。但兩者生成公鑰和私鑰的機制不同,ECC比RSA更安全、更便捷。

為什麼?我們從一個方程說起:

y² = x³ + ax + b(a和b是常數)

即使沒在教科書裡見過,你也完全不必害怕,只要畫出來,你就會發現這不過是隻插在竹籤上的章魚。

加密野史:從山本五十六到中本聰

圖1 橢圓曲線

章魚的輪廓就是橢圓曲線,它的身體沿x軸對稱,而且,任何竹籤直插上去和章魚輪廓最多有三個交點。

如果你去查資料,你會發現ECC的公式天羅地網,任何一個公式都會纏住你,但你馬上就會知道,即使ECC看起來艱澀,但本質上不過是一局桌球遊戲,只是桌球的彈射規律有點奇怪。

我們在橢圓曲線上任選一點A開球。

1、球打向B,彈往另一交點,再折向交點與x軸的對稱點C;

2、到C後會彈向A,途經曲線交點時,球會折向交點的對稱點D;

3、到D後會沿AD方向,射向曲線與直線的另一交點,接著彈到交點的對稱點E;

加密野史:從山本五十六到中本聰

圖2 橢圓曲線(動圖)

動圖描繪的是3次撞擊過程,桌球叮叮咚咚撞n次後,停在終點。

如果你知道起點座標和撞擊次數n,就能算出終點座標。可是,這時有人跑進來,他知道起點和終點座標,如果你問他,撞擊次數n是多少?他會和球一樣愣在原地,因為真的沒法算。

撞擊次數n就是你的私鑰,一個你選的超大整數;桌球撞擊n次停下,而終點座標相當於公鑰;如果你想再做一個公鑰,那麼改變起點座標即可。

橢圓曲線方程、起點和終點座標完全公開,但計算球撞了幾次才停下來卻沒有捷徑、只能一次次試,這項事業比RSA中拆分Max的任務還要艱鉅,都能把量子計算機們累出血,這就是為什麼說ECC比RSA更安全的原因。

同樣面對228位長度的密鑰,如果破解RSA需要燒開一勺水的能量,那麼破解ECC所需要的能量,足以燒開地球上所有的水。

——德國數學家 Lenstra

ECC早已無處不在:我們的第二代身份證都基於ECC,美國政府部門也用ECC加密內部通信,開源瀏覽器Foxfire、谷歌的Chrome、蘋果的iMessage服務都使用ECC。

除此之外,匿名網絡Tor用ECC保護使用者隱私。中本聰曾經穿梭在各大論壇,但他的身份至今是謎,全靠Tor網絡底層的ECC。

而中本聰的業餘小發明——比特幣,也使用ECC的數字簽名算法ECDSA(Elliptic Curve Digital Signature Algorithm),不單安全性能好,而且ECDSA籤起名來要比RSA簽名快兩個數量級。準確地說,256位的私鑰用ECDSA要比2048位的RSA簽名算法快20倍,是四輪車和三輪車的差別。

儘管花好稻好,可ECC也非完美無缺。

ECC需要一些隨機數,而隨機數的產生有賴於生成器裡的“種子”,曾有人爆料:美國國家安全局(NSA)曾經對隨機數生成器動過手腳,讓破解難度大幅降低,這樣就便於特工破譯採用ECC加密的數據。

爆料者的名字叫斯諾登,他是美國稜鏡門事件的主角。

根據曝光材料,NSA開發出一條偽隨機數曲線secp256r1。可幸運的是,中本聰並沒有選擇NSA的偽隨機數曲線secp256r1,而是使用了另一條非偽隨機數曲線secp256k1,帶著比特幣躲過密碼學歷史上的一支暗箭,否則只要暴露過公鑰的人都有一定概率被NSA內部人士猜出私鑰。

結語

中本聰被公認為非對稱加密年代沖刷出來的天才,而山本五十六卻被定格在對稱加密時代,一份密碼本讓它丟的不僅是四艘航母,還有自己的命。

1943年4月18日,美國空軍穩穩擊落山本五十六的座機,解密文件顯示,美軍破譯出日軍JN25密碼本,提前獲知機密行程,讓他成為對稱加密時期最高級別的祭品。

和對稱加密相比,非對稱加密可以把秘密寫在明信片上,消滅了密碼本被破解的問題,但加密技術進化之路並非坦途,因為密碼攻防問題始終存在。

所以,並不存在絕對安全的加密方法,如果有種算法可以讓我們安全享用50年,就已經足夠,至於進化中的問題,就讓進化本身來修補。


分享到:


相關文章: