公鑰密碼學演算法型別綜述

Satar07發表於2024-03-14

作者:網安新生研討課第一小組
採用協議 CC BY-NC,原文連結 :https://www.cnblogs.com/Multya/p/18072514

概念

公開金鑰密碼學(英語:Public-key cryptography)也稱非對稱式密碼學(英語:Asymmetric cryptography)是密碼學的一種演算法,它需要兩個金鑰,一個是公開金鑰,另一個是私有金鑰;公鑰用作加密,私鑰則用作解密

使用公鑰把明文加密後所得的密文,只能用相對應的私鑰才能解密並得到原本的明文,最初用來加密的公鑰不能用作解密。由於加密和解密需要兩個不同的金鑰,故被稱為非對稱加密;不同於加密和解密都使用同一個金鑰的對稱加密

公鑰可以公開,可任意向外發布;私鑰不可以公開,必須由使用者自行嚴格秘密保管,絕不透過任何途徑向任何人提供,也不會透露給被信任的要通訊的另一方。

公鑰密碼,又稱非對稱密碼,比較常見的是基於以下三種數學難題的公鑰密碼體制;

  1. 大數因子分解難解性(RSA)

  2. 離散對數難解性(ElGamal)

  3. 橢圓曲線離散對數難解性(ECC)

歷史

公鑰加密思想最早由瑞夫·墨克在1974年提出,之後在1976年。惠特菲爾德·迪菲與馬丁·赫爾曼兩位學者以單向函式單向暗門函式為基礎,為發訊與收訊的兩方建立金鑰。

瑞夫·查爾斯·墨克(英語:Ralph Charles Merkle,1952年2月2日-),生於美國,電腦科學家,對於公開金鑰加密技術有重大貢獻。1979年在史丹佛大學取得電機工程博士學位。博士論文主題為〈加密,授權與公開金鑰系統〉(Secrecy, authentication and public key systems)。

惠特菲爾德·迪菲(Whitfield Diffie),1944年出生於美國華盛頓特區,現代密碼學之父,公鑰密碼學先驅,2015年圖靈獎得主,美國國家工程院院士,英國皇家學會外籍院士。

惠特菲爾德·迪菲於1965年獲得麻省理工學院數學專業學士學位;1965年至1969年擔任MITRE公司研究助理;2015年獲得ACM圖靈獎;2017年當選為美國國家工程院院士。

馬丁·赫爾曼,密碼學和網路安全技術專家,主要論文有《密碼學新動向》(New Directions in Cryptography)。迪菲與赫爾曼1976年發表了論文《密碼學新動向》,在其中闡述了關於公開金鑰加密演算法的新構想,即在一個完全開放的通道內,人們無需事先約定,便可進行安全的資訊傳輸。獲得2015年度圖靈獎。

單向函式 (One-way function)是一種具有下述特點的單射函式:對於每一個輸入,函式值都容易計算(多項式時間),但是給出一個隨機輸入的函式值,算出原始輸入卻比較困難(無法在多項式時間內使用確定性圖靈機計算)。 單向函式是否存在仍然是電腦科學中的一個開放性問題。

給定任意兩個集合X和Y。 函式f:X→Y稱為單向的,如果對每一個x屬於X,很容易計算出函式f(x)的值,而對大多數y屬於Y,要確定滿足y=f(x)的x是計算上困難的(假設至少有這樣一個x存在)。注意,不能將單向函式的概念與數學意義上的不可逆函式的概念混同,因為單向函式可能是一個數學意義上可逆或者一對一的函式,而一個不可逆函式卻不一定是單向函式。

還沒有人能夠從理論上證明單向函式是存在的。單向函式存在性的證明將意味著電腦科學中一個最具挑戰性的猜想P=NP,即NP完全問題的解決,而關於NP完全性的理論卻不足以證明單向函式的存在。有幸的是,現實中卻存在幾個單向函式的“候選”。說他們是“候選”,是因為他們表現出了單向函式的性質,但還沒有辦法從理論上證明它們一定是單向函式。

