參考【philippica】萌萌噠弱受RSA和強攻wiener
想像這樣一個場景,一堆情侶,每天早上alice站在東邊的山頭,bob找在西邊的山頭,隔著大山用擴音喇叭說著羞羞臉的情話。這時候兩座山之間的山谷中總會坐著一個吃瓜群眾philippica,聽著兩個人的小秘密。alice和bob當然不喜歡被他聽到他們的情話,于是機智的alice就大聲的說:"bob,以后每次說話我們都把說的字母按著字母表順序往后數8個字母,也就是用凱撒密碼移動8位,這樣philippica就不知道我們在說什么了!"
接著bob想說:“I love u”,他按著字母表abcd的順序把字母移動了8位,變成了q twdm c,然后他大聲地喊出了這些字母,只見alice拿出小本將凱撒密碼解開后熱淚迎眶,一對情侶淚眼朦朧,在看山谷里的吃瓜八卦者philippica,它也聽到了alice說凱撒密碼移動8位,于是他放下西瓜,也拿出了筆記本算了一下,然后露出了意味深長的笑容,接著繼續吃瓜。
“這根本不起任何作用,我們說的任何加密方式philippica也會聽到,他只要用聽到的密鑰解開我們的密碼,那我們做啥都是徒勞的?!眀ob絕望的說。
alice說:“沒關系,我們有rsa,現在我告訴你一組公鑰(3233, 17) 你現在腦子里想一個0~25的數字作為凱撒密碼的移動位數,假設這個數字是m,那么你現在把m^17 Mod 3233這個結果告訴我?!?br> bob覺得現在的alice很6,所以他選擇移動位數為6,他會快速冪的方法,所以很快就把6^17 mod 3233的結果算了出來結果是824,他大聲喊出了這個數字。
alice聽到后很開心,她這里有一組私鑰:(3233,2753),她用類似的方法計算824^2753 mod 3233,結果發現是6!于是她很開心的和bob用密鑰是6的凱撒說情話了。
再看pilippica這邊,他也知道rsa密碼的流程,也聽到了兩人報的數字,他知道Bob想了一個數字m,并且m^17 mod 3233 = 824,可他沒有高效的方法去解這個方程,只能看著alice和Bob媚眼傳情,共訴情話而自己在一邊郁悶的吃瓜了。
因此rsa的本質就是找這么三個數,(e, d, n)使得對于任意的數字(在這里是指明文)m,(me)d mod n = m,接著把(e, n)公開作為公鑰,自己留著d,別人把要加密的數自乘e次后mod n,告訴自己,自己只要把發來的結果再自乘d次mod n就是原來的明文了。
一、RSA的計算過程
上述過程中,出現了公鑰(3233,17)和私鑰(3233,2753),這兩組數字是怎么找出來的呢?參考RSA算法原理(二)
首字母縮寫說明:E是加密(Encryption)D是解密(Decryption)N是數字(Number)。
1.隨機選擇兩個不相等的質數p和q。
alice選擇了61和53。(實際應用中,這兩個質數越大,就越難破解。)
2.計算p和q的乘積n。
n = 61×53 = 3233
n的長度就是密鑰長度。3233寫成二進制是110010100001,一共有12位,所以這個密鑰就是12位。實際應用中,RSA密鑰一般是1024位,重要場合則為2048位。
3.計算n的歐拉函數φ(n)。稱作L
根據公式φ(n) = (p-1)(q-1)
alice算出φ(3233)等于60×52,即3120。
4.隨機選擇一個整數e,也就是公鑰當中用來加密的那個數字
條件是1< e < φ(n),且e與φ(n) 互質。
alice就在1到3120之間,隨機選擇了17。(實際應用中,常常選擇65537。)
5.計算e對于φ(n)的模反元素d。也就是密鑰當中用來解密的那個數字
所謂"模反元素"就是指有一個整數d,可以使得ed被φ(n)除的余數為1。ed ≡ 1 (mod φ(n))
alice找到了2753,即17*2753 mode 3120 = 1
6.將n和e封裝成公鑰,n和d封裝成私鑰。
在alice的例子中,n=3233,e=17,d=2753,所以公鑰就是 (3233,17),私鑰就是(3233, 2753)。
上述故事中,blob為了偷偷地傳輸移動位數6,使用了公鑰做加密,即6^17 mode 3233 = 824。alice收到824之后,進行解密,即824^2753 mod 3233 = 6。也就是說,alice成功收到了blob使用的移動位數。
再來復習一下整個流程:
p=17,q=19
n = 1719 = 323
L = 1618 = 144
E = 5(E需要滿足以下兩個條件:1<E<144,E和144互質)
D = 29(D要滿足兩個條件,1<D<144,D mode 144 = 1)
假設某個需要傳遞123,則加密后:123^5 mode 323 = 225
接收者收到225后,進行解密,225^ 29 mode 323 = 123
二、RSA的安全性和缺點
回顧上面的密鑰生成步驟,一共出現六個數字:
p
q
n
L即φ(n)
e
d
這六個數字之中,公鑰用到了兩個(n和e),其余四個數字都是不公開的。其中最關鍵的是d,因為n和d組成了私鑰,一旦d泄漏,就等于私鑰泄漏。那么,有無可能在已知n和e的情況下,推導出d?
(1)ed≡1 (mod φ(n))。只有知道e和φ(n),才能算出d。
(2)φ(n)=(p-1)(q-1)。只有知道p和q,才能算出φ(n)。
(3)n=pq。只有將n因數分解,才能算出p和q。
結論:如果n可以被因數分解,d就可以算出,也就意味著私鑰被破解。
可是,大整數的因數分解,是一件非常困難的事情。目前,除了暴力破解,還沒有發現別的有效方法。維基百科這樣寫道:"對極大整數做因數分解的難度決定了RSA算法的可靠性。換言之,對一極大整數做因數分解愈困難,RSA算法愈可靠。假如有人找到一種快速因數分解的算法,那么RSA的可靠性就會極度下降。但找到這樣的算法的可能性是非常小的。今天只有短的RSA密鑰才可能被暴力破解。到2008年為止,世界上還沒有任何可靠的攻擊RSA算法的方式。只要密鑰長度足夠長,用RSA加密的信息實際上是不能被解破的。"
然而,雖然RSA的安全性依賴于大數的因子分解,但并沒有從理論上證明破譯RSA的難度與大數分解難度等價。即RSA的重大缺陷是無法從理論上把握它的保密性能如何。此外,RSA的缺點還有:
A)產生密鑰很麻煩,受到素數產生技術的限制,因而難以做到一次一密。
B)分組長度太大,為保證安全性,n 至少也要 600bits以上,使運算代價很高,尤其是速度較慢,較對稱密碼算法慢幾個數量級;且隨著大數分解技術的發展,這個長度還在增加,不利于數據格式的標準化。因此,使用RSA只能加密少量數據,大量的數據加密還要靠對稱密碼算法。
三、RSA的由來(數學證明過程參考原文)
參考
RSA的證明
不給力啊,老濕!”:RSA加密與破解
“不給力啊,老濕!”:RSA加密與破解
加密和解密是自古就有技術了。經??吹絺商诫娪暗臉蚨?,勇敢又機智的主角,拿著一長串毫無意義的數字苦惱,忽然靈光一閃,翻出一本厚書,將第一個數字對應頁碼數,第二個數字對應行數,第三個數字對應那一行的某個詞。數字變成了一串非常有意義的話:
Eat the beancurd with the peanut. Taste like the ham.
這種加密方法是將原來的某種信息按照某個規律打亂。某種打亂的方式就叫做密鑰(cipher code)。發出信息的人根據密鑰來給信息加密,而接收信息的人利用相同的密鑰,來給信息解密。就好像一個帶鎖的盒子。發送信息的人將信息放到盒子里,用鑰匙鎖上。而接受信息的人則用相同的鑰匙打開。加密和解密用的是同一個密鑰,這種加密稱為對稱加密(symmetric encryption)。
如果一對一的話,那么兩人需要交換一個密鑰。一對多的話,比如總部和多個特工的通信,依然可以使用同一套密鑰。但這種情況下,對手偷到一個密鑰的話,就知道所有交流的信息了。二戰中盟軍的情報戰成果,很多都來自于破獲這種對稱加密的密鑰。
為了更安全,總部需要給每個特工都設計一個不同的密鑰。如果是FBI這樣龐大的機構,恐怕很難維護這么多的密鑰。在現代社會,每個人的信用卡信息都需要加密。一一設計密鑰的話,銀行怕是要跪了。
對稱加密的薄弱之處在于給了太多人的鑰匙。如果只給特工鎖,而總部保有鑰匙,那就容易了。特工將信息用鎖鎖到盒子里,誰也打不開,除非到總部用唯一的一把鑰匙打開。只是這樣的話,特工每次出門都要帶上許多鎖,太容易被識破身份了??偛坷洗笙肓讼?,干脆就把造鎖的技術公開了。特工,或者任何其它人,可以就地取材,按照圖紙造鎖,但無法根據圖紙造出鑰匙。鑰匙只有總部的那一把。
上面的關鍵是鎖和鑰匙工藝不同。知道了鎖,并不能知道鑰匙。這樣,銀行可以將“造鎖”的方法公布給所有用戶。每個用戶可以用鎖來加密自己的信用卡信息。即使被別人竊聽到,也不用擔心:只有銀行才有鑰匙呢!這樣一種加密算法叫做非對稱加密(asymmetric encryption)。非對稱加密的經典算法是RSA算法。它來自于數論與計算機計數的奇妙結合。
1976年,兩位美國計算機學家Whitfield Diffie 和 Martin Hellman,提出了一種嶄新構思,可以在不直接傳遞密鑰的情況下,完成解密。這被稱為"Diffie-Hellman密鑰交換算法"。這個算法啟發了其他科學家。人們認識到,加密和解密可以使用不同的規則,只要這兩種規則之間存在某種對應關系即可,這樣就避免了直接傳遞密鑰。這種新的加密模式被稱為"非對稱加密算法"。
1977年,三位數學家Rivest、Shamir 和 Adleman 設計了一種算法,可以實現非對稱加密。這種算法用他們三個人的名字命名,叫做RSA算法。從那時直到現在,RSA算法一直是最廣為使用的"非對稱加密算法"。毫不夸張地說,只要有計算機網絡的地方,就有RSA算法。
四、非對稱加密RSA通俗解釋和數字簽名
1.能“撞”上的保險箱(非對稱/公鑰加密體制,Asymmetric / Public Key Encryption)
數據加密解密和門鎖很像。最開始的時候,人們只想到了那種只能用鑰匙“鎖”數據的鎖。如果在自己的電腦上自己加密數據,當然可以用最開始這種門鎖的形式啦,方便快捷,簡單易用有木有。
但是我們現在是通信時代啊,雙方都想做安全的通信怎么辦呢?如果也用這種方法,通信就好像互相發送密碼保險箱一樣…而且雙方必須都有鑰匙才能進行加密和解密。也就是說,兩個人都拿著保險箱的鑰匙,你把數據放進去,用鑰匙鎖上發給我。我用同樣的鑰匙把保險箱打開,再把我的數據鎖進保險箱,發送給你。
這樣看起來好像沒什么問題。但是,這里面最大的問題是:我們兩個怎么弄到同一個保險箱的同一個鑰匙呢?好像僅有的辦法就是我們兩個一起去買個保險箱,然后一人拿一把鑰匙,以后就用這個保險箱了??墒?,現代通信社會,絕大多數情況下別說一起去買保險箱了,連見個面都難,這怎么辦啊?
于是,人們想到了“撞門”的方法。我這有個可以“撞上”的保險箱,你那里自己也買一個這樣的保險箱。通信最開始,我把保險箱打開,就這么開著把保險箱發給你。你把數據放進去以后,把保險箱“撞”上發給我。撞上以后,除了我以外,誰都打不開保險箱了。這就是RSA了,公開的保險箱就是公鑰,但是我有私鑰,我才能打開。
2.數字簽名
這種鎖看起來好像很不錯,但是鎖在運輸的過程中有這么一個嚴重的問題:你怎么確定你收到的開著的保險箱就是我發來的呢?對于一個聰明人,他完全可以這么干:
(a)裝作運輸工人。我現在把我開著的保險箱運給對方。運輸工人自己也弄這么一個保險箱,運輸的時候把保險箱換成他做的。
(b)對方收到保險箱后,沒法知道這個保險箱是我最初發過去的,還是運輸工人替換的。對方把數據放進去,把保險箱撞上。
(c)運輸工人往回運的時候,用自己的鑰匙打開自己的保險箱,把數據拿走。然后復印也好,偽造也好,弄出一份數據,把這份數據放進我的保險箱,撞上,然后發給我。
從我的角度,從對方的角度,都會覺得這數據傳輸過程沒問題。但是,運輸工人成功拿到了數據,整個過程還是不安全的,大概的過程是這樣:
這怎么辦啊?這個問題的本質原因是,人們沒辦法獲知,保險箱到底是“我”做的,還是運輸工人做的。那干脆,我們都別做保險箱了,讓權威機構做保險箱,然后在每個保險箱上用特殊的工具刻上一個編號。對方收到保險箱的時候,在權威機構的“公告欄”上查一下編號,要是和保險箱上的編號一樣,我就知道這個保險箱是“我”的,就安心把數據放進去。大概過程是這樣的:
如何做出刻上編號,而且編號沒法修改的保險箱呢?這涉及到了公鑰體制中的另一個問題:數字簽名。
要知道,刻字這種事情吧,誰都能干,所以想做出只能自己刻字,還沒法讓別人修改的保險箱確實有點難度。那么怎么辦呢?這其實困擾了人們很長的時間。直到有一天,人們發現:我們不一定非要在保險箱上刻規規矩矩的字,我們干脆在保險箱上刻手寫名字好了。而且,刻字有點麻煩,干脆我們在上面弄張紙,讓人直接在上面寫,簡單不費事。具體做法是,我們在保險箱上嵌進去一張紙,然后每個出產的保險箱都讓權威機構的CEO簽上自己的名字。然后,CEO把自己的簽名公開在權威機構的“公告欄”上面。比如這個CEO就叫“學酥”,那么整個流程差不多是這個樣子:
這個方法的本質原理是,每個人都能夠通過筆跡看出保險箱上的字是不是學酥CEO簽的。但是呢,這個字體是學酥CEO唯一的字體。別人很難模仿。如果模仿我們就能自己分辨出來了。要是實在分辨不出來呢,我們就請一個筆跡專家來分辨。這不是很好嘛。這個在密碼學上就是數字簽名。
上面這個簽字的方法雖然好,但是還有一個比較蛋疼的問題。因為簽字的樣子是公開的,一個聰明人可以把公開的簽字影印一份,自己造個保險箱,然后把這個影印的字也嵌進去。這樣一來,這個聰明人也可以造一個相同簽字的保險箱了。解決這個問題一個非常簡單的方法就是在看保險箱上的簽名時,不光看字體本身,還要看字體是不是和公開的字體完全一樣。要是完全一樣,就可以考慮這個簽名可能是影印出來的。甚至,還要考察字體是不是和其他保險柜上的字體一模一樣。因為聰明人為了欺騙大家,可能不影印公開的簽名,而影印其他保險箱上的簽名。這種解決方法雖然簡單,但是驗證簽名的時候麻煩了一些。麻煩的地方在于我不僅需要對比保險箱上的簽名是否與公開的筆跡一樣,還需要對比得到的簽名是否與公開的筆跡完全一樣,乃至是否和所有發布的保險箱上的簽名完全一樣。有沒有什么更好的方法呢?
當然有,人們想到了一個比較好的方法。那就是,學酥CEO簽字的時候吧,不光把名字簽上,還得帶上簽字得日期,或者帶上這個保險箱的編號。這樣一來,每一個保險箱上的簽字就唯一了,這個簽字是學酥CEO的簽名+學酥CEO寫上的時間或者編號。這樣一來,就算有人偽造,也只能偽造用過的保險箱。這個問題就徹底解決了。這個過程大概是這么個樣子:
3 造價問題(密鑰封裝機制,Key Encapsulation Mechanism)
解決了上面的各種問題,我們要考慮考慮成本了… 這種能“撞”門的保險箱雖然好,但是這種鎖造價一般來說要比普通的鎖要高,而且鎖生產時間也會變長。在密碼學中,對于同樣“結實”的鎖,能“撞”門的鎖的造價一般來說是普通鎖的上千倍。同時,能“撞”門的鎖一般來說只能安裝在小的保險柜里面。畢竟,這么復雜的鎖,裝起來很費事啊!而普通鎖安裝在多大的保險柜上面都可以呢。如果兩個人想傳輸大量數據的話,用一個大的保險柜比用一堆小的保險柜慢慢傳要好的多呀。怎么解決這個問題呢?人們又想出了一個非常棒的方法:我們把兩種鎖結合起來。能“撞”上的保險柜里面放一個普通鎖的鑰匙。然后造一個用普通的保險柜來鎖大量的數據。這樣一來,我們相當于用能“撞”上的保險柜發一個鑰匙過去。對方收到兩個保險柜后,先用自己的鑰匙把小保險柜打開,取出鑰匙。然后在用這個鑰匙開大的保險柜。這樣做更棒的一個地方在于,既然對方得到了一個鑰匙,后續再通信的時候,我們就不再需要能“撞”上的保險柜了啊,在以后一定時間內就用普通保險柜就好了,方便快捷嘛。
以下參考數字簽名、數字證書、SSL、https是什么關系?
4.數字簽名(Digital Signature)
數據在瀏覽器和服務器之間傳輸時,有可能在傳輸過程中被冒充的盜賊把內容替換了,那么如何保證數據是真實服務器發送的而不被調包呢,同時如何保證傳輸的數據沒有被人篡改呢,要解決這兩個問題就必須用到數字簽名,數字簽名就如同日常生活的中的簽名一樣,一旦在合同書上落下了你的大名,從法律意義上就確定是你本人簽的字兒,這是任何人都沒法仿造的,因為這是你專有的手跡,任何人是造不出來的。那么在計算機中的數字簽名怎么回事呢?數字簽名就是用于驗證傳輸的內容是不是真實服務器發送的數據,發送的數據有沒有被篡改過,它就干這兩件事,是非對稱加密的一種應用場景。不過他是反過來用私鑰來加密,通過與之配對的公鑰來解密。
第一步:服務端把報文經過Hash處理后生成摘要信息Digest,摘要信息使用私鑰private-key加密之后就生成簽名,服務器把簽名連同報文一起發送給客戶端。
第二步:客戶端接收到數據后,把簽名提取出來用public-key解密,如果能正常的解密出來Digest2,那么就能確認是對方發的。
第三步:客戶端把報文Text提取出來做同樣的Hash處理,得到的摘要信息Digest1,再與之前解密出來的Digist2對比,如果兩者相等,就表示內容沒有被篡改,否則內容就是被人改過了。因為只要文本內容哪怕有任何一點點改動都會Hash出一個完全不一樣的摘要信息出來。
5.數字證書(Certificate Authority)
數字證書簡稱CA,它由權威機構給某網站頒發的一種認可憑證,這個憑證是被大家(瀏覽器)所認可的,為什么需要用數字證書呢,難道有了數字簽名還不夠安全嗎?有這樣一種情況,就是瀏覽器無法確定所有的真實服務器是不是真的是真實的,舉一個簡單的例子:A廠家給你們家安裝鎖,同時把鑰匙也交給你,只要鑰匙能打開鎖,你就可以確定鑰匙和鎖是配對的,如果有人把鑰匙換了或者把鎖換了,你是打不開門的,你就知道肯定被竊取了,但是如果有人把鎖和鑰匙替換成另一套表面看起來差不多的,但質量差很多的,雖然鑰匙和鎖配套,但是你卻不能確定這是否真的是A廠家給你的,那么這時候,你可以找質檢部門來檢驗一下,這套鎖是不是真的來自于A廠家,質檢部門是權威機構,他說的話是可以被公眾認可的(呵呵)。
同樣的, 因為如果有人(張三)用自己的公鑰把真實服務器發送給瀏覽器的公鑰替換了,于是張三用自己的私鑰執行相同的步驟對文本Hash、數字簽名,最后得到的結果都沒什么問題,但事實上瀏覽器看到的東西卻不是真實服務器給的,而是被張三從里到外(公鑰到私鑰)換了一通。那么如何保證你現在使用的公鑰就是真實服務器發給你的呢?我們就用數字證書來解決這個問題。數字證書一般由數字證書認證機構(Certificate Authority)頒發,證書里面包含了真實服務器的公鑰和網站的一些其他信息,數字證書機構用自己的私鑰加密后發給瀏覽器,瀏覽器使用數字證書機構的公鑰解密后得到真實服務器的公鑰。這個過程是建立在被大家所認可的證書機構之上得到的公鑰,所以這是一種安全的方式。
五、常見的對稱,非對稱加密算法應用
常見的對稱加密算法有DES、3DES、AES、RC5、RC6。非對稱加密算法應用非常廣泛,如SSH,
HTTPS, TLS,電子證書,電子簽名,電子身份證等等。
參考DES/3DES/AES區別