❶ Hello,密碼學:第三部分,公鑰密碼(非對稱密碼)演算法
在 《Hello,密碼學:第二部分,對稱密碼演算法》 中講述了對稱密碼的概念,以及DES和AES兩種經典的對稱密碼演算法原理。既然有對稱密碼的說法,自然也就有非對稱密碼,也叫做公鑰密碼演算法。 對稱密碼和非對稱密碼兩種演算法的本質區別在於,加密密鑰和解密密鑰是否相同 :
公鑰密碼產生的初衷就是為了解決 密鑰配送 的問題。
Alice 給遠方的 Bob 寫了一封情意慢慢的信,並使用強悍的 AES-256 進行了加密,但她很快就意識到,光加密內容不行,必須要想一個安全的方法將加密密鑰告訴 Bob,如果將密鑰也通過網路發送,很可能被技術高手+偷窺癖的 Eve 竊聽到。
既要發送密鑰,又不能發送密鑰,這就是對稱密碼演算法下的「密鑰配送問題」 。
解決密鑰配送問題可能有這樣幾種方法:
這種方法比較高效,但有局限性:
與方法一不同,密鑰不再由通信個體來保存,而由密鑰分配中心(KDC)負責統一的管理和分配。 雙方需要加密通信時,由 KDC 生成一個用於本次通信的通信密鑰交由雙方,通信雙方只要與 KDC 事先共享密鑰即可 。這樣就大大減少密鑰的存儲和管理問題。
因此,KDC 涉及兩類密鑰:
領略下 KDC 的過程:
KDC 通過中心化的手段,確實能夠有效的解決方法一的密鑰管理和分配問題,安全性也還不錯。但也存在兩個顯著的問題:
使用公鑰密碼,加密密鑰和解密密鑰不同,只要擁有加密密鑰,所有人都能進行加密,但只有擁有解密密鑰的人才能進行解密。於是就出現了這個過程:
密鑰配送的問題天然被解決了。當然,解密密鑰丟失而導致信息泄密,這不屬於密鑰配送的問題。
下面,再詳細看下這個過程。
公鑰密碼流程的核心,可以用如下四句話來概述:
既然加密密鑰是公開的,因此也叫做 「公鑰(Public Key)」 。
既然解密密鑰是私有的,因此也叫做 「私鑰(Private Key) 。
公鑰和私鑰是一一對應的,稱為 「密鑰對」 ,他們好比相互糾纏的量子對, 彼此之間通過嚴密的數學計算關系進行關聯 ,不能分別單獨生成。
在公鑰密碼體系下,再看看 Alice 如何同 Bob 進行通信。
在公鑰密碼體系下,通信過程是由 Bob 開始啟動的:
過程看起來非常簡單,但為什麼即使公鑰被竊取也沒有關系?這就涉及了上文提到的嚴密的數學計算關系了。如果上一篇文章對稱密鑰的 DES 和 AES 演算法進行概述,下面一節也會對公鑰體系的數學原理進行簡要說明。
自從 Diffie 和 Hellman 在1976年提出公鑰密碼的設計思想後,1978年,Ron Rivest、Adi Shamir 和 Reonard Adleman 共同發表了一種公鑰密碼演算法,就是大名鼎鼎的 RSA,這也是當今公鑰密碼演算法事實上的標准。其實,公鑰密碼演算法還包括ElGamal、Rabin、橢圓曲線等多種演算法,這一節主要講述 RSA 演算法的基本數學原理。
一堆符號,解釋下,E 代表 Encryption,D 代表 Decryption,N 代表 Number。
從公式種能夠看出來,RSA的加解密數學公式非常簡單(即非常美妙)。 RSA 最復雜的並非加解密運算,而是如何生成密鑰對 ,這和對稱密鑰演算法是不太一樣的。 而所謂的嚴密的數學計算關系,就是指 E 和 D 不是隨便選擇的 。
密鑰對的生成,是 RSA 最核心的問題,RSA 的美妙與奧秘也藏在這裡面。
1. 求N
求 N 公式:N = p × q
其中, p 和 q 是兩個質數 ,而且應該是很大又不是極大的質數。如果太小的話,密碼就容易被破解;如果極大的話,計算時間就會很長。比如 512 比特的長度(155 位的十進制數字)就比較合適。
這樣的質數是如何找出來的呢? 需要通過 「偽隨機數生成器(PRNG)」 進行生成,然後再判斷其是否為質數 。如果不是,就需要重新生成,重新判斷。
2. 求L
求 L 公式:L = lcm(p-1, q-1)
lcm 代表 「最小公倍數(least common multiple)」 。注意,L 在加解密時都不需要, 僅出現在生成密鑰對的過程中 。
3. 求E
E 要滿足兩個條件:
1)1 < E < L
2)gcd(E,L) = 1
gcd 代表 「最大公約數(greatest common divisor)」 。gcd(E,L) = 1 就代表 「E 和 L 的最大公約數為1,也就是說, E 和 L 互質 」。
L 在第二步已經計算出來,而為了找到滿足條件的 E, 第二次用到 「偽隨機數生成器(PRNG)」 ,在 1 和 L 之間生成 E 的候選,判斷其是否滿足 「gcd(E,L) = 1」 的條件。
經過前三步,已經能夠得到密鑰對種的 「公鑰:{E, N}」 了。
4. 求D
D 要滿足兩個條件:
1)1 < D < L
2)E × D mod L = 1
只要 D 滿足上面的兩個條件,使用 {E, N} 進行加密的報文,就能夠使用 {D, N} 進行解密。
至此,N、L、E、D 都已經計算出來,再整理一下
模擬實踐的過程包括兩部分,第一部分是生成密鑰對,第二部分是對數據進行加解密。為了方便計算,都使用了較小的數字。
第一部分:生成密鑰對
1. 求N
准備兩個質數,p = 5,q = 7,N = 5 × 7 = 35
2. 求L
L = lcm(p-1, q-1) = lcm (4, 6) = 12
3. 求E
gcd(E, L) = 1,即 E 和 L 互質,而且 1 < E < L,滿足條件的 E 有多個備選:5、7、11,選擇最小的 5 即可。於是,公鑰 = {E, N} = {5, 35}
4. 求D
E × D mod L = 1,即 5 × D mod 12 = 1,滿足條件的 D 也有多個備選:5、17、41,選擇 17 作為 D(如果選擇 5 恰好公私鑰一致了,這樣不太直觀),於是,私鑰 = {D, N} = {17, 35}
至此,我們得到了公私鑰對:
第二部分:模擬加解密
明文我們也使用一個比較小的數字 -- 4,利用 RSA 的加密公式:
密文 = 明文 ^ E mod N = 4 ^ 5 mod 35 = 9
明文 = 密文 ^ D mod N = 9 ^ 17 mod 35 = 4
從這個模擬的小例子能夠看出,即使我們用了很小的數字,計算的中間結果也是超級大。如果再加上偽隨機數生成器生成一個數字,判斷其是否為質數等,這個過程想想腦仁兒就疼。還好,現代晶元技術,讓計算機有了足夠的運算速度。然而,相對於普通的邏輯運算,這類數學運算仍然是相當緩慢的。這也是一些非對稱密碼卡/套件中,很關鍵的性能規格就是密鑰對的生成速度
公鑰密碼體系中,用公鑰加密,用私鑰解密,公鑰公開,私鑰隱藏。因此:
加密公式為:密文 = 明文 ^ E mod N
破譯的過程就是對該公式進行逆運算。由於除了對明文進行冪次運算外, 還加上了「模運算」 ,因此在數學上, 該逆運算就不再是簡單的對數問題,而是求離散對數問題,目前已經在數學領域達成共識,尚未發現求離散對數的高效演算法 。
暴力破解的本質就是逐個嘗試。當前主流的 RSA 演算法中,使用的 p 和 q 都是 1024 位以上,這樣 N 的長度就是 2048 位以上。而 E 和 D 的長度和 N 差不多,因此要找出 D,就需要進行 2048 位以上的暴力破解。即使上文那個簡單的例子,算出( 蒙出 ) 「9 ^ D mod 35 = 4」 中的 D 也要好久吧。
因為 E 和 N 是已知的,而 D 和 E 在數學上又緊密相關(通過中間數 L),能否通過一種反向的演算法來求解 D 呢?
從這個地方能夠看出,p 和 q 是極為關鍵的,這兩個數字不泄密,幾乎無法通過公式反向計算出 D。也就是說, 對於 RSA 演算法,質數 p 和 q 絕不能被黑客獲取,否則等價於交出私鑰 。
既然不能靠搶,N = p × q,N是已知的,能不能通過 「質因數分解」 來推導 p 和 q 呢?或者說, 一旦找到一種高效的 「質因數分解」 演算法,就能夠破解 RSA 演算法了 。
幸運的是,這和上述的「離散對數求解」一樣,當下在數學上還沒有找到這種演算法,當然,也無法證明「質因數分解」是否真的是一個困難問題 。因此只能靠硬算,只是當前的算力無法在可現實的時間內完成。 這也是很多人都提到過的,「量子時代來臨,當前的加密體系就會崩潰」,從算力的角度看,或許如此吧 。
既不能搶,也不能算,能不能猜呢?也就是通過 「推測 p 和 q 進行破解」 。
p 和 q 是通過 PRNG(偽隨機數生成器)生成的,於是,又一個關鍵因素,就是採用的 偽隨機數生成器演算法要足夠隨機 。
隨機數對於密碼學極為重要,後面會專門寫一篇筆記 。
前三種攻擊方式,都是基於 「硬碰硬」 的思路,而 「中間人攻擊」 則換了一種迂迴的思路,不去嘗試破解密碼演算法,而是欺騙通信雙方,從而獲取明文。具體來說,就是: 主動攻擊者 Mallory 混入發送者和接收者之間,面對發送者偽裝成接收者,面對接收者偽裝成發送者。
這個過程可以重復多次。需要注意的是,中間人攻擊方式不僅能夠針對 RSA,還可以針對任何公鑰密碼。能夠看到,整個過程中,公鑰密碼並沒有被破譯,密碼體系也在正常運轉,但機密性卻出現了問題,即 Alice 和 Bob 之間失去了機密性,卻在 Alice 和 Mallory 以及 Mallory 和 Bob 之間保持了機密性。即使公鑰密碼強度再強大 N 倍也無濟於事。也就是說,僅僅依靠密碼演算法本身,無法防禦中間人攻擊 。
而能夠抵禦中間人攻擊的,就需要用到密碼工具箱的另一種武器 -- 認證 。在下面一篇筆記中,就將涉及這個話題。
好了,以上就是公鑰密碼的基本知識了。
公鑰密碼體系能夠完美的解決對稱密碼體系中 「密鑰配送」 這個關鍵問題,但是拋開 「中間人攻擊」 問題不談,公鑰密碼自己也有個嚴重的問題:
公鑰密碼處理速度遠遠低於對稱密碼。不僅體現在密鑰對的生成上,也體現在加解密運算處理上。
因此,在實際應用場景下,往往會將對稱密碼和公鑰密碼的優勢相結合,構建一個 「混合密碼體系」 。簡單來說: 首先用相對高效的對稱密碼對消息進行加密,保證消息的機密性;然後用公鑰密碼加密對稱密碼的密鑰,保證密鑰的機密性。
下面是混合密碼體系的加解密流程圖。整個體系分為左右兩個部分:左半部分加密會話密鑰的過程,右半部分是加密原始消息的過程。原始消息一般較長,使用對稱密碼演算法會比較高效;會話密鑰一般比較短(十幾個到幾十個位元組),即使公鑰密碼演算法運算效率較低,對會話密鑰的加解密處理也不會非常耗時。
著名的密碼軟體 PGP、SSL/TLS、視頻監控公共聯網安全建設規范(GB35114) 等應用,都運用了混合密碼系統。
好了,以上就是公鑰密碼演算法的全部內容了,拖更了很久,以後還要更加勤奮一些。
為了避免被傻啦吧唧的審核機器人處理,後面就不再附漂亮姑娘的照片(也是為了你們的健康),改成我的攝影作品,希望不要對收視率產生影響,雖然很多小伙兒就是沖著姑娘來的。
就從喀納斯之旅開始吧。
❷ 你好,隨機數有規律嗎畢竟程序也是人製造出來的!
隨機數分兩種:偽隨機數和密碼學隨機數。偽隨機數(rand)是有一定規律的,這主要和操作系統以及庫函數有關,有人利用這種規律實現過攻擊。密碼學隨機數的規律就很難找了,不過要使用密碼學隨機數往往需要特殊的硬體。
❸ 計算機程序可以產生真正的隨機數嗎不是random偽隨機
光靠程序是無法實現真隨機數的。要實現真正的隨機數,必須有真正隨機的種子。
在計算機中並沒有一個真正的隨機數發生器,但是可以做到使產生的數字重復率很低,這樣看起來好象是真正的隨機數,實現這一功能的程序叫偽隨機數發生器。
有關如何產生隨機數的理論有許多,如果要詳細地討論,需要厚厚的一本書的篇幅。不管用什麼方法實現隨機數發生器,都必須給它提供一個名為「種子」的初始值。而且這個值最好是隨機的,或者至少這個值是偽隨機的。「種子」的值通常是用快速計數寄存器或移位寄存器來生成的。
(3)密碼學隨機數擴展閱讀:
隨機數在密碼學中非常重要,保密通信中大量運用的會話密鑰的生成即需要真隨機數的參與。如果一個隨機數生成演算法是有缺陷的,那麼會話密鑰可以直接被推算出來。若果真發生這種事故,那麼任何加密演算法都失去了意義。
密碼學中大量利用偽隨機數生成器的應用還有流密碼。流密碼的著名例子是RC4。流密碼的原理是利用一個密碼學安全的偽隨機數生成器根據密鑰產生一串密碼學安全的偽隨機比特列,再將消息與上述隨機比特列按位異或運算。
❹ 什麼是隨機數及隨機數種子,能不能詳細通俗介紹一下
隨機數在科學研究與工程實際中有著極其重要的應用!
簡單來說,隨機數就是一個數列,這個數列可能滿足一定的概率分布,也許其滿足的分布並不為我們所知。
不知道你是否知道一個經典的例子:「使用一根針和兩條線求圓周率」(如果不知到你可以搜一下)。這個實驗我們可以使用數學模擬(蒙特卡羅模擬)的方法來進行,這樣可以最大限度的節約實驗所消耗的時間(使用計算機),也在一定程度上剔除了人為因素的影響。但有一個前提必須考慮,就是模擬的隨機性要好。怎樣體現呢,這時就需要使用「好」的隨機數來替代我們的物理實驗。
據我所知,隨機數在科學預測上有著非常重要的應用!還有密碼學中,隨機數也是基礎之一。
數學方法產生隨機數應該稱之為「偽隨機數」,只有使用物理方法才能得到真正的隨機數!
為了得到數學上的偽隨機數,我們就要研究「為隨機數發生器」!
通常,0-1區間上的均勻隨機數是基礎的基礎,因此,大量的工作是圍繞它展開的!在此基礎之上,又可以得到符合正態分布,beta分布等的偽隨機數。
「種子」是什麼呢?
經典的偽隨機數發生器是這樣的:
X(n+1)=
a
*
X(n)
+
b
顯然通過上式我們能夠得到一個數列,前提是X(0)應該給出,依次我們就可以算出X(1),X(2)...;當然不同的X(0)就會得到不同的數列。
可以說:「X(0)」就是種子。
對於一個應用級的偽隨機數發生器,所有的「偽隨機數」,均勻的分布於一個「軌道」上,幾乎所有的數都可以做為種子。數字「0」,有時是一個特例,不能作為種子,當然它取決於你使用的隨機數發生器!
呵呵,樓上說的言簡意賅,但那個函數並不復雜,你可以搜一下「素數模偽隨機數發生器」
X(n+1)=
a
*
X(n),
只不過這個a的確定不是太簡單,要求隨機性好(期望0.5,標准差1/12);周期長!
當然還有更好的發生器,周期可達2^6xxxx
-
1(具體的忘了)!
❺ 一到五隨機數是什麼
一到五隨機數是1和4。
產生隨機數有多種不同的方法。隨機數最重要的特性是:它所產生的後面的那個數與前面的那個數毫無關系。一到五隨機數是1和4。
用法:
隨機數在密碼學中非常重要,保密通信中大量運用的會話密鑰的生成即需要真隨機數的參與。如果一個隨機數生成演算法是有缺陷的,那麼會話密鑰可以直接被推算出來。若果真發生這種事故,那麼任何加密演算法都失去了意義。
密碼學中大量利用偽隨機數生成器的應用還有流密碼。流密碼的著名例子是RC4。流密碼的原理是利用一個密碼學安全的偽隨機數生成器根據密鑰產生一串密碼學安全的偽隨機比特列,再將消息與上述隨機比特列按位異或運算。