一個最簡單的、大家熟知的“侯選”單向函式就是整數相乘。眾所周知,不管給定兩個多大的整數,我們很容易計算出它們的乘積,而對於一個300位左右的十進位制整數,即使已知它是兩個大小差不多(150位左右的十進位制數)的素數之積,用世界上計算能力最強的計算機,也沒有辦法在一個合理的時間內分解出構成這個整數的兩個素數因子來。這裡講的“合理的時間”是指一個可度量的相當長的時間,比如人類或者地球的壽命等。

單向函式不能直接用作密碼體制,因為它的求逆困難,用它加密的資訊誰都不能解密。但是,單向函式在密碼學領域裡卻發揮著非常重要的作用。

一個最簡單的應用就是口令保護。我們熟知的口令保護方法是用對稱加密演算法進行加密。系統方只存放口令經單向函式運算過的函式值,驗證是將使用者口令重新計算函式值與系統中存放的值進行比對。動態口令認證機制多是基於單向函式的應用來設計的。

單向函式的另一個應用是大家熟知的用於數字簽名時產生資訊摘要的單向雜湊函式。

有些學者把現實中使用的密碼演算法分成三類,單向雜湊函式就是其中很重要的一類,另外兩類分別是公開鑰(或非對稱、雙鑰)演算法和秘金鑰(或對稱、單鑰)演算法。單向函式是這三類演算法共同的基礎。

發展和分類

最開始的情況:資訊明文傳遞

但是出現了缺陷:中間資訊傳遞的過程中可能被人(中間人)截獲,可能導致:

  1. 機密、隱私的資訊被獲取

  2. 傳遞的關鍵資訊被惡意改變

於是傳送者和接受者找到一種方法,讓中間人看不懂,這樣就有效防止了機密、隱私資訊被獲取

因為即使傳遞的資訊被獲取,在被解密之前這個資訊就是無用的資訊

私鑰密碼產生的原因:

  1. 簡單和高效: 私鑰密碼系統是最早的密碼系統之一,它們通常基於置換和替換的原理,簡單而高效。由於金鑰是對稱的,因此加密和解密的速度較快,適用於大量資料的加密和解密操作。

  2. 適用於封閉環境: 在某些情況下,傳送方和接收方在物理上是相互信任的,因此可以共享同一把金鑰而不必擔心金鑰的安全性。在這種封閉環境下,私鑰密碼系統是一種簡單而有效的加密方式。

  3. 金鑰管理簡單: 私鑰密碼系統只需要管理一把金鑰,因此金鑰管理相對簡單。在小規模系統中,可以輕鬆地管理和維護金鑰,不需要複雜的金鑰分發和更新機制。

公鑰密碼產生的原因:

  1. 解決金鑰配送問題: 對稱金鑰演算法在使用過程中需要傳送方和接收方共享同一把金鑰,但是如何安全地將金鑰傳輸給對方是一個挑戰。公鑰密碼系統透過使用公鑰和私鑰,避免了金鑰配送問題,公鑰可以公開發布而私鑰保留在接收方手中。

  2. 提高通訊安全性: 對稱金鑰演算法存在一個重要問題是金鑰管理的複雜性,特別是在大規模系統中。如果金鑰洩漏或被破解,所有的通訊都可能會暴露在風險之下。公鑰密碼系統透過使用非對稱金鑰對,降低了金鑰管理的複雜性,並提高了通訊的安全性。

  3. 數字簽名和身份驗證: 公鑰密碼系統不僅可以用於加密通訊,還可以用於數字簽名和身份驗證。傳送方可以使用自己的私鑰生成數字簽名,接收方使用傳送方的公鑰驗證數字簽名,從而確保訊息的完整性和真實性。

資料加密型別

揹包演算法

揹包演算法是由Merkle和Hellman開發的揹包演算法。只能用於加密,後來由Shamir將它改進,使之也能用於數字簽名;

揹包演算法的安全性起源於揹包難題,他是一個NP完全問題,但後來發現該演算法並不安全,但是由於它證明了如何將NP完全問題用於公開秘鑰密碼學,因此,值得去學習。

RSA

一、歷史

對稱加密模式有一個最大弱點:甲方必須把加密規則告訴乙方,否則無法解密。儲存和傳遞金鑰,就成了最頭疼的問題。

1976年,兩位美國計算機學家Whitfield Diffie 和 Martin Hellman,提出了一種嶄新構思,可以在不直接傳遞金鑰的情況下,完成解密。這被稱為"Diffie-Hellman金鑰交換演算法"。這個演算法啟發了其他科學家。人們認識到,加密和解密可以使用不同的規則,只要這兩種規則之間存在某種對應關係即可,這樣就避免了直接傳遞金鑰。

這種新的加密模式被稱為"非對稱演算法"。

(1)乙方生成兩把金鑰(公鑰和私鑰)。公鑰是公開的,任何人都可以獲得,私鑰則是保密的。

(2)甲方獲取乙方的公鑰,然後用它對資訊加密。

(3)乙方得到加密後的資訊,用私鑰解密。

如果公鑰加密的資訊只有私鑰解得開,那麼只要私鑰不洩漏,通訊就是安全的。

1977年,三位數學家Rivest、Shamir 和 Adleman 設計了一種演算法,可以實現非對稱加密。這種演算法用他們三個人的名字命名,叫做RSA演算法。從那時直到現在,RSA演算法一直是最廣為使用的"非對稱加密演算法"。毫不誇張地說,只要有計算機網路的地方,就有RSA演算法。

這種演算法非常可靠,金鑰越長,它就越難破解。根據已經披露的文獻,目前被破解的最長RSA金鑰是768個二進位制位。也就是說,長度超過768位的金鑰,還無法破解(至少沒人公開宣佈)。因此可以認為,1024位的RSA金鑰基本安全,2048位的金鑰極其安全。

二、數學概念

任意給定正整數n,請問在小於等於n的正整數之中,有多少個與n構成互質關係?

計算這個值的方法就叫做尤拉函式,以φ(n)表示。在1到8之中,與8形成互質關係的是1、3、5、7,所以 φ(n) = 4。

尤拉函式的用處,在於尤拉定理。"尤拉定理"指的是:

如果兩個正整數a和n互質,則n的尤拉函式 φ(n) 可以讓下面的等式成立:

\[a^{\phi(n)}\equiv_{1}(mod n) \]

也就是說,a的φ(n)次方被n除的餘數為1。或者說,a的φ(n)次方減去1,可以被n整除。比如,3和7互質,而7的尤拉函式φ(7)等於6,所以3的6次方(729)減去1,可以被7整除(728/7=104)。

尤拉定理的證明比較複雜,這裡就省略了。我們只要記住它的結論就行了。

尤拉定理可以大大簡化某些運算。比如,7和10互質,根據尤拉定理,

已知 φ(10) 等於4,所以馬上得到7的4倍數次方的個位數肯定是1。

尤拉定理是RSA演算法的核心。理解了這個定理,就可以理解RSA。

還剩下最後一個概念:

如果兩個正整數a和n互質,那麼一定可以找到整數b,使得 ab-1 被n整除,或者說ab被n除的餘數是1。

這時,b就叫做a的模反元素,用於計算私鑰

比如,3和11互質,那麼3的模反元素就是4,因為 (3 × 4)-1 可以被11整除。顯然,模反元素不止一個, 4加減11的整數倍都是3的模反元素 {...,-18,-7,4,15,26,...},即如果b是a的模反元素,則 b+kn 都是a的模反元素。

尤拉定理可以用來證明模反元素必然存在。

可以看到,a的 φ(n)-1 次方,就是a的模反元素。


好了,需要用到的數學工具,全部介紹完了。RSA演算法涉及的數學知識,就是上面這些,下一次我就來介紹公鑰和私鑰到底是怎麼生成的。


三、金鑰的生成步驟

前面我介紹了一些數論知識。 有了這些知識,我們就可以看懂RSA演算法。這是目前地球上最重要的加密演算法。

第一步,隨機選擇兩個不相等的質數p和q。

選擇了61和53。(實際應用中,這兩個質數越大,就越難破解。)p=61 q=53

第二步,計算p和q的乘積n。

n = 61×53 = 3233

n的長度就是金鑰長度。3233寫成二進位制是110010100001,一共有12位,所以這個金鑰就是12bit。實際應用中,RSA金鑰一般是1024位,重要場合則為2048位。

第三步,計算n的尤拉函式φ(n)。

根據公式:

φ(n) = (p-1)(q-1)

算出φ(3233)等於60×52,即3120。

