是消息認證演算法
『壹』 為了攻擊mac演算法,需要恢復密碼嗎
為了攻擊mac演算法,不需要恢復密碼。根據查詢相關資料得知,MAC(MessageAuthenticationCodes),是一種消息摘要演算法,也叫消息認證碼演算法。這種演算法的核心是基於秘鑰的橡族斗散列函數。破穗寬解這種演算法的核心是密鑰的散梁磨列函數,不需要密鑰本身。
『貳』 CBC-MAC是什麼
MAC全稱為Message Authentication Code(消息認證碼)。MAC是用來保證數據完整性的一種工具。數據完整性是信息安全的一項基本要求,它可以防止數據未經授權被篡改。隨著網路技術的不斷進步,尤其是電子商務的不斷發展,保證信息的完整性變得越來越重要,特別是雙方在一個不安全的信道上通信時,就需要有一種方法保證一方所發送的數據能夠被另一方驗證是正確的、未經篡改的。
用數學的語言來描述,MAC實際上是將雙方共享的密鑰k和消息m作為輸入純春好函數,如將函數值記為MACk(m),這個函數值就是一個認證標記,這里用δ表示。攻擊者發起攻擊的時候,能得到的是消息和標記的序列對(m1,δ1), (m2,δ2),…(mq,δq)(其中δi= MACk(mi))。如果攻擊者可以找到一個消息m,m不在m1, m2,…, mq中,並且能夠得到正確的認證標記δ= MACk(m)就說明攻擊成功了。攻擊者成功的概率就是其攻破MAC的概率。其實就是hash函數的概念再述。
CBC-MAC
CBC-MAC是最為廣泛使用的消息認證演算法之一,同時它也是一個ANSI標准(X9.17)。CBC-MAC實際上就是對消息使用CBC模式進行做鉛加密,取密文的最後一塊作為認證碼森乎。
當取AES作為加密的分組密碼時,稱為基於AES的CBC-MAC,若需要產生認證碼的消息為x,加密的AES密鑰為k,則生成MAC的過程如下圖所示。
- 填充和分組:對消息x進行填充,將填充得到的消息分成t個n比特的分組,記為x1, x2,…, xt。
- 密碼分組鏈接:令Ek表示以k為密鑰的加密演算法AES,用以下方式計算Hi:
H1←Ek(x1)
Hi←Ek(Hi-1+xi),2≤i≤t
則Ht就是x的消息認證碼。
CBC-MAC是一種經典的構造MAC的方法,構造方法簡單,且底層的加密演算法具有黑盒性質,可以方便的進行替換。
『叄』 Android網路請求加密機制
密碼學的三大作用:加密( Encryption)、認證(Authentication),鑒定(Identification)
加密 :防止壞人獲取你的數據。
鑒權 :防止壞人假冒你的身份。
認證 :防止壞人修改了你的數據而你卻並沒有發現。
1. URLEncode和URLDecoder 作用:URLEncode就是將URL中特殊部分進行編碼。URLDecoder就是對特殊部分進行解碼。
為什麼URL要encode原因呢?
url轉義其實也只是為了符合url的規范而已。因為在標準的url規范中 中文和很多的字元 是不允許出現在url中的。
2. Base64編碼
為什麼要進行Base64編碼?
在計算機中任何數據都是按ascii碼存儲的,而ascii碼的128~255之間的值是不可見字元。而在網路上交換數據時,比如說從A地傳到B地,往往要經過多個路由設備,由於不同的設備對字元的處理方式有一些不同,這樣那些不可見字元就有可能被處理錯誤,這是不利於傳輸的。所以就先把數據先做一個Base64編碼,統統變成可見字元,這樣出錯的可能性就大降低了。
應用場景:主要是對於二進制數據進行編碼,(文件、圖片、加密後的二進制數據)
3. 消息認證演算法
要確保加密的消息不是別人偽造的,需要提供一個消息認證碼(MAC,Message authentication code) 。
消息認證碼是帶密鑰的hash函數,基於密鑰和hash函數(單向散列函數)。
密鑰雙方事先約定,不能讓第三方知道。
消息發送者使用MAC演算法計算出消息的MAC值,追加到消息後面一起發送給接收者。
接收者收到消息後,用相同的MAC演算法計算接收到消息MAC值,並與接收到的MAC值對比是否一樣。
消息認證碼的作用:檢查某段消息的完整性,以及作身份驗證。
防止重放 攻擊可以有 3 種方法:
序號
每條消息都增加一個遞增的序號,並且在計算 MAC 值的時候把序號也包含在消息中。這樣攻擊者如果不破解消息認證碼就無法計算出正確的 MAC 值。這個方法的弊端是每條消息都需要多記錄最後一個消息的序號。
時間戳
發送消息的時候包含當前時間,如果收到的時間與當前的不符,即便 MAC 值正確也認為是錯誤消息直接丟棄。這樣也可以防禦重放攻擊。這個方法的弊端是,發送方和接收方的時鍾必須一致,考慮到消息的延遲,所以需要在時間上留下一定的緩沖餘地。這個緩沖之間還是會造成重放攻擊的可趁之機。
nonce
在通信之前,接收者先向發送者發送一個一次性的隨機數 nonce。發送者在消息中包含這個 nonce 並計算 MAC 值。由於每次 nonce 都會變化,因此無法進行重放攻擊。這個方法的缺點會導致通信的數據量增加。
4. 對稱加密演算法
特點:加解密只有一個密鑰。優點:速度快、效率高。缺點:密鑰交換問題。演算法:AES(256位元組,主流)、DES(8位元組,淘汰)。
密鑰交換問題如何解決,MAC同樣也有這個問題,可以使用非對稱加密傳輸,或者私下約定,密鑰管理中心。
5. 非對稱加密
非對稱加密演算法需要兩個密鑰:公開密鑰(publickey)和私有密鑰(privatekey)。公開密鑰與私有密鑰是一對,如果用公開密鑰對數據進行加密,只有用對應的私有密鑰才能解密;如果用私有密鑰對數據進行加密,那麼只有用對應的公開密鑰才能解密(這個過程可以做數字簽名) 。 非對稱加密主要使用的是RSA演算法。
特點:公/私鑰機制。優點:只需要交換公鑰,安全。缺點:加解密速度慢,特別是解密。演算法:RSA。應用:數字簽名。
數字簽名 :
簡單解釋:
A:將明文進行摘要運算後得到摘要(消息完整性),再將摘要用A的私鑰加密(身份認證),得到數字簽名,將密文和數字簽名一塊發給B。
B:收到A的消息後,先將密文用自己的私鑰解密,得到明文。將數字簽名用A的公鑰進行解密後,得到正確的摘要(解密成功說明A的身份被認證了)。
數字證書 :
6. Android端 AES+RSA結合實踐
基本流程
Android端
伺服器端
基本上如下圖所示的流程:
『肆』 計算機中身份認證和消息認證的區別
1、性質不同
身份認證指通過一定的手段,完成對用戶身份的確認。
消息認證(message authentication)指驗證消息的完整性,當接收方收到發送方的報文時,接收方能夠驗證收到的報文是真實的和未被篡改的。它包含兩層含義:驗證信息的發送者是真正的而不是冒充的,即數據起源認證;驗證信息在傳送過程中未被篡改、重放或延遲等。
2、目的不同
身份驗證的目的為確認當前所聲稱為某種身份的用戶,確實是所聲稱的用戶。在日常生活中,身份驗證並不罕見;比如,通過檢查對方的證件,我們一般可以確信對方的身份。雖然日常生活中的這種確認對方身份的做法也屬於廣義的「身份驗證」,但「身份驗證」一詞更多地被用在計算機、通信等領域。
消息認證目的為了防止傳輸和存儲的消息被有意無意的篡改。
3、方法不同
身份驗證的方法有很多,基本上可分為:基於共享密鑰的身份驗證、基於生物學特徵的身份驗證和基於公開密鑰加密演算法的身份驗證。不同的身份驗證方法,安全性也各有高低。
消息認證包括消息內容認證(即消息完整性認證)、消息的源和宿認證(即身份認證0)、及消息的序號和操作時間認證等。它在票據防偽中具有重要應用(如稅務的金稅系統和銀行的支付密碼器)。
『伍』 對消息認證主要包括兩方面的含義,它們是
消息內容認證消息內容認證常用的方法:消息發送者在消息中加入一個鑒別碼(MAC、MDC等)並經加密後發送給接受者(有時只需加密鑒別碼即可)。接受者利用約定的演算法對解密後的消息進行鑒別運算,將得到 的鑒別碼與收到的鑒別碼進行比較,若二者相等,則接收,否則拒絕接收。源和宿的認證李晌在消息認證中,消息源和宿的常用認證方法有兩種。
一種是通信雙方事先約定發送消息的數據加密密匙,接睜擾凱收者只需要證實發送來的消息是否能用該密匙還原成明文就能鑒別發送者。如果雙方使用同一個數據加密密匙,那麼只需在消息中嵌入發送者識別符即可。
另一種是通信雙方實現約定各自發送消息所使用的通行字,發送消息中含有此通行字並進行加密,接收者只需判別消息中解密的通行字是否等於約定的通行字就能鑒別發送者。為了安全起見,通行字應該是可變的。消息序號和操作時間的認證消息的序號和時間性的認證主要是阻止消息的重放攻擊。常用的方法悉喚有消息的流水作業、鏈接認證符隨機樹認證和時間戳等。
『陸』 加密技術07-消息認證碼與數字簽名
消息認證碼(Message Authentication Code,簡稱 MAC)是一種能夠識別通信對象發送的消息是否被篡改的認證技術,用於驗證消息的完整性,以及對消息進行身份認證。消息認證孝手逗碼的演算法中,最常用的是利用散列函數的 HMAC。HMAC 的構成不依賴於某一種具體的散列函數演算法。消息認證碼能夠對通信對象進行認證,但無法對第三方進行認證。此外它也無法防止否認。
主要作用
HMAC 實現原理
HMAC 是一種使用散列函數來構造消息認證碼的方法(RFC2014),其中 HMAC 的 H 就是 Hash 的意思。HMAC 中所使用的散列函數並不僅限於一種,任何高強度的散列函數都可以被用於 HMAC,如果將來設計出新的散列函數,也同樣可以使用。
對 message 生成消息認證碼可以表示為: hmac(message, secret, hash) ,secret 為共享密鑰,hash 為所使用散列函數。
(1)密鑰填充:如果密鑰比散列函數的分組長度要短,就需要在末尾填充 0,直到其長度達到散列函數的分組長度為止。如果密鑰比分組長度要長,則要用散列函數求出密鑰的散列值,然後將這個散列值用作 HMAC 的密鑰。
(2)填充後的密鑰與 ipad 的 XOR:將填充後的密鑰與被稱為 ipad 的比特序列進行 XOR 運算。 ipad 是將 00110110 這一比特序列(即 16 進制的 36)不斷循環反復直到分組長度所形成的比特序列,其中 ipad 的 i 是 inner(內部)的意思。XOR 運算所得巧賣到的值,就是一個和散列函數的分組長度相同,且和密鑰相關的比特序列。這里我們將這個比特序列稱為 ipadkey。
(3)與消息組合:將 ipadkey 與消息進行組合,也就是將和密鑰相關的比特序列(ipadkey)附加在消息的開頭。
(4)計算散列值:將(3)的結果輸入散列函數,並計算出散列值。
(5)填充後的密鑰與 opad 的 XOR:將填充後的密鑰與被稱為 opad 的比特序列進行 XOR 運算。opad 是將 01011100 這一比特序列(即 16 進制的 5C)不斷循環反復直到達到分組長度所形成的比特序列,其中 opad 的 o 是 outer(外部)的意思。XOR 運算所得到的結果也是一個和散列函數的分組長度相同,且和密鑰相關的比特序列,這里我們將這個比特序列稱為 opadkey。
(6)與散列值組合:將(4)的散列值拼在 opadkey 後面。
(7)將(6)的結果輸入散列函數,並計算出散列值。這個散列值就是最終的 MAC 值。
對消息認證碼的攻擊
關於防止重放攻擊的方式
消息認證碼無法解決的問題
由於 MAC 值發送者和接受者薯雹都能生成,所以接受者如果要向第三方驗證者證明消息的來源為發送者,第三方驗證者是無法證明的,因為接受者也是可以生成 MAC 值的;第三方驗證者無法判斷發送者和接受者誰的主張才是正確的,也就是說,用消息認證碼無法防止否認。
數字簽名是一種能夠對第三方進行消息認證,並能夠防止通信對象做出否認的認證技術。數字簽名的演算法包括 RSA,ELGamal,DSA,橢圓曲線 DSA 等。公鑰基礎設施(PKI)中使用的證書,就是對公鑰加上認證機構的數字簽名收構成的。要驗證公鑰的數字簽名,需要通過某種途徑獲取認證機構自身的合法公鑰。
數字簽名的方法
直接對消息簽名的方法比較容易理解,但實際上並不會使用;對消息的散列值簽名的方法稍微復雜一點,但實際中我們一般都使用這種方法。
對數字簽名的攻擊
數字簽名無法解決的問題
用數字簽名既可以識別出篡改和偽裝,還可以防止否認。也就是說,我們同時實現了確認消息的完整性、進行認證以及否認防止。
然而,要正確使用數字簽名,有一個前提,那就是用於驗證簽名的公鑰必須屬於真正的發送者。即使數字簽名演算法再強大,如果你得到的公鑰是偽造的,那麼數字簽名也會完全失效。
為了能夠確認自己得到的公鑰是否合法,我們需要使用證書。所謂證書,就是將公鑰當作一條消息,由一個可信的第三方對其簽名後所得到的公鑰。
『柒』 請闡述什麼是消息認證及其工作原理,並詳細說明一種具體的實現方式
消息認證(message authentication)就是驗證消息的完整性,當接收方收到發送方的報文時,接收方能夠驗證收到的報文是真實的和未被篡改的。它包含兩層含義:一是驗證信息的發送者是真正的而不是冒充的,即數據起源認證;二是驗證信息在傳送過程中未被篡改、重放或延遲等。
消息認證是指通過對消息或者消息有關的信息進行加密或簽名變換進行的認證,目的是為了防止傳輸和存儲的消息被有意無意的篡改,包括消息內容認證(即消息完整性認證)、消息的源和宿認證(即身份認證0)、及消息的序號和操作時間認證等。它在票據防偽中具有重要應用(如稅務的金稅系統和銀行的支付密碼器)。
消息認證所用的摘要演算法與一般的對稱或非對稱加密演算法不同,它並不用於防止信息被竊取,而是凱螞用於證明原文的完整性和准確性,也就是說,消息認證主要用於防止信息被篡改。
消息認證中常見的攻擊和對策:
①重放攻擊:截獲以前協議執行時傳輸的信息,然後在某個時候再次使用。對付這種攻擊的一種措施是在認證消息中包含一個非重復值,如序列號、時戳、隨機數或嵌入目標身份的標志符等。核孫做
②冒充攻擊:攻擊者冒充合法用戶發布虛假消息。為避免這種攻擊可採用身份認證技術。
③重組攻擊:把以前協議執行時一次改衡或多次傳輸的信息重新組合進行攻擊。為了避免這類攻擊,把協議運行中的所有消息都連接在一起。
④篡改攻擊:修改、刪除、 添加或替換真實的消息。為避免這種攻擊可採用消息認證碼MAC或hash函數等技術。
『捌』 【深度知識】區塊鏈之加密原理圖示(加密,簽名)
先放一張以太坊的架構圖:
在學習的過程中主要是採用單個模塊了學習了解的,包括P2P,密碼學,網路,協議等。直接開始總結:
秘鑰分配問題也就是秘鑰的傳輸問題,如果對稱秘鑰,那麼只能在線下進行秘鑰的交換。如果在線上傳輸秘鑰,那就有可能被攔截。所以採用非對稱加密,兩把鑰匙,一把私鑰自留,一把公鑰公開。公鑰可以在網上傳輸。不用線下交易。保證數據的安全性。
如上圖,A節點發送數據到B節點,此時採用公鑰加密。A節點從自己的公鑰中獲取到B節點的公鑰對明文數據加密,得到密文發送給B節點。而B節點採用自己的私鑰解密。
2、無法解決消息篡改。
如上圖,A節點採用B的公鑰進行加密,然後將密文傳輸給B節點。B節點拿A節點的公鑰將密文解密。
1、由於A的公鑰是公開的,一旦網上黑客攔截消息,密文形同虛設。說白了,這種加密方式,只要攔截消息,就都能解開。
2、同樣存在無法確定消息來源的問題,和消息篡改的問題。
如上圖,A節點在發送數據前,先用B的公鑰加密,得到密文1,再用A的私鑰對密文1加密得到密文2。而B節點得到密文後,先用A的公鑰解密,得到密文1,之後用B的私鑰解密得到明文。
1、當網路上攔截到數據密文2時, 由於A的公鑰是公開的,故可以用A的公鑰對密文2解密,就得到了密文1。所以這樣看起來是雙重加密,其實最後一層的私鑰簽名是無效的。一般來講,我們都希望簽名是簽在最原始的數據上。如果簽名放在後面,由於公鑰是公開的,簽名就缺乏安全性。
2、存在性能問題,非對稱加密本身效率就很低下,還進行了兩次加密過程。
如上圖,A節點先用A的私鑰加密,之後用B的公鑰加密。B節點收到消息後,先採用B的私鑰解密,然後再利用A的公鑰解密。
1、當密文數據2被黑客攔截後,由於密文2隻能採用B的私鑰解密,而B的私鑰只有B節點有,其他人無法機密。故安全性最高。
2、當B節點解密得到密文1後, 只能採用A的公鑰來解密。而只有經過A的私鑰加密的數據才能用A的公鑰解密成功,A的私鑰只有A節點有,所以可以確定數據是由A節點傳輸過來的。
經兩次非對稱加密,性能問題比較嚴重。
基於以上篡改數據的問題,我們引入了消息認證。經過消息認證後的加密流程如下:
當A節點發送消息前,先對明文數據做一次散列計算。得到一個摘要, 之後將照耀與原始數據同時發送給B節點。當B節點接收到消息後,對消息解密。解析出其中的散列摘要和原始數據,然後再對原始數據進行一次同樣的散列計算得到摘要1, 比較摘要與摘要1。如果相同則未被篡改,如果不同則表示已經被篡改。
在傳輸過程中,密文2隻要被篡改,最後導致的hash與hash1就會產生不同。
無法解決簽名問題,也就是雙方相互攻擊。A對於自己發送的消息始終不承認。比如A對B發送了一條錯誤消息,導致B有損失。但A抵賴不是自己發送的。
在(三)的過程中,沒有辦法解決交互雙方相互攻擊。什麼意思呢? 有可能是因為A發送的消息,對A節點不利,後來A就抵賴這消息不是它發送的。
為了解決這個問題,故引入了簽名。這里我們將(二)-4中的加密方式,與消息簽名合並設計在一起。
在上圖中,我們利用A節點的私鑰對其發送的摘要信息進行簽名,然後將簽名+原文,再利用B的公鑰進行加密。而B得到密文後,先用B的私鑰解密,然後 對摘要再用A的公鑰解密,只有比較兩次摘要的內容是否相同。這既避免了防篡改問題,有規避了雙方攻擊問題。因為A對信息進行了簽名,故是無法抵賴的。
為了解決非對稱加密數據時的性能問題,故往往採用混合加密。這里就需要引入對稱加密,如下圖:
在對數據加密時,我們採用了雙方共享的對稱秘鑰來加密。而對稱秘鑰盡量不要在網路上傳輸,以免丟失。這里的共享對稱秘鑰是根據自己的私鑰和對方的公鑰計算出的,然後適用對稱秘鑰對數據加密。而對方接收到數據時,也計算出對稱秘鑰然後對密文解密。
以上這種對稱秘鑰是不安全的,因為A的私鑰和B的公鑰一般短期內固定,所以共享對稱秘鑰也是固定不變的。為了增強安全性,最好的方式是每次交互都生成一個臨時的共享對稱秘鑰。那麼如何才能在每次交互過程中生成一個隨機的對稱秘鑰,且不需要傳輸呢?
那麼如何生成隨機的共享秘鑰進行加密呢?
對於發送方A節點,在每次發送時,都生成一個臨時非對稱秘鑰對,然後根據B節點的公鑰 和 臨時的非對稱私鑰 可以計算出一個對稱秘鑰(KA演算法-Key Agreement)。然後利用該對稱秘鑰對數據進行加密,針對共享秘鑰這里的流程如下:
對於B節點,當接收到傳輸過來的數據時,解析出其中A節點的隨機公鑰,之後利用A節點的隨機公鑰 與 B節點自身的私鑰 計算出對稱秘鑰(KA演算法)。之後利用對稱秘鑰機密數據。
對於以上加密方式,其實仍然存在很多問題,比如如何避免重放攻擊(在消息中加入 Nonce ),再比如彩虹表(參考 KDF機制解決 )之類的問題。由於時間及能力有限,故暫時忽略。
那麼究竟應該採用何種加密呢?
主要還是基於要傳輸的數據的安全等級來考量。不重要的數據其實做好認證和簽名就可以,但是很重要的數據就需要採用安全等級比較高的加密方案了。
密碼套件 是一個網路協議的概念。其中主要包括身份認證、加密、消息認證(MAC)、秘鑰交換的演算法組成。
在整個網路的傳輸過程中,根據密碼套件主要分如下幾大類演算法:
秘鑰交換演算法:比如ECDHE、RSA。主要用於客戶端和服務端握手時如何進行身份驗證。
消息認證演算法:比如SHA1、SHA2、SHA3。主要用於消息摘要。
批量加密演算法:比如AES, 主要用於加密信息流。
偽隨機數演算法:例如TLS 1.2的偽隨機函數使用MAC演算法的散列函數來創建一個 主密鑰 ——連接雙方共享的一個48位元組的私鑰。主密鑰在創建會話密鑰(例如創建MAC)時作為一個熵來源。
在網路中,一次消息的傳輸一般需要在如下4個階段分別進行加密,才能保證消息安全、可靠的傳輸。
握手/網路協商階段:
在雙方進行握手階段,需要進行鏈接的協商。主要的加密演算法包括RSA、DH、ECDH等
身份認證階段:
身份認證階段,需要確定發送的消息的來源來源。主要採用的加密方式包括RSA、DSA、ECDSA(ECC加密,DSA簽名)等。
消息加密階段:
消息加密指對發送的信息流進行加密。主要採用的加密方式包括DES、RC4、AES等。
消息身份認證階段/防篡改階段:
主要是保證消息在傳輸過程中確保沒有被篡改過。主要的加密方式包括MD5、SHA1、SHA2、SHA3等。
ECC :Elliptic Curves Cryptography,橢圓曲線密碼編碼學。是一種根據橢圓上點倍積生成 公鑰、私鑰的演算法。用於生成公私秘鑰。
ECDSA :用於數字簽名,是一種數字簽名演算法。一種有效的數字簽名使接收者有理由相信消息是由已知的發送者創建的,從而發送者不能否認已經發送了消息(身份驗證和不可否認),並且消息在運輸過程中沒有改變。ECDSA簽名演算法是ECC與DSA的結合,整個簽名過程與DSA類似,所不一樣的是簽名中採取的演算法為ECC,最後簽名出來的值也是分為r,s。 主要用於身份認證階段 。
ECDH :也是基於ECC演算法的霍夫曼樹秘鑰,通過ECDH,雙方可以在不共享任何秘密的前提下協商出一個共享秘密,並且是這種共享秘鑰是為當前的通信暫時性的隨機生成的,通信一旦中斷秘鑰就消失。 主要用於握手磋商階段。
ECIES: 是一種集成加密方案,也可稱為一種混合加密方案,它提供了對所選擇的明文和選擇的密碼文本攻擊的語義安全性。ECIES可以使用不同類型的函數:秘鑰協商函數(KA),秘鑰推導函數(KDF),對稱加密方案(ENC),哈希函數(HASH), H-MAC函數(MAC)。
ECC 是橢圓加密演算法,主要講述了按照公私鑰怎麼在橢圓上產生,並且不可逆。 ECDSA 則主要是採用ECC演算法怎麼來做簽名, ECDH 則是採用ECC演算法怎麼生成對稱秘鑰。以上三者都是對ECC加密演算法的應用。而現實場景中,我們往往會採用混合加密(對稱加密,非對稱加密結合使用,簽名技術等一起使用)。 ECIES 就是底層利用ECC演算法提供的一套集成(混合)加密方案。其中包括了非對稱加密,對稱加密和簽名的功能。
<meta charset="utf-8">
這個先訂條件是為了保證曲線不包含奇點。
所以,隨著曲線參數a和b的不斷變化,曲線也呈現出了不同的形狀。比如:
所有的非對稱加密的基本原理基本都是基於一個公式 K = k G。其中K代表公鑰,k代表私鑰,G代表某一個選取的基點。非對稱加密的演算法 就是要保證 該公式 不可進行逆運算( 也就是說G/K是無法計算的 )。 *
ECC是如何計算出公私鑰呢?這里我按照我自己的理解來描述。
我理解,ECC的核心思想就是:選擇曲線上的一個基點G,之後隨機在ECC曲線上取一個點k(作為私鑰),然後根據k G計算出我們的公鑰K。並且保證公鑰K也要在曲線上。*
那麼k G怎麼計算呢?如何計算k G才能保證最後的結果不可逆呢?這就是ECC演算法要解決的。
首先,我們先隨便選擇一條ECC曲線,a = -3, b = 7 得到如下曲線:
在這個曲線上,我隨機選取兩個點,這兩個點的乘法怎麼算呢?我們可以簡化下問題,乘法是都可以用加法表示的,比如2 2 = 2+2,3 5 = 5+5+5。 那麼我們只要能在曲線上計算出加法,理論上就能算乘法。所以,只要能在這個曲線上進行加法計算,理論上就可以來計算乘法,理論上也就可以計算k*G這種表達式的值。
曲線上兩點的加法又怎麼算呢?這里ECC為了保證不可逆性,在曲線上自定義了加法體系。
現實中,1+1=2,2+2=4,但在ECC演算法里,我們理解的這種加法體系是不可能。故需要自定義一套適用於該曲線的加法體系。
ECC定義,在圖形中隨機找一條直線,與ECC曲線相交於三個點(也有可能是兩個點),這三點分別是P、Q、R。
那麼P+Q+R = 0。其中0 不是坐標軸上的0點,而是ECC中的無窮遠點。也就是說定義了無窮遠點為0點。
同樣,我們就能得出 P+Q = -R。 由於R 與-R是關於X軸對稱的,所以我們就能在曲線上找到其坐標。
P+R+Q = 0, 故P+R = -Q , 如上圖。
以上就描述了ECC曲線的世界裡是如何進行加法運算的。
從上圖可看出,直線與曲線只有兩個交點,也就是說 直線是曲線的切線。此時P,R 重合了。
也就是P = R, 根據上述ECC的加法體系,P+R+Q = 0, 就可以得出 P+R+Q = 2P+Q = 2R+Q=0
於是乎得到 2 P = -Q (是不是與我們非對稱演算法的公式 K = k G 越來越近了)。
於是我們得出一個結論,可以算乘法,不過只有在切點的時候才能算乘法,而且只能算2的乘法。
假若 2 可以變成任意個數進行想乘,那麼就能代表在ECC曲線里可以進行乘法運算,那麼ECC演算法就能滿足非對稱加密演算法的要求了。
那麼我們是不是可以隨機任何一個數的乘法都可以算呢? 答案是肯定的。 也就是點倍積 計算方式。
選一個隨機數 k, 那麼k * P等於多少呢?
我們知道在計算機的世界裡,所有的都是二進制的,ECC既然能算2的乘法,那麼我們可以將隨機數k描 述成二進制然後計算。假若k = 151 = 10010111
由於2 P = -Q 所以 這樣就計算出了k P。 這就是點倍積演算法 。所以在ECC的曲線體系下是可以來計算乘法,那麼以為這非對稱加密的方式是可行的。
至於為什麼這樣計算 是不可逆的。這需要大量的推演,我也不了解。但是我覺得可以這樣理解:
我們的手錶上,一般都有時間刻度。現在如果把1990年01月01日0點0分0秒作為起始點,如果告訴你至起始點為止時間流逝了 整1年,那麼我們是可以計算出現在的時間的,也就是能在手錶上將時分秒指針應該指向00:00:00。但是反過來,我說現在手錶上的時分秒指針指向了00:00:00,你能告訴我至起始點算過了有幾年了么?
ECDSA簽名演算法和其他DSA、RSA基本相似,都是採用私鑰簽名,公鑰驗證。只不過演算法體系採用的是ECC的演算法。交互的雙方要採用同一套參數體系。簽名原理如下:
在曲線上選取一個無窮遠點為基點 G = (x,y)。隨機在曲線上取一點k 作為私鑰, K = k*G 計算出公鑰。
簽名過程:
生成隨機數R, 計算出RG.
根據隨機數R,消息M的HASH值H,以及私鑰k, 計算出簽名S = (H+kx)/R.
將消息M,RG,S發送給接收方。
簽名驗證過程:
接收到消息M, RG,S
根據消息計算出HASH值H
根據發送方的公鑰K,計算 HG/S + xK/S, 將計算的結果與 RG比較。如果相等則驗證成功。
公式推論:
HG/S + xK/S = HG/S + x(kG)/S = (H+xk)/GS = RG
在介紹原理前,說明一下ECC是滿足結合律和交換律的,也就是說A+B+C = A+C+B = (A+C)+B。
這里舉一個WIKI上的例子說明如何生成共享秘鑰,也可以參考 Alice And Bob 的例子。
Alice 與Bob 要進行通信,雙方前提都是基於 同一參數體系的ECC生成的 公鑰和私鑰。所以有ECC有共同的基點G。
生成秘鑰階段:
Alice 採用公鑰演算法 KA = ka * G ,生成了公鑰KA和私鑰ka, 並公開公鑰KA。
Bob 採用公鑰演算法 KB = kb * G ,生成了公鑰KB和私鑰 kb, 並公開公鑰KB。
計算ECDH階段:
Alice 利用計算公式 Q = ka * KB 計算出一個秘鑰Q。
Bob 利用計算公式 Q' = kb * KA 計算出一個秘鑰Q'。
共享秘鑰驗證:
Q = ka KB = ka * kb * G = ka * G * kb = KA * kb = kb * KA = Q'
故 雙方分別計算出的共享秘鑰不需要進行公開就可採用Q進行加密。我們將Q稱為共享秘鑰。
在以太坊中,採用的ECIEC的加密套件中的其他內容:
1、其中HASH演算法採用的是最安全的SHA3演算法 Keccak 。
2、簽名演算法採用的是 ECDSA
3、認證方式採用的是 H-MAC
4、ECC的參數體系採用了secp256k1, 其他參數體系 參考這里
H-MAC 全程叫做 Hash-based Message Authentication Code. 其模型如下:
在 以太坊 的 UDP通信時(RPC通信加密方式不同),則採用了以上的實現方式,並擴展化了。
首先,以太坊的UDP通信的結構如下:
其中,sig是 經過 私鑰加密的簽名信息。mac是可以理解為整個消息的摘要, ptype是消息的事件類型,data則是經過RLP編碼後的傳輸數據。
其UDP的整個的加密,認證,簽名模型如下: