密鑰協商(密鑰交換)機制的講解

  • 國標文件涉及密鑰協商算法的函數

  • 生成密鑰協商參數并輸出
  • 計算會話密鑰
  • 產生協商數據并且計算會話密鑰

密鑰協商(交換)算法及其原理

密鑰交換/協商目的

  • “密鑰協商機制”是:(在身份認證的前提下)規避【偷窺】的風險。通俗地說,即使有攻擊者在偷窺客戶端與服務器的網絡傳輸,客戶端(client)依然可以利用“密鑰協商機制”與服務器端(server)協商出一個只有二者可知的用來對于應用層數據進行加密的密鑰(也稱“會話密鑰”)。

密鑰交換/協商機制的幾種類型

1,依靠非對稱加密算法

原理:

  • 拿到公鑰的一方先生成隨機的會話密鑰,然后利用公鑰加密它,再把加密結果發給對方,對方用私鑰解密;于是雙方都得到了會話密鑰。

舉例:

  • RSA、SM2

秘鑰協商/交換步驟

  1. 客戶端連上服務端
  2. 服務端發送 CA 證書給客戶端
  3. 客戶端驗證該證書的可靠性
  4. 客戶端從 CA 證書中取出公鑰
  5. 客戶端生成一個隨機密鑰 k,并用這個公鑰加密得到 k’
  6. 客戶端把 k’ 發送給服務端
  7. 服務端收到 k’ 后用自己的私鑰解密得到 k,此時雙方都得到了密鑰 k,協商完成。

例子:

  • RSA的秘鑰協商流程

  • SM2的秘鑰協商流程
  • 參考鏈接:SM2密鑰協商流程 - 百度文庫

2,依靠專門的密鑰交換算法

簡介:

  • DH 算法又稱“Diffie–Hellman 算法”,它可以做到“通訊雙方在完全沒有對方任何預先信息的條件下通過不安全信道創建起一個密鑰”, 即通訊雙方事先不需要有共享的秘密。而且,使用該算法協商密碼,即使協商過程中被別人全程偷窺(比如“網絡嗅探”),偷窺者也無法知道最終協商得出的密鑰結果。

缺點

  • 此算法不支持認證,雖然可以抵抗偷窺但是無法抵抗篡改,無法對抗中間人攻擊。一般此算法會配合其余的簽名算法搭配使用,比如RSA、DSA算法。

例子:

  1. Alice和Bob約定使用一個模 p = 23和g = 5
  2. Alice選擇一個保密的整數 a = 4作為私鑰,計算出公鑰 A = g^a mod p,將公鑰A發送給Bob;A = 5^4 mod 23 = 4
  3. Bob選在一個保密的整數 b = 3,計算出公鑰 B = g^b mod p,將公鑰B發送給Alice;
  4. B = 5^3 mod 23 = 10
  5. Alice 計算出共享密鑰 ?s = B^a mod p ??s = 10^4 mod 23 = 18
  6. Bob 計算共享密鑰 ???s = A^b mod p ??s = 4^3 mod 23 = 18
  7. Alice和Bob現在就共享一個密鑰(s = 18)

優勢

  1. 通信雙方分別計算出來的 k 必定是一致的
  2. 通信雙方都無法根據已知的數來推算出對方的私鑰
  3. 對于一個旁觀者(偷窺者),雖然能看到 p,g,A,B,但是無法推算出 a 和 b(旁觀者無法推算出雙方的私鑰),自然也無法推算出 k

注意事項:

  1. p 必須是質數且足夠大(至少300位)
  2. a,b 也要足夠大(至少100位),且必須是隨機生成。
  3. g 必須是質數,不需要很大,比如 2 或 3 或 5 都可以。g 如果太大并不能顯著提升安全性,反而會影響性能。

步驟:

  1. 客戶端連接上服務器;
  2. 服務器端生成一個隨機數S作為自己的私鑰,做模冪運算之后,得到公鑰;
  3. 服務器,選擇RSA,ECDSA,DSA的一種,對模冪運算的參數,以及公鑰進行簽名,并發送給客戶端; 防止服務器被篡改
  4. 客戶端驗證簽名是否有效; 客戶端并不會對簽名進行解密,DH的特性,雙方只交換公鑰,只做加密操作;
  5. 客戶端也產生一個隨機數C,加密之后,將公鑰傳給服務器;
  6. 客戶和服務器,根據得到的公鑰產生同一個會話密鑰;

3,依靠通訊雙方事先已經共享的“秘密”

簡介:

  • 既然雙方已經有共享的秘密(這個“秘密”可能已經是一個密鑰,也可能只是某個密碼/password),只需要根據某種生成算法,就可以讓雙方產生相同的密鑰(并且密鑰長度可以任意指定)
  • PSK 即“Pre-Shared Key”的縮寫,就是預先讓通信雙方共享一些秘鑰,這些秘鑰通常是對稱加密的秘鑰,所謂的預先是指這些秘鑰在雙方尚未構建TSL協議之前,就已經部署在雙方的系統之內了。

優勢:

  • 不需要依賴公鑰體系,不需要部屬 CA 證書。不需要涉及非對稱加密,TLS 協議握手(初始化)時的性能好于前述的 RSA 和 DH。

步驟:

  • 在通訊之前,通訊雙方已經預先部署了若干個共享的密鑰。為了標識多個密鑰,給每一個密鑰定義一個唯一的 ID。協商的過程很簡單:客戶端把自己選好的密鑰的 ID 告訴服務端。如果服務端在自己的密鑰池子中找到這個 ID,就用對應的密鑰與客戶端通訊,否則就報錯并中斷連接。

參考鏈接:

  • 密鑰交換(密鑰協商)算法及其原理 - Yungyu - 博客園
  • Diffie–Hellman key exchange DH密鑰協商_詹天佐的博客-CSDN博客
  • 密鑰協商機制 - 簡書
  • Diffie-Hellman密鑰協商算法 - Qcer - 博客園
  • https://wenku.baidu.com/view/a953fa07de80d4d8d15a4f0d.html#
  • HTTPS 溫故知新(三) —— 直觀感受 TLS 握手流程(上)
  • Diffie-Hellman密鑰協商算法 - Qcer - 博客園

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/447101.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/447101.shtml
英文地址,請注明出處:http://en.pswp.cn/news/447101.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

基于ECC算法的秘鑰協商

基于ECC算法的衍生算法 ECDH(ECCDH)RSAECDHE(ECCDHE) ECDH密鑰協商(ECCDH) 橢圓曲線密碼學是屬于非對稱密碼學的,其私鑰的計算公式如下: 私鑰是一個隨機數d,取值范圍在1……n-1,其中n是子群的階公鑰是點HdG&#xff…

C++11 多線程相關知識的學習

C多線程類Thread(C11) C11中std命名空間將Boost庫中的Thread加入,Boost的多線程從準標準變為標準,這里將其用法整理復習,以demo的形式復習,還是喜歡看我自己寫的東西,符合我的個人邏輯頭文件為…

vscode vim 插件自定義配置

{"workbench.colorTheme": "Material Theme","files.defaultLanguage": "markdown", //新建文檔格式為markdown格式"vim.easymotion": true,"vim.leader": " ", // leader鍵"vim.useSystemClipbo…

C++11 explicit關鍵字的作用

explicit 在C中,explicit關鍵字用來修飾類的構造函數,被修飾的構造函數的類,不能發生相應的隱式類型轉換,只能以顯示的方式進行類型轉換。因為無參構造函數和多參構造函數本身就是顯示調用的。再加上explicit關鍵字也沒有什么意義…

c++ 指針的強制類型轉換

#include <iostream> using namespace std; class A { public:int i;int j;A(int n):i(n),j(n) { } }; int F2 (int,char *){return 1; }; int F1 (int){return 2; }; int main() {A a(100);int &r reinterpret_cast<int&>(a); //強行讓 r 引用 ar 200; …

C++11學習 virtual(虛函數)的用法

Virtual虛函數 在面向對象的C語言中&#xff0c;虛函數&#xff08;virtual function&#xff09;是一個非常重要的概念。因為它充分體現了面向對象思想中的繼承和多態性這兩大特性&#xff0c;在C語言里應用極廣。多態性&#xff1a;其含義就是多種形式&#xff1b;將具有繼承…

c++ const

函數名稱不單單是函數名 const 補充內容 還有 const 參數類型 函數后頭const 只能在成員函數如果const對象 但是我沒通過const成員函數 就會報錯

C++11學習 新特性之 “=default” 、“=delete”

文章目錄 1、 default 和delete 概述2、 類與默認函數3、 使用“delete”來限制函數生成4、 “default”使用范圍 1、 default 和delete 概述 default、delete 是C11的新特性&#xff0c;分別為&#xff1a;顯式缺省(告知編譯器生成函數默認的缺省版本)和顯式刪除(告知編譯器…

C++學習 優雅的實現對象到文件的序列化/反序列化 關鍵字serialize

需要使用到序列化場景的需求 在寫代碼的過程中&#xff0c;經常會需要把代碼層面的對象數據保存到文件&#xff0c;而這些數據會以各種格式存儲&#xff0e;例如&#xff1a;json&#xff0c;xml&#xff0c;二進制等等&#xff0e;二進制&#xff0c;相比json&#xff0c;xml…

C++代碼注釋詳解

常用注釋語法 注釋寫在對應的函數或變量前面。JavaDoc類型的多行注釋風格如下&#xff1a; /** * 這里為注釋. */ 一般注釋中有簡要注釋和詳細注釋&#xff0c;簡要注釋有多種標識方式&#xff0c;這里推薦使用brief命令強制說明&#xff0c;例如&#xff1a;/** * brief 這里…

段錯誤:SIGSEGV

SIGSEGV是在訪問內存時發生的錯誤&#xff0c;它屬于內存管理的范疇 SIGSEGV是一個用戶態的概念&#xff0c;是操作系統在用戶態程序錯誤訪問內存時所做出的處理。 當用戶態程序訪問&#xff08;訪問表示讀、寫或執行&#xff09;不允許訪問的內存時&#xff0c;產生SIGSEGV。 …

web3 0.2.x 和 1.x.x版本之間的差異

版本差異 單位轉換 0.2.x web3.fromWei(13144321,ether) 1.x.x web3.utils.fromWei(13144321,ether)1.0以后的版本使用了大量的Promise&#xff0c;可以結合async/await使用&#xff0c;而0.20版本只支持回調函數

如何提高閱讀源碼的能力并且手撕源碼

怎么有效的手撕代碼呢&#xff1f; 把代碼跑起來把代碼一個片段拿出來使用畫出代碼運行的流程圖一行一行的搬運在看源碼的情況下寫出類似的demo

并發和并行的區別簡單介紹

并發和并行 并發是關于正確有效地控制對共享資源的訪問 同時完成多個任務。在開始處理其他任務之前&#xff0c;當前任務不需要完成。并發解決了阻塞發生的問題。當任務無法進一步執行&#xff0c;直到外部環境發生變化時才會繼續執行。最常見的例子是I/O&#xff0c;其中任務…

手撕源碼 alloc

怎么有效的手撕代碼呢&#xff1f; gnu gcc 2.9 的 內存池 把代碼跑起來把代碼一個片段拿出來使用畫出代碼運行的流程圖一行一行的搬運在看源碼的情況下寫出類似的demo 第三步&#xff1a; 第五步: // 這個頭文件包含一個模板類 allocator&#xff0c;用于管理內存的分配、…

Algorand的共識協議及其核心的優勢

Algorand 設計的初衷 Algorand 想解決的核心問題是&#xff1a;去中心化網絡中低延時&#xff08;Latency&#xff09;和高置信度&#xff08;Confidence&#xff09;之間的矛盾。其中&#xff0c;延時指從發起交易到確認交易所需要的時間&#xff1b;置信度指的是發出的交易不…

手撕源碼 SQL解析器 sqlparser

怎么有效的手撕代碼呢&#xff1f; 源代碼&#xff1a;https://github.com/hyrise/sql-parser 把代碼跑起來把代碼一個片段拿出來使用畫出代碼運行的流程圖一行一行的搬運在看源碼的情況下寫出類似的demo

針對Algorand所使用的密碼相關技術細節進行介紹

關鍵概念 VRF: 可驗證隨機函數。簡單來說是&#xff1a;vrf,Proof VRF(sk,seed)&#xff0c;sk為私鑰&#xff0c;seed為隨機種子&#xff1b;通過Verify(proof,pk,seed)驗證vrf的合法性。cryptographic sorition: 根據用戶本輪的VRF值&#xff0c;自身的權重以及公開的區塊鏈…

內存池的實現1 :重載

#ifndef KSTD_ALLOCATOR_H_ #define KSTD_ALLOCATOR_H_// 這個頭文件包含一個模板類 allocator&#xff0c;用于管理內存的分配、釋放&#xff0c;對象的構造、析構 // 暫不支持標準庫容器 todo::支持萃取#include <new> // placement new #include <cstddef>…