第六講 消息認證和散列函數


安全攻擊

  • 泄密、傳輸分析:破壞機密性
  • 偽裝、內容修改、順序修改、計時修改:破壞完整性
  • 發送方否認、接收方否認:破壞抗抵賴性

其中接收方否認的情況不僅需要數字簽名,還需要配合協議來解決。

消息認證和HASH函數

區別和關系

可用來產生認證符的函數分為三類:

  • 消息加密函數,用完整信息的密文作為對消息的認證。
  • 消息認證碼MAC,MAC是消息和密鑰的函數,產生一個固定長度的值作為認證標識。
  • 散列函數(Hash Function),是一個公開的函數,它將任意長的信息映射成一個固定長度的信息。

一句話概括就是Hash函數屬於消息認證中的一部分。

消息加密

消息的自身加密可以作為一個認證的度量。對稱密鑰模式和公開密鑰模式有所不同。

  • 對稱加密:如果明文具有一定的語法結構,接收方可以判斷解密后明文的合法性,從而確認消息來自發送方而且中間未受到篡改。如果明文為二進制文件,則難以判斷解密后的消息是正確的明文。
  • 公鑰加密:既能實現保密性,又能完成認證和簽名。一次通信中要進行四次復雜的公鑰算法。

消息認證碼

可以參考之前的博文:第四講 對稱密碼的使用方法

需要區分注意的是,認證碼對明文或密文進行MAC都是可以的。因為有密鑰的保護,所以即便是對密文進行MAC也不會被篡改,只是這種方式在仲裁的時候必須保留密文,不太好。
而對於Hash函數而言,只能對明文或摘要進行Hash,對密文的Hash是沒有任何意義的,可以被隨意篡改。

散列函數(Hash)

  • 將一個長度可變的消息M轉換為一個固定長度的輸出,稱之為散列碼或摘要
  • 與MAC的區別:沒有使用密鑰,函數輸入參數只有一個
  • 可以檢測出消息是否發生變化
  • 和加密結合可以用於認證

消息認證和數字簽名

※消息認證與數字簽名的區別

認證包括消息認證與身份認證兩類:

  • 消息認證:針對消息,主要驗證消息的來源以及完整性
  • 身份認證:針對通信方,主要驗證通信方的身份,通訊對端身份的唯一性和合法性
    數字簽名:是一種實現身份認證+消息認證的方法。
    消息認證認證來源,驗證信息的完整性,即驗證數據在傳送或存儲過程中未遭篡改、重放等。
    數字簽名認證個體,驗證信息發送者的身份,包括信源、信宿等的認證和識別。

※HASH函數的性質

  • 抗弱碰撞:明文的任何一點改變都會使Hash值發生變化。
  • 抗強碰撞:明文和Hash值是一一對應的。
    抗強碰撞自然抗弱碰撞。

這里的弱碰撞和強碰撞的區別在於,弱碰撞是已知一個消息去找碰撞,而強碰撞是在所有消息中找滿足碰撞的一組消息。

  • 單向性

MD5算法的原理

  • 填充消息

為什么位數正好也要進行填充:防止碰撞。

  • 附加消息長度

  • 初始化緩沖區

  • 分組處理消息
    每次處理一個消息分組:512位。一個消息分組的處理過程:
    算法的核心是壓縮函數,由四輪運算組成,每輪進行16步迭代。每輪使用不同的邏輯函數,記為F,G,H,I。
    T是事先產生的表格,包含64項,每項32位。512位信息在每輪被分為16個分組,每個分組為32位。
    image

  • 輸出消息摘要

本質其實就是根據消息對着基礎ABCD寄存器中的字符進行不斷的計算,最終輸出變化后的ABCD寄存器中的值。

MD5、SHA-1和RIPEMD-160的比較

image

MD5的攻擊方法

  • 枚舉法
  • 字典法
  • 彩虹表法

HASH攻擊的意義:碰撞服務器存儲的密碼。

彩虹表法

image

值域和定義域的意思就是方便收尾相接互相作為輸入輸出。

為了解決不同的明文也會產生同樣的結果的問題,對R(x)函數進行了改進。即,每次對R函數進行修改。
image

只存一系列函數處理的一頭和一尾,一系列函數一般是H R1 H R2 H R3這樣的順序交叉進行處理,可以有效防止重復。

生日攻擊的原理

  • 生日問題1:當你走進教室的時候,問教室里要有多少人使得存在跟你生日相同的人的概率超過50%?(弱碰撞性)
    解:求\(n\),使得\(q(n)=1-(\frac{364}{365})^n≥\frac{1}{2}\)
    解得\(n=253\)

  • 生日問題2:一個教室內,要有多少人才能使至少有二人的生日在同一天的概率超過50%?(強碰撞性)
    解:求\(k\),使得\((1-\frac{1}{365})(1-\frac{2}{365})…(1-\frac{k-1}{365})≈\frac{1}{2}\)
    解得\(k≈23\)
    image
    image
    說了這么多,其實生日攻擊就是寫出好的hash function最大的絆腳石。如果你把hash function的每個輸入值想成是n個人中的一個,再把輸出值想成是每個人的生日,那么生日問題就告訴我們,只需要很少的輸入值,就會有很大的可能性有至少兩個輸出值完全相同,也就違反了hash function的條件之一。這就是生日攻擊。
    生日攻擊能夠奏效就是因為這個值域太小,像我們的生日問題中值域只有365,所以只要70個人就能夠找到相同生日的兩個人。

可以參考:生日攻擊是什么,有什么用?


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM