官术网_书友最值得收藏!

1.8 ECDH密鑰協商

在TLS協議握手階段,為了可以不傳輸密鑰就完成共享密鑰的協商,需要一種密鑰協商算法。密鑰協商算法并不唯一,需要雙方協商決定,這里只介紹密鑰協商算法中的其中一種,即基于橢圓曲線的迪菲-赫爾曼密鑰交換算法,在TLS/SSL協議握手過程中交換的兩個隨機數random_C和random_S就是為了完成這個算法做準備的,通過這兩個隨機數和密鑰協商算法可以計算得到Pre-Master而最終確定共享密鑰。

基于橢圓曲線的迪菲-赫爾曼密鑰交換(Elliptic Curve Diffie–Hellman key Exchange,ECDH)算法,主要用來在一個不安全的通道中建立起安全的共有加密資料,一般來說加密資料都是共享密鑰,這個密鑰作為對稱加密的密鑰被雙方在進行后續數據傳輸時使用。

ECDH算法是建立在這樣一個前提之上的:給定橢圓曲線上的一個點P和一個整數K,求Q=KP很容易,但是通過QP求解K很難。

通過一個經典的場景來介紹ECDH算法流程,Alice和Bob要在一條不安全的網絡鏈路上協商共享密鑰,并且協商的密鑰不能被中間人知曉。

首先,雙方約定使用ECDH算法,這個時候雙方知道ECDH算法里的一個大素數P,這個大素數P可以看作ECDH算法中的常量。

P的位數決定了攻擊者破解的難度。

還有一個整數g用來輔助整個密鑰交換,g不用很大,一般是2或5,雙方知道gP之后就開始了交換密鑰的過程。

Alice知道了公用參數Pg,生成私有整數a作為私鑰,公鑰算法一般是公鑰加密,私鑰解密。公鑰給對方來加密數據,對方拿到密文后再用私鑰解密查看內容的正確性。這個時候如果Alice直接通過網絡鏈路告訴Bob自己的私鑰a,這顯然既不合理,也是一件風險很大的事,所以要避免直接通過網絡鏈路傳輸私鑰a

這個時候,Alice需要利用Pg作為輔助生成自己的公鑰A,公鑰A的生成公式為ga mod P=A,生成的公鑰A可以通過網絡鏈路傳輸。

Bob通過網絡鏈路收到Alice發來的Pg和公鑰A,知道了Alice的公鑰A。這個時候,Bob生成自己的私鑰b,同樣通過公式gb mod P=B生成自己的公鑰B

在Bob發送自己的公鑰B前,Bob通過公式Ab mod P=K生成K作為共享密鑰,但是并不發送給Alice,只通過網絡鏈路發送自己的公鑰B

Alice收到Bob發來的公鑰B以后,同樣通過Ba mod P=K生成共享密鑰K,這樣Alice和Bob就通過不傳遞各自私鑰ab的方式完成了對共享密鑰K的協商。

可以通過代入具體數字的一個例子來重復一下上面的過程。

(1)Alice和Bob同意使用大素數P和整數g

P=83,g=8

(2)Alice選擇密鑰a=9, 生成公鑰 ga mod P=A并發送。

89mod83=5

(3)Bob選擇密鑰 b=21, 生成公鑰Ab mod P=B并發送。

821mod83=18

(4)Alice計算 Ba mod P=K

189mod83=24

(5)Bob計算Ba mod P=K

521mod83=24

至此24就是雙方協商出來的共享密鑰,可以看到在整個過程中共享密鑰24都沒有通過網絡鏈路傳輸,保證了密鑰的安全性,在后續通信過程中Alice和Bob可以使用24作為Pre-Master繼續計算對稱加密的密鑰。

1)協議所面臨的問題

由于ECDH協議不會驗證公鑰發送者的身份,因此無法阻止中間人攻擊。如果監聽者Mallory截獲了Alice的公鑰,就可以替換為自己的公鑰,并將其發送給Bob。Mallory還可以截獲Bob的公鑰,替換為自己的公鑰,并將其發送給Alice。這樣,Mallory就可以輕松地對Alice與Bob之間發送的任何消息進行解密。Mallory可以更改消息,用自己的密鑰對消息重新加密,然后將消息發送給接收者。

為了解決此問題,Alice和Bob可以在交換公鑰之前使用數字簽名對公鑰進行簽名,有兩種方法可以實現此目的。

? 用安全的媒體(如語音通信或可信載運商)在雙方之間傳輸數字簽名密鑰。

? 使用第三方證書頒發機構向雙方提供可信數字簽名密鑰。

2)區塊鏈中的應用場景

在聯盟鏈中,當多個參與者共享同一條網絡鏈路時,若各參與者想要在同一條網絡鏈路上實現通信間的隔離,則可以使用ECDH算法將鏈路進行邏輯上的拆分,使得同一鏈路上的消息采用不同的密鑰進行加密,來達到物理鏈路隔離的目的。通過這樣的方式既可以實現通信連接的復用,避免頻繁建立大量通信連接,又可以保證同一鏈路不同參與者的通信隔離。

各參與者的身份在加入區塊鏈網絡前已經由MSP(Membership Service Provider)頒發過證書,并且進行過準入驗證,這樣就可以規避ECDH協議的缺陷。

主站蜘蛛池模板: 监利县| 大足县| 简阳市| 平和县| 孟津县| 探索| 内乡县| 东台市| 电白县| 凤城市| 峨眉山市| 伊川县| 珲春市| 邵阳市| 和田市| 崇文区| 华容县| 富源县| 麦盖提县| 德兴市| 县级市| 新巴尔虎右旗| 青河县| 安图县| 同江市| 衡水市| 蛟河市| 大连市| 积石山| 永宁县| 信宜市| 亚东县| 清苑县| 米泉市| 棋牌| 瑞丽市| 改则县| 开封市| 北宁市| 萨迦县| 汉源县|