偷襲珍珠港得手後,山本五十六決定偷襲中途島。
他派出四條先鋒航母,航母指揮官們踮起腳尖,舉起望遠鏡,爭相腦補美軍措手不及的畫面時,美軍轟炸機突然從雲裡穿出,遮住了天。
日軍措手不及,幾百架戰機還沒來得及飛、就被悶死在甲板上。
十分鐘內,先鋒航母全部噴火,王牌飛行員們直到被烤焦也沒想到,美國人早就截獲了他們的偷襲情報。
是誰走漏了風聲?
一、對稱加密的軟肋
日軍通訊密碼以複雜出名,由一萬個五位數組成,而且,太平洋戰爭期間升級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年,就已經足夠,至於進化中的問題,就讓進化本身來修補。
閱讀更多 幣圈區塊鏈技術 的文章