第四步,在1和φ(n)之間隨機選擇一個整數e(e和φ(n)需要互質)

在1到3120之間,隨機選擇了17。(實際應用中,常常選擇65537。)

第五步,計算e對於φ(n)的模反元素d。

所謂模反元素就是指有一個整數d,可以使得ed被φ(n)除的餘數為1。

ed ≡ 1 (mod φ(n))

這個式子等價於

ed - 1 = kφ(n)

於是,找到模反元素d,實質上就是對下面這個二元一次方程求解。

ex + φ(n)y = 1

已知 e=17, φ(n)=3120,

17x + 3120y = 1

算出一組整數解為 (x,y)=(2753,-15),即 d=2753。

至此所有計算完成。

第六步,將n(起初選擇的兩個質數的乘積)和e(1和φ(n)之間選擇的數)封裝成公鑰,n和d封裝成私鑰。

在例子中,n=3233,e=17,d=2753,所以公鑰就是 (3233,17),私鑰就是(3233, 2753)。

實際應用中,公鑰和私鑰的資料都採用ASN.1格式表達。

RSA演算法的可靠性

回顧上面的金鑰生成步驟,一共出現六個數字:

p   q(選擇的兩個質數)   n(p*q)   φ(n)(n的尤拉函式值)   e(1和φn之間隨機選擇的,非φn因子的質數)   d(ex + φ(n)y = 1 x的整數解)

這六個數字之中,公鑰用到了兩個(n和e),其餘四個數字都是不公開的。其中最關鍵的是d,因為n和d組成了私鑰,一旦d洩漏,就等於私鑰洩漏。

那麼,有無可能在已知n和e(公鑰)的情況下,推匯出d(私鑰)?

下面是計算d的步驟

(1)ed≡1 (mod φ(n))(就是ed - 1 = kφ(n))。只有知道e和φ(n),才能算出d。

(2)φ(n)=(p-1)(q-1)。只有知道p和q,才能算出φ(n)。

(3)n=pq。只有將n因數分解,才能算出p和q。

結論:如果因數分解n得到pq,d就可以算出,也就意味著私鑰被破解。

可是,大整數的因數分解,是一件非常困難的事情。目前,除了暴力破解,還沒有發現別的有效方法。

你可能覺得:把一個數分解成質數的乘積不是很難

那麼請你分解下面這個數:(逗號是分級)

1230,1866,8453,0117,7551,3049,4958,3849,6272,0772,8535,6959,5334,7921,9732,2452,1517,2640,0507,2636,5751,8745,2021,9978,6469,3899,5647,4942,7740,6384,5925,1925,5732,6303,4537,3154,8268,5079,1702,6122,1429,1346,1670,4292,1431,1602,2212,4047,9274,7377,9408,0665,3514,1959,7459,8569,0214,3413

事實上它等於這樣兩個質數的乘積:

33478071698956898786044169848212690817704794983713768568912431388982883793878002287614711652531743087737814467999489 × 36746043666799590428244633799627952632279158164343087642676032283815739666511279233373417143396810270092798736308917

事實上,這大概是人類已經分解的最大整數(232個十進位制位,768個二進位制位)。比它更大的因數分解,還沒有被報導過,因此目前被破解的最長RSA金鑰就是768位。

四、加密與解密

有了公鑰和金鑰,就能進行加密和解密了。

(1)加密要用公鑰 (n,e)

假設鮑勃要向愛麗絲髮送加密資訊m,他就要用愛麗絲的公鑰 (n,e) 對m進行加密。這裡需要注意,m必須是整數(字串可以取ascii值或unicode值),且m必須小於n。

所謂"加密",就是算出下式的c:

\[m^e ≡ c (mod n) \]

愛麗絲的公鑰是 (3233, 17),鮑勃的m假設是65,那麼可以算出下面的等式:

\[65^{17} ≡ 2790 (mod 3233) \]

於是,c等於2790,鮑勃就把2790發給了愛麗絲。

(2)解密要用私鑰 (n,d)

愛麗絲拿到鮑勃發來的2790以後,就用自己的私鑰(3233, 2753) 進行解密。可以證明,下面的等式一定成立:

\[c^d ≡ m (mod n) \]

也就是說,c的d次方除以n的餘數為m。現在,c等於2790,私鑰是(3233, 2753),那麼,愛麗絲算出

\[2790^{2753} ≡ 65 (mod 3233) \]

因此,愛麗絲知道了鮑勃加密前的原文就是65。

至此,"加密--解密"的整個過程全部完成。

我們可以看到,如果不知道d,就沒有辦法從c求出m。而前面已經說過,要知道d就必須分解n,這是極難做到的,所以RSA演算法保證了通訊安全。

你可能會問,公鑰(n,e) 只能加密小於n的整數m,那麼如果要加密大於n的整數,該怎麼辦?有兩種解決方法:一種是把長資訊分割成若干段短訊息,每段分別加密;另一種是先選擇一種"對稱性加密演算法"(比如DES),用這種演算法的金鑰加密資訊,再用RSA公鑰加密DES金鑰。

Rabin

Rabin是RSA演算法的一種特例,它使用的是平方剩餘問題(Quadratic Residuosity Problem)而不是RSA演算法中使用的尤拉函式(Euler's Totient Function)。

在Rabin演算法中,公鑰和私鑰都是一個大素數。加密過程如下:

\[C = P^2 mod N \]

其中:

  • C 是密文

  • P 是明文

  • N 是公鑰

解密過程如下:

\[P = C^{0.5} mod N \]

其中:

  • P 是明文

  • C 是密文

  • N 是私鑰

Rabin演算法的安全性依賴於平方剩餘問題,即很難確定一個數是否是一個大素數的平方剩餘。

Rabin演算法的優點是計算速度快,缺點是安全性不如RSA演算法。

ElGamal

EIGamal產生的原因:

ElGamal演算法是一種非對稱加密演算法,在1985年由塔希爾•蓋莫爾提出,主要用於加密和數字簽名。它的產生源於對RSA演算法的補充和擴充。具體來說,ElGamal演算法的產生主要有以下幾個原因:

  1. 安全性需求增加: RSA演算法在1977年被提出時是一種非常強大的加密演算法,但隨著計算能力的增強和密碼學研究的進展,一些與RSA相關的攻擊方法逐漸被發現,使得RSA演算法的安全性受到了挑戰。因此,需要一種更為安全的替代方案。

  2. 多樣性和選擇: 在密碼學中,通常會提供多種演算法以供選擇,以適應不同的安全需求和應用場景。ElGamal演算法的提出豐富了非對稱加密演算法的選擇,並提供了一種新的加密和數字簽名方案。

  3. 數字簽名需求增加: 除了加密外,數字簽名也是資訊保安領域中的重要需求。ElGamal演算法不僅可以用於加密,還可以用於數字簽名,因此能夠滿足更廣泛的安全需求。

  4. 理論研究的推動: ElGamal演算法的提出也源於密碼學理論研究的推動。許多密碼學家在研究RSA演算法的同時,也在探索其他可能的加密方案,並最終提出了ElGamal演算法作為RSA演算法的一個重要補充。

ElGamal演算法的產生是為了滿足安全性需求增加、提供多樣性和選擇、滿足數字簽名需求以及推動密碼學理論研究等多方面原因。它的出現豐富了密碼學領域的演算法選擇,為資訊保安提供了更多的保障。

EIGamal演算法介紹:

image

Ecc

橢圓曲線密碼學(英語:Elliptic Curve Cryptography,縮寫:ECC)是一種基於橢圓曲線數學的公開金鑰加密演算法。

CC 的主要優勢是它相比 RSA 加密演算法使用較小的金鑰長度並提供相當等級的安全性。ECC 的另一個優勢是可以定義群之間的雙線性對映,基於Weil 對或是Tate 對;雙線性對映已經在密碼學中發現了大量的應用,例如基於身份的加密

數字簽名型別

RSA 數字簽名

原理類似於 RSA 加密,只是這裡使用私鑰進行加密,將加密後的結果作為簽名。

DSA

數字簽名演算法(DSA)是用於數字簽名的聯邦資訊處理標準之一,基於模算數和離散對數的複雜度。DSA是Schnorr和ElGamal簽名方案的變體。

美國國家標準技術研究所(NIST)於1991年提出將DSA用於其數字簽名標準(DSS),並於1994年將其作為FIPS 186採用。已對初始規範進行了四次修訂。DSA已獲得專利,但NIST已將此專利在全球範圍內買斷式授權。

DSA的橢圓曲線密碼學版本是ECDSA。

DSA演算法工作在框架公鑰加密、模算數和離散對數問題,這被認為是難解問題。該演算法使用由公鑰私鑰組成的金鑰對。私鑰用於生成訊息的數字簽名,並且可以透過使用簽名者的相應公鑰來驗證這種簽名。數字簽名提供資訊鑑定(接收者可以驗證訊息的來源),完整性(接收方可以驗證訊息自簽名以來未被修改)和不可否認性(傳送方不能錯誤地聲稱它們沒有簽署訊息)。

DSA(Digital Signature Algorithm)是一種基於整數分解難題的數字簽名演算法,其原理依賴於離散對數問題的難解性。DSA是Schnorr簽名演算法的一個變種,被設計用來提供數字簽名的安全性。

ECDSA

ECDSA是Elliptic Curve Digital Signature Algorithm的簡稱,主要用於對資料(比如一個檔案)建立數字簽名,以便於你在不破壞它的安全性的前提下對它的真實性進行驗證。可以將它想象成一個實際的簽名,你可以識別部分人的簽名,但是你無法在別人不知道的情況下偽造它。而ECDSA簽名和真實簽名的區別在於,偽造ECDSA簽名是根本不可能的。

你不應該將ECDSA與用來對資料進行加密的AES(高階加密標準)相混淆。ECDSA不會對資料進行加密、或阻止別人看到或訪問你的資料,它可以防止的是確保資料沒有被篡改。

原理非常簡單,有一個數學方程,在圖上畫了一條曲線,然後你在這條曲線上面隨機選取了一個點作為你的原點(point of origin)。接著你產生了一個隨機數,作為你的私鑰(Private key),最後你用上面的隨機數和原點透過一些複雜的魔法數學方程得到該條曲線上面的第二個點,這是你的公鑰(Public key)。

當你想要對一個檔案進行簽名的時候,你會用這個私鑰(隨機數)和檔案的雜湊(一串獨一無二的代表該檔案的數)組成一個魔法數學方程,這將給出你的簽名。簽名本身將被分成兩部分,稱為R和S。為了驗證簽名的正確性,你只需要公鑰(用私鑰在曲線上面產生的點)並將公鑰和簽名的一部分S一起代入另外一個方程,如果這個簽名是由私鑰正確簽名過的數字簽名,那麼它將給出簽名的另外一部分R。簡單來說,一個數字簽名包含兩個數字,R和S,然後你使用一個私鑰來產生R和S,如果將公鑰和S代入被選定的魔法數學方程給出R的話,這個簽名就是有效的。僅僅知道公鑰是無法知道私鑰或者建立出數字簽名

身份基加密

公鑰身份化

該定義是傳統公鑰加密的演變,在身份基加密中直接將使用者的身份(唯一標識特徵)作為公鑰。這樣一來,每個人只需要儲存一個私鑰即可。

基於身份的加密方案(IBE)的思想,最早是由Shamir在1984年提出。方案中不必使用證書,直接將使用者的身份(唯一標識特徵)作為公鑰,這樣簡化了公鑰基礎設施(PKI)中基於證書的金鑰管理。該思想提出之後一直沒有合適工具實現,成為一個公開問題。直到2001年,Dan Boneh和Matt Franklin利用橢圓曲線上的雙線性對映(即Weil對和Tate對)實現了第一個實用的身份基加密方案,這為身份基加密的研究開啟了新的篇章。身份基加密主要由以下四個演算法構成:

  • 初始化演算法(Setup) 給定安全引數,輸出一個主公鑰_mpk_和主私鑰_msk_。

  • 金鑰提取演算法(Keygen) 輸入主私鑰_msk_和身份串_ID_,輸出該身份下的私鑰_skID_。

  • 加密演算法(Enc) 輸入主公鑰_mpk_、身份串_ID_以及明文訊息_x_,輸出密文_c_。

  • 解密演算法(Dec) 輸入身份私鑰_SKID_和密文_c_,輸出明文訊息_x_(或者解密失敗)

相關文章