消息完整性和哈希函數 (Message Integrity and Hash Function)

1. Message Integrity - 消息的完整性

前面我們很詳細的講解了 怎麼保證信息的安全性, 從古典加密方式, 現代加密準則, 一次一密再到對稱加密, 可以說我們安全方面的建設目前是有了一定的進展, 那麼問題來了, 怎麼保證消息的完整性呢? 首先我們來看下消息的安全性和消息的完整性的區別與聯繫

1.1 消息安全性和消息完整性的聯繫

  • 安全和完整是可以有一個而沒有另一個的, 不同的策略針對了不同的目標

  • 加密可以檢測消息的修改, 比如一個人修改了消息的密文導致解碼的明文沒有了意義, 這時我們就可以說這個消息被更改了, 但是這不是加密的意義, 加密的意義是爲了防止消息被竊聽, 對應了我們第一講中的Interception:
    在這裏插入圖片描述
    加密一般來說不提供任何完整性.

  • 完整性對應的是Fabrication 和 Modification

在這裏插入圖片描述

在這裏插入圖片描述

2. Message Authentication Code - 消息認證碼

2.1 Defination

A message authentication code 是由3個算法定義的: Gen, Mac, Vrfy.

  1. Gen: 生成一個隨機的key.
  2. Mac: 這一步是生成用於認證是否被更改的tag t.
    輸入: key 和 message, 其實這個很好理解你要確保消息沒被改動肯定要確保這個tag和源消息要聯繫在一起
    輸出: tag t -> Mack(m)
  3. Vrfy:
    輸入: tag t 和 message ∈ m {0,1}* (一個特定長度的bit串)
    輸出: 如果接受的話(也就是沒被改動的話)輸出1, 不然拒絕的話(也就是被修改了或者丟失的話)輸出0.
Vrfy~k~(m, Mac~k~(m) )=1

從這裏是不是可以看出點問題, 這裏的m根本不關心是密文還是明文, 因爲我們根本不關心你的消息會不會被泄露, 我們只關心會不會有人來更改我們的數據, 如果有我們要有能力檢測到並糾正.

下面我們來看下MAC的工作流程
在這裏插入圖片描述在這裏插入圖片描述
本發送了一條信息, 並且附上了tag t, 這時候有個壞人掌控了他們的溝通信道, 在中間截獲了消息並且發送了m’,t’ 接收方收到了這個更改後的消息, 這個壞人覺得大功告成了, 沒想到接受放運行了verify算法後發現輸出是0, 她意識到消息被更改了, 於是她通知對方去換一個安全的信道, 壞人的計劃落空了. 在這裏我們根本不關心祕密安不安全或者說我們就是明文傳輸不怕被別人看到, 但是我們關心信息有沒有更改, 或者說發送方是不是接收方所期待的發送方.

2.2 MAC 安全的定義

  1. Threat model
    (1). Adaptive chosen-message attack” 自適應的選擇明文攻擊 (僅僅比選擇暗文攻擊差一個檔次)
    (2). 假設攻擊者可以誘導發送方對攻擊者選擇的消息進行身份驗證 - 這和美軍誘導日軍發送密文是一樣的選擇明文
  2. Security goal
    (1). 存在性不可僞造
    (2). 攻擊者不能在任何未被髮送方認證的消息上添加虛假的標籤
    一個滿足上述定義的MAC可以在任何需要完整性的地方使用

2.2 Replay Attacks - MAC的不足

在這裏插入圖片描述
什麼是重放攻擊呢? 重放攻擊就是, 針對已經有的一條信息, 我完全copy發送給對方或者持有相同加密祕鑰的第三方, 比如俄羅斯 中國 英國 在一個羣裏, 俄羅斯跟中國說石油漲價吧, 中國說好, 攻擊者這時把好給複製了, 下次俄羅斯說借我點錢, 攻擊者直接代替中方回覆好,問題就來了. 由於是完全copy所以不會出現tag和信息不對等的情況那麼vrfy出來一定是1也就是說一定會判定信息沒被修改過, 從某種程度上來講, 這是對的, 但是它沒有辦法在這種辦法上保證發的那個人是你期盼的那個人. 總的來說這個方法如果只靠MAC自己是不行的.

  1. 但也不是很難解決比如加上時間戳或者其它的狀態.
  2. 這個攻擊是無法被不加狀態的無狀態機防範的.

2.3 MAC Contruction for Fixed-length Message

這個Fixed-length Message 是不是很像block cipher 每個block 信息的長度都是固定的, 那我們自然而然的想到我們是不是能用block cipher的方式生成祕鑰.

  1. 寫一個 F function: length-perserving psedorandom function
  2. 用上面的F構建一個MAC π function
  3. 用 F 去生成一個獨一無二的key
  4. Mack(m) = output Fk(m)
  5. Vrfyk(m,t): output 1 iff Fk(m) = t

在 F 確實是一個 length-perserving perdorandom function 的情況下, MAC π 是一個安全算法.
注意這裏的安全指的是完整性領域的安全定義就像上面說過的一樣.

但是這個是有一些drawbacks的比如說, block cipher 每個塊都是有固定的長度的很短, 那我們這樣的構建就被限制到了認證很短的, 固定長度的信息, 下一步我們要去認證長的長度可變的信息. authenticate long, variable length message.

這個其實對應了之前我們講的 Electronic Codebook mode:
在這裏插入圖片描述

2.4 (Basic) CBC - MAC

這個東西是什麼呢, 就是用了cipher block chain mode 的MAC, 其實很簡單剛纔能加密的少無非是因爲每個塊之間相互獨立, 那我們把他們串起來用串起來的信息獲得t不就行了, 串起來的信息包含了前面所有信息, 所以只要有一個信息更改那麼t所對應的vrfy算法解出來一定是0.
在這裏插入圖片描述
最後只輸出最後那個tag ti:ti=Fk[mi XOR Fk[mi-1]]

Fk對應了上面的length perseving pesudorandom function:
把每個塊出來的tag t和下一個明文消息異或後在通入tag生成器裏, 這樣生成的tag就會帶有前面所有的明文消息信息. 但是與之前的CBC-AES不同的是我們這裏只輸出最後一個tag, 大家有沒有發現在這一節中tag幾乎就等於上一屆中的暗文, 因爲這一節中tag背後的認證纔是要保護的東西, 就像上一節中密文背後的明文才是要保護的東西一樣.
這個 CBC - MAC 和 CBC mode 有什麼不同呢?

  1. CBC-MAC 是 沒有 initialization vector的 也就意味着如果兩條消息一樣那他們的tag也是一樣的.
  2. In CBC-MAC, only the final value is outputted 那麼接收方用這個和上面的mi理論上就能驗證消息了

2.41 (Basic) CBC - Mac 的安全性問題

  • If F is a length-preserving pseudorandom function, then for anyfixed l, basic CBC-MAC is a secure MAC for messages of length l ⋅ n — I.e., the sender and receiver must agree on the length parameter l in advance
    這裏面的l指的應該是一個block的塊數, n 應該是每個block裏存放的信息長度.

2.42 能不能直接從tag裏面恢復信息呢

這個問題我們先回去看下當初CBC mode 是怎麼解出信息的, 很簡單:

  1. 用第一個密文反解出第一個中間明文
  2. 用第一個中間明文去和IV異或獲得第一個明文
  3. 用第二個密文用同樣的方法獲得中間明文2
  4. 中間明文2去和上一步的密文1異或獲得明文2
  5. 剩下的以此類推

這裏面的關鍵其實是每一步都生成了並輸出了當前round的密文 而我們這裏的每一輪的tag是沒有導出的
我們從圖中直接看一下
在這裏插入圖片描述

  1. 先從最後一個tag用解密算法解出中間明文
  2. 但是這個時候需要上面的tag解出明文信息mi, 可是你上一步就沒有導出哇怎麼可能解出來

2.43 CBC - MAC Extension 解決長度不可變的問題

目前爲止我們只解決了長度不夠的問題, 現在要去解決長度不可變的問題, 因爲上面也說了, 每個block的長度是需要提前定義好的這也是CBC - MAC 安全的一個必要條件.
這個問題其實都不是個問題, 你想想我們當初爲了解決那個CBC mode 裏面信息完全一樣密文也會完全一樣的問題加入了Initialization Vector 我們現在照樣可以在每條信息中封裝長度l 如下圖所示:
在這裏插入圖片描述
其實就是在應用 (Basic) CBC - MAC 之前先預先確定長度.

3. Hash Function

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章