Ⅰ 品味數學之美-RSA原理淺析
在探究RSA演算法的原理之前,我們先來學習一點有趣的數論知識(數學分支之一,主要研究整數的性質)。你會發現一些簡單的數學知識竟然背後有如此神奇的魔力。
說起質數,想必大家不陌生了,一個大於1的整數除了其本身和1之外,不存在因數則被稱為質數或者是素數。比如2、3、5、7等。在小學課堂里,我們可能只是記住了這個概念,但是這里我談下自己的一些思考幫助大家理解,質數就好比是構成數字的基本元素,想想看,氫分子僅由兩個氫原子(組成一個氫分子)構成,那麼一個非質數的6=3*2 即表示為6是由兩個「3」元素或3個「2」元素構成。其中「3」或者「2」是不可以繼續拆分的元素(3,2都是質數)。所以對一個非質數進行因式分解過程就好比對一個物體進行深入解剖,拆分至不可拆分的元素為止。這樣看來,數學家們提出這些數學概念,其實也是一種對數字世界的認識和思考的概括,和我們日常生活理解周邊事物方式也是相似的。
知道了質數,我們再看看互質關系,那麼什麼是互質呢?就是說兩個數沒有相同的因數稱為互質關系。我們對6進行因數分解,拆分到質數的乘積即6=3* 2而 35=5*7,這兩者沒有相同的因數則稱6與35互質,就好像氫氣分子只是由氫原子構成,而氧氣分子只是由氧原子構成,這二者這間沒有相同的原子就是一種互質的體現。
所以互質只是一個數和數之間有沒有相同的因數關系的體現(公約數也稱公因數),和兩者是不是質數是沒有關系的。當然質數之間必然是互質關系,因為它們都是構成數字的不同元素。數學上來表示a,b互質一般用gcd(a,b)=1來表示。即a和b的最大公約數是1.
質數和互質的關系是不是很容易理解?但是大數學家歐拉先生可絕不僅僅停步於此,數學家嘛總愛問一下抽象概括性的問題,希望找尋規律比如
如果能找到規律,無論數字如何千變萬化10位數還是100000位數,我們都能根據准則輕易計算數互質關系的數量。你發現了沒有,數字也是一片世界,真是一花一世界一葉一如來啊!好了回歸正傳,對於這個問題歐拉先生給出了他的答案。他是這樣作答的:
首先呢上述問題可以簡化為一個函數來描述即: Phi(n)
這也是數學家老毛病在他們看來任何問題就是對函數的求解。既然這個函數由歐拉提出來的,那麼我們就稱他為 歐拉函數 .還好這個函數簡單只有一個變數,即給定的正整數n。接下來就要分析這個n
n=1的時候這個問題極其簡單:
Phi(n)=1
因為1與任何數包含他自身都構成互質關系。1本身也是質數且不作為其他數的因數,因為任何數乘以1都是其本身
大家想想看n是質數,其自身就不存在因數了,而那些與他非互質關系(存在公約數)的數進行因式分解後一定都會有一個因數與n相等。比如n=3為一個質數,那麼6=3*2與3是非互質關系,因為存在公約數3。所以我們發現與n非互質關系的數都是n的倍數即(kn),因為kn>=n所以與n互質的數都小於n即
Phi(n)=n-1
還記得我們前面提到的質數嗎,他可是構成數字的元素呀,所以如果n不是質數,那麼他一定可以被因式分解拆分成多個質數的乘積。比如24=6*4=3*8=2*2*2*3 比如6=2*3,這些質數因數相互乘積也可以形成如下情況:
我們把相同質數因數進行相乘,很容易將一個非質數分解為兩個互質關系的數的乘積,比如24=6*4=2*2*2*3=3*8
從簡單的情況來考慮,即n被拆分為兩個互質關系的數的乘積:
即
n=p*q
p與q互質,那麼根據剩餘定理:
Phi left( pq ight) =Phi(p)*Phi(q)
至於如何證明呢?說實話我也不清楚。在我理解看來,與24互質的數都有這樣一個特點:他進行因式分解後其因數不包含有3與2(因為8=2*2*2)。所以與3互質的數定義為集合A,且個數為
Phi left( 3
ight)
與8互質的數定義為集合B,且個數為
Phi left( 8
ight)
這AB兩組的數字可以在組與組間兩兩進行組合乘積,構成與24互質的數。所以兩組數字個數相乘就可以知道乘積的組合個數,也就知道與24互質的個數了。這樣的證明並不嚴謹但姑且可以先記住。
另外還需要記住歐拉函數是一個 積性函數 ,也就是n如果為多個互質的數構成即(n=a*b*c*d.... ),那麼
Phi left( n
ight)=Phi left( a
ight) *Phi left( b
ight)....
也就是n為某一個質數的倍數,比如27=3*3*3=3^3 27就是3的倍數。那麼小於27且存在非互質關系的數一定都是3的倍數也就是:1*3、2*3,3*3...9*3 共計9個, 所以3^3 - 9 =3^3 - 3^2 .所以歸納一下也就是說如果p是質數,求與p^n 互質的數的個數,只要將如下的數
(1*p)、(2*p)、(3*p)、....(p^n-1 *p) 進行剔除,剩餘的都將與p^n (切記p是質數)互質所以我們得出:
Phi left( p^{k} ight)=p^{k}-p^{k-1}=p^{k}(1-dfrac {1}{p} )
當k=1的時候即
Phi left( p
ight)=p-1
又回到了之前n為質數的情況下的表達式。這里我們也看到數學追求簡潔和普適性的思想,再繁雜的規律都可以變成一個簡潔抽象的表達式。
比如24=6*4=3*8=2*2*2*3,因為質數之間就是互質關系而且質數的多次方也是互質關系所以
我們把24演變一下:24=2^3 * 3即把相同的質數進行合並為質數的多次方。這樣2^3 與3是互質關系( 質數的多次方之間也都是互質關系 ),於是當我們求與24互質的數的個數時候,就可以套用之前公式即:
Phi left(24 ight)=Phi left( 2^{3}*3 ight)=Phi left(2^3 ight)*Phi left(3 ight)=(2^{3}-2^{3-1})(3-1) =8
再進一步歸納因為p1、 p2...pm等都是質數且
n = p_{1}^{k_{1}}p_{2}^{k_{2}}p_{3}^{k_{3}}...p_{m}^{k_{m}}
則由於歐拉函數是積性函數,那麼:
Phi left(n
ight)=Phi left( p_{1}^{k_{1}}p_{2}^{k_{2}}p_{3}^{k_{3}}...p_{m}^{k_{m}}
ight) =Phi left( p_{1}^{k_{1}}
ight)* Phi left( p_{2}^{k_{2}}
ight)*...Phi left( p_{m}^{k_{m}}
ight)
由上一小節n為質數的多次方的結論
Phi left( p^{k}
ight)=p^{k}-p^{k-1}=p^{k}(1-dfrac {1}{p} )
可以得出:
Phi left( p_{1}^{k_{1}}
ight)* Phi left( p_{2}^{k_{2}}
ight)*...Phi left( p_{m}^{k_{m}}
ight)=p_{1}^{k_{1}}p_{2}^{k_{2}}...p_{m}^{k_{m}}*(1-dfrac {1}{p_{1}} )*(1-dfrac {1}{p_{2}})...(1-dfrac {1}{p_{m}} )
則
Phi left(n
ight)=n*(1-dfrac {1}{p_{1}} )*(1-dfrac {1}{p_{2}})...(1-dfrac {1}{p_{m}})
此時我們仍然計算24互質個數則
Phi left(24
ight)=Phi left( 2^{3}*3
ight)=Phi left(2^3
ight)*Phi left(3
ight)=24*(1-dfrac {1}{2})(1-dfrac {1}{3})=8
上面說的那麼多其實歸結起來就是這樣一個道理:當我們去求小於某個數范圍內與其互質的數的個數時候,無非就是把n分為質數還是非質數。
知道了歐拉函數,接下來我們再理解一個同餘概念,簡單來說也就是25除以3的余數為1,而1除以2的余數為1,則我們稱25與1對於模3同餘數,用人話來說就是25和1 除以2得到的余數都一樣。求余數的過程在數學里的黑話叫取模。所以才有上面那麼拗口的說法。但是不要緊,數學喜歡簡單不啰嗦,於是搞出了如下的表達式來表達上述說法:
25equiv 1left( mod 3
ight)
也就是說
25 \% 3 = 1\%3=1
注意到了嗎?上述表達式也可以這樣表述,即25除以3得到的余數為1.圍繞著同餘這個概念,歐拉大師結合他的歐拉函數活脫脫就搞出了個歐拉定理,我們來看看他有什麼發現?
另外根據取模運算的規則:
a^{b}\%p = ((a \% p)^{b}) \% p
我們還可以得出
(a^{Phi left(n
ight)})^{k}equiv 1left( mod n
ight)
因為
(a^{Phi left(n
ight)})^{k} \% n=(a^{Phi left(n
ight)}\%n)^{k}\%n=1^k\%n =1
我們舉個例子:比如
{Phi left(10
ight)}={Phi left(2*5
ight)}={Phi left(2
ight)}*{Phi left(5
ight)}=(2-1)*(5-1)=4
所以根據歐拉定理:因為9與10互質所以
9^{Phi left(10
ight)}=9^4equiv 1left( mod 10
ight)
於是(9^4 )^k 除以10都餘1。
如果a與n互質,則必然能夠找到一個數使得
abequiv 1left( mod n
ight)
則b稱為a的模反元素,我們可以通過歐拉定理來給予證明
a^{Phi left(n
ight)}=1left( mod n
ight)
a^{Phi left(n
ight)}= a*a^{Phi left(n
ight)-1}equiv 1left( mod n
ight)
模反元素的概念對後續在已知道公鑰情況下,計算合適的私鑰是有很重要的意義的。
掌握了這些數學知識,你可能覺得這些東西似乎很孤立,看不到任何作用和價值,不過接下來我們來看看RSA是怎麼運作的,你就會發現這些看似毫無作用的東西是如何產生價值的。
從加解密的表達式可以看出在,數學原理上公鑰和私鑰其實並沒有什麼差異。你可以用公鑰加密、私鑰解密,也可以用私鑰加密,公鑰進行解密。但是對於密碼學來說,對公鑰和私鑰會有不同的要求。
另外需要注意的是這里 明文數值不能大於等於N ,否則解密的結果並不會等於明文。
因為加密的公式為:
x^e mod n = y
而解密公式為
y^d mod n = x
從上面表達式可以看出在數學原理上公鑰和私鑰其實並沒有什麼差異。你可以用公鑰加密、私鑰解密,也可以用私鑰加密,公鑰進行解密。
所以根據:
y=x^e - kn
且因為Y^D mod N = x 所以
y^D equiv x (mod n)
所以確定能否加解密的過程本質就是證明:
(x^e - kn)^d equiv x (mod n) (1.1)
而根據二項式定理
[圖片上傳失敗...(image-ca75c7-1530364603810)]
(x^e - kn)^d 展開後演變為
x^ed-m_{1}x^{e(d-1)}kn+m_{2}x^{e(d-2)}(kn)^2...m_{n}(kn)^{d}
你會發現二項式展開後,唯有x^ed 沒有包含n,因此結合模運算加法運算規則(a + b) % p = (a % p + b % p) % p ,要想證明1.1的表達式,則必然證明:
x^{ed} equiv x (mod n)
由於
ed equiv 1 (mod {Phi left(n
ight)})
所以
ed=h{Phi left(n
ight)})+1
則從證明
x^{ed} equiv x (mod n) 演變為證明
x^{h{Phi left(n
ight)}}*xequiv x (mod n)
如果x與n 互質則根據歐拉定理
x^{{Phi left(n
ight)}}equiv 1 (mod n)
基於在歐拉定理中提及的,根據取模運算規則可以得出
x^{h{Phi left(n
ight)}}equiv 1 (mod n)
仍然是基於取模運算乘法規則,我們又可以得出
x^{h{Phi left(n
ight)}}xequiv x (mod n)
這樣原式得到證明。
那麼如果x與n不互質的情況下,因為n=p*q且p和q都是質數,所以n的因數只有p和q了,因為x與n不互質,那麼我們可以認為:
x=k_{1}p 0 < u< q
或者
x=k_{2}q 0 < k
請注意k值的取值范圍,這里要牢記一點明文值必須大於0且小於n值。
這里我們先姑且定義
x=kq
0 < k< p
那麼因為p與q都是質數,根據k<p 我們可以認為k與p是互質的,而p本身就是質數,所以根據費爾馬小定理(n
為質數,a與n互質,如果有所遺忘可以回到前面查看相關說明。)
a^{n-1}equiv 1left( mod n
ight)
那麼
(kq)^{p-1}equiv 1left( mod p
ight)
根據費爾馬定理我們推得出來的表達式
a^{Phi left(n
ight)}equiv 1left( mod n
ight)
得出
((kq)^{p-1})^{h*(q-1)}equiv 1left( mod p
ight)
也就是
(kq)^{h*(q-1)(p-1)}equiv 1left( mod p
ight)
根據取模運算的運算定義:
得出
(kq)^{h*(q-1)(p-1)} = 1+u*p
這里的u為任意整數,這時候兩邊都乘以kq
(kq)^{h*(q-1)(p-1)}*kq = 1+u*k*q*p
因為n=pq x=kq那麼
(x)^{Phi left(n
ight)+1} = x+u*k*n
還是根據之前取模運算定義得出
(x)^{hPhi left(n
ight)+1}equiv xleft( mod n
ight)
即原式得到了證明。
之所以RSA是安全的,很大程度取決於n值是否足夠大以至於在已知公鑰e和模數n的情況下仍然難以找出d。根據之前的談及的密鑰對計算方式:
E*D equiv 1(mod M)
要想算出D就必須計算出M 而M = (p-1)(q-1) ,n=p*q則要算出M就需要知道p和q,即從一個龐大的數中分離出兩個也很大的質數。大數的素因數分解被認為是一個困難的問題,即使是現代的計算機也非常難於處理,所以許多加密系統的原理都是建基於此。
目前最安全的做法是選擇使用rsa-2048,隨著2009年12月12日,編號為RSA-768(768 bits, 232 digits)數也被成功分解。這一事件威脅了現通行的1024-bit密鑰的安全性。這里的2048表示的是模數N
的二進制位為2048位。而一般公鑰世面上普遍選擇65535,這是安全性和計算速度之間的綜合考慮下選擇出來的一個比較妥當的數值。因為加解密函數都是在做大數的指數運算,所以在工程方面會盡量考慮公鑰加解密的執行速度,畢竟公鑰是被外部使用的。
此外還記得前面提到rsa加密的明文數值大小不能大於N,或者其位數不能超過N的位數的限制。一旦超過密文解密後和原文數據不相匹配,這時候就需要採用分段加密技術。而另一方面明文的值也不能為0或1,-1因為這樣導緻密文也是0,1或者-1。另外也有一個問題即如果用私鑰解密一段非法數據,那麼得到是解密失敗還是一個毫無意義的解密內容呢?這時候需要採用 rsa padding技術。對這個概念理解可以參考 淺談RSA Padding 這篇文章。
通過學習一些簡單的數論知識即質數、歐拉函數、模反元素等概念後,我們也了解RSA演算法大致過程,總的來說公私密鑰對需要計算如下幾個數據:
RSA的安全性不僅僅建立於大數質因數分解困難這一理論基礎上,在工程上如何對上述這些數值的選取也是很大的學問。通過對rsa學習讓我對工程和理論之間的關系理解上更進一步。理論確定了方向的可行性,而工程實踐則要確保在有限資源下,理論結果是可以應用起來解決特定規模的問題。而在加密演算法領域,一旦工程實踐出現偏差,往往就容易產生安全漏洞,盡管演算法理論證明是安全的。比如rsa中p q值的選擇等。這里我羅列幾個工程問題有興趣的童鞋可以再進一步做探索:
Ⅱ RSA演算法的安全問題
不安全 雖然沒泄露n 但是e d都被知道後 有利於求得n的歐拉函數 進而分解n
這就是所謂的 「共模攻擊」
為了防止共模攻擊 所以Rsa使用有2個注意
1。私鑰泄露,立刻換n
2。同組多用戶不能使用同一個n
Ⅲ 常見的幾種SSL/TLS漏洞及攻擊方式
SSL/TLS漏洞目前還是比較普遍的,首先關閉協議:SSL2、SSL3(比較老的SSL協議)配置完成ATS安全標准就可以避免以下的攻擊了,最新的伺服器環境都不會有一下問題,當然這種漏洞都是自己部署證書沒有配置好導致的。
Export 加密演算法
Export是一種老舊的弱加密演算法,是被美國法律標示為可出口的加密演算法,其限制對稱加密最大強度位數為40位,限制密鑰交換強度為最大512位。這是一個現今被強制丟棄的演算法。
Downgrade(降級攻擊)
降級攻擊是一種對計算機系統或者通信協議的攻擊,在降級攻擊中,攻擊者故意使系統放棄新式、安全性高的工作方式,反而使用為向下兼容而准備的老式、安全性差的工作方式,降級攻擊常被用於中間人攻擊,講加密的通信協議安全性大幅削弱,得以進行原本不可能做到的攻擊。 在現代的回退防禦中,使用單獨的信號套件來指示自願降級行為,需要理解該信號並支持更高協議版本的伺服器來終止協商,該套件是TLS_FALLBACK_SCSV(0x5600)
MITM(中間人攻擊)
MITM(Man-in-the-MiddleAttack) ,是指攻擊者與通訊的兩端分別創建獨立的聯系,並交換其所有收到的數據,使通訊的兩端認為他們正在通過一個私密的連接與對方直接對話,但事實上整個對話都被攻擊者完全控制,在中間人攻擊中,攻擊者可以攔截通訊雙方的通話並插入新的內容。一個中間人攻擊能成功的前提條件是攻擊者能夠將自己偽裝成每個參與會話的終端,並且不被其他終端識破。
BEAST(野獸攻擊)
BEAST(CVE-2011-3389) BEAST是一種明文攻擊,通過從SSL/TLS加密的會話中獲取受害者的COOKIE值(通過進行一次會話劫持攻擊),進而篡改一個加密演算法的 CBC(密碼塊鏈)的模式以實現攻擊目錄,其主要針對TLS1.0和更早版本的協議中的對稱加密演算法CBC模式。
RC4 加密演算法
由於早期的BEAST野獸攻擊而採用的加密演算法,RC4演算法能減輕野獸攻擊的危害,後來隨著客戶端版本升級,有了客戶端緩解方案(Chrome 和 Firefox 提供了緩解方案),野獸攻擊就不是什麼大問題了。同樣這是一個現今被強制丟棄的演算法。
CRIME(罪惡攻擊)
CRIME(CVE-2012-4929),全稱Compression Ratio Info-leak Made Easy,這是一種因SSL壓縮造成的安全隱患,通過它可竊取啟用數據壓縮特性的HTTPS或SPDY協議傳輸的私密Web Cookie。在成功讀取身份驗證Cookie後,攻擊者可以實行會話劫持和發動進一步攻擊。
SSL 壓縮在下述版本是默認關閉的: nginx 1.1.6及更高/1.0.9及更高(如果使用了 OpenSSL 1.0.0及更高), nginx 1.3.2及更高/1.2.2及更高(如果使用較舊版本的 OpenSSL)。
如果你使用一個早期版本的 nginx 或 OpenSSL,而且你的發行版沒有向後移植該選項,那麼你需要重新編譯沒有一個 ZLIB 支持的 OpenSSL。這會禁止 OpenSSL 使用 DEFLATE 壓縮方式。如果你禁用了這個,你仍然可以使用常規的 HTML DEFLATE 壓縮。
Heartbleed(心血漏洞)
Heartbleed(CVE-2014-0160) 是一個於2014年4月公布的 OpenSSL 加密庫的漏洞,它是一個被廣泛使用的傳輸層安全(TLS)協議的實現。無論是伺服器端還是客戶端在 TLS 中使用了有缺陷的 OpenSSL,都可以被利用該缺陷。由於它是因 DTLS 心跳擴展(RFC 6520)中的輸入驗證不正確(缺少了邊界檢查)而導致的,所以該漏洞根據「心跳」而命名。這個漏洞是一種緩存區超讀漏洞,它可以讀取到本不應該讀取的數據。如果使用帶缺陷的Openssl版本,無論是伺服器還是客戶端,都可能因此受到攻擊。
POODLE漏洞(捲毛狗攻擊)
2014年10月14號由Google發現的POODLE漏洞,全稱是Padding Oracle On Downloaded Legacy Encryption vulnerability,又被稱為「貴賓犬攻擊」(CVE-2014-3566),POODLE漏洞只對CBC模式的明文進行了身份驗證,但是沒有對填充位元組進行完整性驗證,攻擊者竊取採用SSL3.0版加密通信過程中的內容,對填充位元組修改並且利用預置填充來恢復加密內容,以達到攻擊目的。
TLS POODLE(TLS捲毛狗攻擊)
TLS POODLE(CVE-2014-8730) 該漏洞的原理和POODLE漏洞的原理一致,但不是SSL3協議。由於TLS填充是SSLv3的一個子集,因此可以重新使用針對TLS的POODLE攻擊。TLS對於它的填充格式是非常嚴格的,但是一些TLS實現在解密之後不執行填充結構的檢查。即使使用TLS也不會容易受到POODLE攻擊的影響。
CCS
CCS(CVE-2014-0224) 全稱openssl MITM CCS injection attack,Openssl 0.9.8za之前的版本、1.0.0m之前的以及1.0.1h之前的openssl沒有適當的限制ChangeCipherSpec信息的處理,這允許中間人攻擊者在通信之間使用0長度的主密鑰。
FREAK
FREAK(CVE-2015-0204) 客戶端會在一個全安全強度的RSA握手過程中接受使用弱安全強度的出口RSA密鑰,其中關鍵在於客戶端並沒有允許協商任何出口級別的RSA密碼套件。
Logjam
Logjam(CVE-2015-4000) 使用 Diffie-Hellman 密鑰交換協議的 TLS 連接很容易受到攻擊,尤其是DH密鑰中的公鑰強度小於1024bits。中間人攻擊者可將有漏洞的 TLS 連接降級至使用 512 位元組導出級加密。這種攻擊會影響支持 DHE_EXPORT 密碼的所有伺服器。這個攻擊可通過為兩組弱 Diffie-Hellman 參數預先計算 512 位元組質數完成,特別是 Apache 的 httpd 版本 2.1.5 到 2.4.7,以及 OpenSSL 的所有版本。
DROWN(溺水攻擊/溺亡攻擊)
2016年3月發現的針對TLS的新漏洞攻擊——DROWN(Decrypting RSA with Obsolete and Weakened eNcryption,CVE-2016-0800),也即利用過時的、弱化的一種RSA加密演算法來解密破解TLS協議中被該演算法加密的會話密鑰。 具體說來,DROWN漏洞可以利用過時的SSLv2協議來解密與之共享相同RSA私鑰的TLS協議所保護的流量。 DROWN攻擊依賴於SSLv2協議的設計缺陷以及知名的Bleichenbacher攻擊。
通常檢查以下兩點伺服器的配置
伺服器允許SSL2連接,需要將其關閉。
私鑰同時用於允許SSL2連接的其他伺服器。例如,Web伺服器和郵件伺服器上使用相同的私鑰和證書,如果郵件伺服器支持SSL2,即使web伺服器不支持SSL2,攻擊者可以利用郵件伺服器來破壞與web伺服器的TLS連接。
Openssl Padding Oracle
Openssl Padding Oracle(CVE-2016-2107) openssl 1.0.1t到openssl 1.0.2h之前沒有考慮某些填充檢查期間的內存分配,這允許遠程攻擊者通過針對AES CBC會話的padding-oracle攻擊來獲取敏感的明文信息。
強制丟棄的演算法
aNULL 包含了非驗證的 Diffie-Hellman 密鑰交換,這會受到中間人(MITM)攻擊
eNULL 包含了無加密的演算法(明文)
EXPORT 是老舊的弱加密演算法,是被美國法律標示為可出口的
RC4 包含的加密演算法使用了已棄用的 ARCFOUR 演算法
DES 包含的加密演算法使用了棄用的數據加密標准(DES)
SSLv2 包含了定義在舊版本 SSL 標准中的所有演算法,現已棄用
MD5 包含了使用已棄用的 MD5 作為哈希演算法的所有演算法
Ⅳ RSA演算法的缺點
1)產生密鑰很麻煩,受到素數產生技術的限制,因而難以做到一次一密。
2)安全性,RSA的安全性依賴於大數的因子分解,但並沒有從理論上證明破譯RSA的難度與大數分解難度等價,而且密碼學界多數人士傾向於因子分解不是NP問題。現今,人們已能分解140多個十進制位的大素數,這就要求使用更長的密鑰,速度更慢;另外,人們正在積極尋找攻擊RSA的方法,如選擇密文攻擊,一般攻擊者是將某一信息作一下偽裝(Blind),讓擁有私鑰的實體簽署。然後,經過計算就可得到它所想要的信息。實際上,攻擊利用的都是同一個弱點,即存在這樣一個事實:乘冪保留了輸入的乘法結構:
(XM)d = Xd *Md mod n
前面已經提到,這個固有的問題來自於公鑰密碼系統的最有用的特徵--每個人都能使用公鑰。但從演算法上無法解決這一問題,主要措施有兩條:一條是採用好的公鑰協議,保證工作過程中實體不對其他實體任意產生的信息解密,不對自己一無所知的信息簽名;另一條是決不對陌生人送來的隨機文檔簽名,簽名時首先使用One-Way Hash Function對文檔作HASH處理,或同時使用不同的簽名演算法。除了利用公共模數,人們還嘗試一些利用解密指數或φ(n)等等攻擊.
3)速度太慢,由於RSA 的分組長度太大,為保證安全性,n 至少也要 600 bits以上,使運算代價很高,尤其是速度較慢,較對稱密碼演算法慢幾個數量級;且隨著大數分解技術的發展,這個長度還在增加,不利於數據格式的標准化。SET(Secure Electronic Transaction)協議中要求CA採用2048比特長的密鑰,其他實體使用1024比特的密鑰。為了速度問題,人們廣泛使用單,公鑰密碼結合使用的方法,優缺點互補:單鑰密碼加密速度快,人們用它來加密較長的文件,然後用RSA來給文件密鑰加密,極好的解決了單鑰密碼的密鑰分發問題。
Ⅳ 4096位RSA演算法被側信道攻擊破解,這對當前的IT界安全有什麼影響
最近的網路中,4096位RSA演算法被側信道攻擊破解,這引起了一陣轟動和不安。安全不是個問題,問題的關鍵是:投入多少,要求多少安全強度的信道。DES的弱點密鑰開始通信的時候必須基於可信信道,如果密鑰被截獲。那麼信息毫無保密可以言。所以可以用diffid-Hellman交換DES的密鑰。
所以說,安全問題刻不容緩,我們需要加強對網路安全的監管和維護,促進網路和諧發展。
Ⅵ rsa演算法中p,q,n,e,d一般大小都為多少啊
RSA遭受攻擊的很多情況是因為演算法實現的一些細節上的漏洞所導致的,所以在使用RSA演算法構造密碼系統時,為保證安全,在生成大素數的基礎上,還必須認真仔細選擇參數,防止漏洞的形成。根據RSA加解密過程,其主要參數有三個:模數N,加密密鑰e,解密密鑰d。
3.4.1 模數N的確定
雖然迄今人們無法證明,破解RSA系統等於對N因子分解,但一般相信RSA系統的安全性等同於因子分解,即:若能分解因子N,即能攻破RSA系統,若能攻破RSA系統,即能分解因子Ⅳ。因此,在使用RSA系統時,對於模數N的選擇非常重要。在RSA演算法中,通過產生的兩個大素數p和q相乘得到模數N,而後分別通過對它們的數學運算得到密鑰對。由此,分解模數N得到p和q是最顯然的攻擊方法,當然也是最困難的方法,如果模數N被分解,攻擊者利用得到的P和q便可計算出,進而通過公開密鑰e由解密密鑰d,則RSA體制立刻被攻破。相當一部分的對RSA的攻擊就是試圖分解模數N,選擇合適的N是實現RSA演算法並防止漏洞的重要環節。一般地,模數N的確定可以遵循以下幾個原則:
①p和q之差要大。
當p和q相差很小時,在已知n的情況下,可假定二者的平均值為,然後利用,若等式右邊可開方,則得到及,即N被分解。
②p-1和q-1的最大公因子應很小。
③p和q必須為強素數。
一素數p如果滿足:
條件一:存在兩個大素數,,使得|p-1且|p+1;
條件二:存在四個大素數,,,使得。則此素數為強素數。其中,,,稱為3級的素數,,稱為2級的素數,p則稱為1級的素數,很明顯地,任何素數均為3級的素數。只有兩個強素數的積所構成的N,其因子分解才是較難的數學問題。
④p和q應大到使得因子分解N為計算上不可能。
RSA的安全性依賴於大數的因子分解,若能因子分解模數N,則RSA即被攻破,因此模數N必須足夠大直至因子分解N在計算上不可行。因子分解問題為密碼學最基本的難題之一,如今,因子分解的演算法已有長足的進步,但仍不足以說明RSA可破解。為保證安全性,實際應用中所選擇的素數P和拿至少應該為300位以上的二進制數,相應的模數N將是600位以上的二進制數。
目前,SET(Secure Electronic Transaction)協議中要求CA採用2048比特長的密鑰,其他實體使用1024比特的密鑰。隨著計算能力的提高和分布式運算的發展,安全密鑰的長度將是動態增長的。
Jadith Moore給出了使用RSA時有關模數的一些限制:
①若給定模數的一個加/解密密鑰指數對已知,攻擊者就能分解這個模數。
②若給定模數的一個加/解密密鑰指數對已知,攻擊者無需分解模數Ⅳ就可以計算出別的加/解密密鑰指數對。
③在通信網路中,利用RSA的協議不應該使用公共模數。
④消息應該用隨機數填充以避免對加密指數的攻擊。
3.4.2 e的選取原則
在RSA演算法中,e和互質的條件容易滿足,如果選擇較小的e,則加、解密的速度加快,也便於存儲,但會導致安全問題。
一般地,e的選取有如下原則:
①e不能夠太小。在RSA系統中,每人的公開密鑰P只要滿足即可,也即e可以任意選擇,為了減少加密運算時間,很多人採用盡可能小的e值,如3。但是已經證明低指數將會導致安全問題,故此,一般選擇e為16位的素數,可以有效防止攻擊,又有較快速度。
②e應選擇使其在的階為最大。即存在i,使得,
可以有效抗擊攻擊。
3.4.3 d的選取原則
一般地,私密密鑰d要大於。在許多應用場合,常希望使用位數較短的密鑰以降低解密或簽名的時間。例如IC卡應用中,IC卡CPU的計算能力遠低於計算機主機。長度較短的d可以減少IC卡的解密或簽名時間,而讓較復雜的加密或驗證預算(e長度較長)由快速的計算機主機運行。一個直接的問題就是:解密密鑰d的長度減少是否會造成安全性的降低?很明顯地,若d的長度太
小,則可以利用已知明文M加密後得,再直接猜測d,求出是否等於M。若是,則猜測J下確,否則繼續猜測。若d的長度過小,則猜測的空間變小,猜中的可能性加大,已有證明當時,可以由連分式演算法在多項式時間內求出d值。因此其長度不能過小。
Ⅶ RSA演算法的安全性
RSA的安全性依賴於大數分解,但是否等同於大數分解一直未能得到理論上的證明,因為沒有證明破解RSA就一定需要作大數分解。假設存在一種無須分解大數的演算法,那它肯定可以修改成為大數分解演算法。 RSA 的一些變種演算法已被證明等價於大數分解。不管怎樣,分解n是最顯然的攻擊方法。人們已能分解多個十進制位的大素數。因此,模數n必須選大一些,因具體適用情況而定。