導航:首頁 > 文檔加密 > 公鑰加密私鑰加密流程圖

公鑰加密私鑰加密流程圖

發布時間:2025-06-28 00:29:55

⑴ 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) 等應用,都運用了混合密碼系統。

好了,以上就是公鑰密碼演算法的全部內容了,拖更了很久,以後還要更加勤奮一些。

為了避免被傻啦吧唧的審核機器人處理,後面就不再附漂亮姑娘的照片(也是為了你們的健康),改成我的攝影作品,希望不要對收視率產生影響,雖然很多小伙兒就是沖著姑娘來的。

就從喀納斯之旅開始吧。

⑵ 誰知道怎麼給文件加密啊

用這個軟體,非常簡單

文件加密解密系統 V2.2

下載地址

http://www.skycn.com/soft/7060.html

⑶ 非對稱加密和對稱加密的區別

非對稱加密和對稱加密在加密和解密過程、加密解密速度、傳輸的安全性上都有所不同,具體介紹如下:

1、加密和解密過程不同

對稱加密過程和解密過程使用的同一個密鑰,加密過程相當於用原文+密鑰可以傳輸出密文,同時解密過程用密文-密鑰可以推導出原文。但非對稱加密採用了兩個密鑰,一般使用公鑰進行加密,使用私鑰進行解密。

2、加密解密速度不同

對稱加密解密的速度比較快,適合數據比較長時的使用。非對稱加密和解密花費的時間長、速度相對較慢,只適合對少量數據的使用。

3、傳輸的安全性不同

對稱加密的過程中無法確保密鑰被安全傳遞,密文在傳輸過程中是可能被第三方截獲的,如果密碼本也被第三方截獲,則傳輸的密碼信息將被第三方破獲,安全性相對較低。

非對稱加密演算法中私鑰是基於不同的演算法生成不同的隨機數,私鑰通過一定的加密演算法推導出公鑰,但私鑰到公鑰的推導過程是單向的,也就是說公鑰無法反推導出私鑰。所以安全性較高。

⑷ 利用RSA加密打造強大License驗證,確保軟體正版合法運行

在C#軟體開發中,License是確保軟體在合法授權下運行的關鍵要素。通過採用RSA非對稱加密方案,服務端生成帶有簽名的License,客戶端則驗證其有效性,以此實現軟體授權與安全控制。
License被廣泛應用於各種軟體場景,包括商業軟體、桌面應用及服務端應用等,確保軟體能在合法環境中運行。
非對稱加密技術是實現License的一種常見方法,它將License信息加密,並在軟體中內置公鑰,從而確保只有使用私鑰簽名的License才被驗證通過。
License驗證流程圖簡化如下:

1. 服務端生成License文件,包含軟體信息和私鑰簽名的哈希值。
2. 客戶端接收License文件。
3. 客戶端使用內置的公鑰解密哈希值。
4. 客戶端驗證解密後的哈希值與軟體中存儲的哈希值是否匹配。
5. 驗證通過後,軟體方可運行。

以下是一個簡單的C#示例,展示如何使用RSA非對稱加密實現License生成與驗證:

服務端(生成License):

csharp
public string GenerateLicense(string softwareInfo, string privateKey)
{
using (var rsa = new RSACryptoServiceProvider())
{
byte[] hashValue = System.Security.Cryptography.HashAlgorithmProvider
.GetAlgorithm("SHA256")
.CreateHash(Encoding.UTF8.GetBytes(softwareInfo))
.ToArray();

var privateKeyData = Convert.FromBase64String(privateKey);
rsa.ImportParameters(privateKeyData);

var signature = rsa.SignData(hashValue, "SHA256");

var encodedSignature = Convert.ToBase64String(signature);
var encodedHashValue = Convert.ToBase64String(hashValue);

return $"SoftwareInfo: {softwareInfo}\nSignature: {encodedSignature}\nHashValue: {encodedHashValue}";
}
}

客戶端(驗證License):

csharp
public bool ValidateLicense(string licenseContent)
{
try
{
var lines = licenseContent.Split(new[] { '\n' }, StringSplitOptions.RemoveEmptyEntries);
var softwareInfo = lines[0].Split(':')[1].Trim();
var signature = Convert.FromBase64String(lines[1].Split(':')[1].Trim());
var hashValue = Convert.FromBase64String(lines[2].Split(':')[1].Trim());

using (var rsa = new RSACryptoServiceProvider())
{
var publicKeyData = rsa.ExportParameters(true);
rsa.ImportParameters(publicKeyData);

var hashBytes = Encoding.UTF8.GetBytes(softwareInfo);
var computedSignature = rsa.SignData(hashBytes, "SHA256");

return signature.SequenceEqual(computedSignature);
}
}
catch
{
return false;
}
}

請注意,實際應用中,公鑰和私鑰需妥善保管,以確保系統安全。
為了獲取更多技術文章、資源以及與作者互動,請關注公眾號:架構師老盧
作者簡介:公眾號【架構師老盧】,頭條號【架構師老盧】,資深軟體架構師,分享編程、軟體設計經驗,傳授前沿技術,分享技術資源(每日分享一本電子書),以及職場感悟。

閱讀全文

與公鑰加密私鑰加密流程圖相關的資料

熱點內容
小狐狸製作app安卓版怎麼下載 瀏覽:754
安卓手機怎麼把聯系人存在sim卡 瀏覽:809
風速測量51單片機 瀏覽:658
如何找出安卓底下的三個按鈕 瀏覽:546
讀書郎里下的游戲被加密怎麼辦 瀏覽:786
猴子吃桃問題編程 瀏覽:212
華為手機有什麼伺服器地址 瀏覽:97
武漢java培訓 瀏覽:388
wf未加密安全嗎 瀏覽:31
怎麼看梅賽德斯賓士meapp的車子情況 瀏覽:44
使用貪心策略的演算法 瀏覽:916
炒菜葉子測試單片機 瀏覽:583
無限刷東西的命令 瀏覽:518
光遇安卓渠道服怎麼換另一個手機 瀏覽:68
程序員為什麼365天背電腦包 瀏覽:409
華為手錶加密門禁卡如何復制 瀏覽:5
bzip2linux命令 瀏覽:345
python入門最快的書 瀏覽:655
私人醫生pdf 瀏覽:528
程序員團隊分工那頂技術強 瀏覽:224