訊息鑑別技術

什麼是訊息鑑別技術?

顧名思義,我們是在識別文件,不過比起去深究文章內涵與背景故事,我們通常會更關心這三件事:

  • 送出的訊息是否完整且正確 (protect integrity)
    • 你不會希望在匯款時多送了幾個 0
  • 發訊人的身分是不是正確的 (validate identity)
    • 防止有人假冒你幹些雞鳴狗盜的勾當
  • 發訊人不可否認曾做過的事 (Non-repudiation)
    • 沒辦法切割曾經幹過的壞事

要實踐訊息鑑別,有兩個簡單的方法:

  • CBC - residue , CMAC(Cipher-based MAC):在區塊加密時進行鑑別
  • HMAC :另外用個雜湊函式(Hash) 進行鑑別

MAC是什麼東東?

MAC是Message Authentication code的縮寫,由文件經過某些演算法(MAC algorith)產生的。MAC能夠擷取出文件訊息,這些訊息往往能代表該份文件的特徵,就像是指紋、DNA訊息一般,透過比對得出MAC,我們通常能得知文件的一致性。
如果從加解密的角度出發,我們可以把它當成一個Checksum,用其進行完整性或身分檢查。

MAC示例

要使用MAC,傳送方跟接受方需要共享一把鑰匙,這可以視為MAC演算法的一個參數。每當傳送方發送文件時,會經由演算法送出MAC,並附在文件中,接收方在收到文件後,會對收到的文件再做一次演算,如果兩方得出的MAC是相同的,可以假定這份文件沒被修改過。


CBC - Residue

CBC-Residue,其實是CBC的結果。其使用了2把Key,一把用於進行CBC模式,一把用於產生MAC(Residue)。CBC - Residue在加密過程幾乎沒有改變,唯一的不同是在最後一份明文Pn的加密,他分成兩個部份,我們把Pn和密文Cn-1做XOR產生的東東叫做Xn好了,一是Xn用Key1加密產生最後一份密文Cn,二是Xn用Key2加密產生一個渣渣,這個渣渣跟密文一點關係都沒有,我們把他當做一個校正碼。因為CBC特有的雪崩效應,使得先前的加密有ㄧ些小改變就會造成後續一連串的錯誤,所以我們才能把這個渣渣用做比對。


HMAC (Hash MAC)

1.什麼是 Hash ?

簡單來說,Hash是一個函式,即是數學上我們常常用F(X)表示的玩意兒,不過Hash函式有一個特性,Hash是單向的,我們無法透過結果去反推斷讀入的參數,即是說 H(A) = B,如果我們只給你B,是無法透過運算反推代入參數為A的。

若加解密的觀點來看,Hash做到的只有加密(從A變成B),而沒辦法解密(B無法逆運算至A),因此Hash只會用來做驗證。

此外,除了難以逆運算外,一個好的Hash我們還會希望它

  • 電腦計算上高效
  • 鍵的碰撞率低,也就是說,H(A)!=H(B)。

我們之前提到過,MAC產生出的可以說是一份文件的指紋,讓我們透過它來辨識文件的完整性,如果說兩份不同的文件,會產生出同一份MAC,那這個MAC的可信度便有待加強。

2.HMAC

HashMAC就是用Hash來進行驗證,市面上常見的MD5即是如此。

HMAC的原理很簡單,我們有相同訊息,相同Hash算法,那麼對一份相同的明文,Hash出來的東西就該相同。

傳送方
假設我們要輸送一份訊息 M = "HelloWorld"給接收方

1. 在傳送端進行Hash : H(M)
2. 將Hash的結果儲存為認證戳記 T = H(M)
3. 將T與M一起送至接收方
接收方
我們現在收到了 M' 與 T',因為不曉得改過沒有所以加了'

1. 對 M' 進行 Hash : H(M')
2. 將Hash的結果儲存為 T''
3. 驗證 T' 是否等於 T''
4. if(T'==T'') -> M == M'

或許你會有個小疑問,如果說我有能力更改 M’,那我應該也能更動 T’,然而這麼做的前提是必須持有 H(X) 與原訊息才行。


數位簽章

雖然叫做簽章,不過這跟紙筆一點關係也沒有,它是一種用來辨別身分的加密型式,嚴格來說,數位簽章是以數學演算法或其他運算方式,對要簽署的文件進行加密,所產生的結果。

先看看怎麼產生一份簽章吧:

  • 有一份文件M
  • 計算文件的摘要 h = Hash(M)
  • 加密這份摘要:Ek1(h)
  • 加密的結果便是簽章 S = Ek(h)

之後通過同時送出M與S給接收方,簽章的傳送就完成了。

在接收方

  • 收到了文件M’與簽章S’
  • 計算出文件M’的摘要 h’ = Hash(M’)
  • 解密收到的簽章S’: h’’ = Dk2(S’)
  • 比對 h’ 與 h’’ 的關聯性
  • 傳送者的身分獲得認證

目前看來,這些流程與MAC相當近似,但細節上略有不同。比如在資料處理上,MAC考慮的是這份文件到底有沒有被動過,而不在乎文件本身,所以MAC會破壞資料儲存結構,產出一個固定長度的驗證碼,比如MD5就是吃進一個不定長度的文件,把文件擠壓抽取成128位元(16位元組)的散列值,而數位簽章則會保存文件與憑證,你該知道這是我簽的,也該知道我簽了些什麼。

不同之處還有MAC與簽章的協定方式:MAC是由傳送方跟接收方約定而成,建立一個除錯碼以及演算出除錯碼的方式,接收方在獲得密文後再行驗證。不過數位簽章無法這麼做,因為它是對外公開的,我們無法去約束對方怎麼簽,但能肯定的是,這份簽章只有他簽它的出來。

此外,數位簽章與MAC最大的差異在於金鑰系統,MAC採用對稱式,而簽章是非對稱式,也就是說,數位簽章加密與解密用的金鑰是不同的,加密用的是私鑰,解密用的是公鑰,即是非對稱式金鑰系統。

讓我們先回歸簽章的目的,它要能:

  • 驗證
    • 簽章者身份 (不可偽冒)
    • 簽章日期、時間
    • 訊息完整性 (不可偽造)
  • 透過簽章,能讓第三方來解決紛爭 (不可否認性)

首先,雙方鑰匙一定要不同,不然接收者就能用你的鑰匙來仿冒你。

不過重點還是在這個第三方。數位簽章既為數位,我們能把它當成網路上的身分證,當社會大眾想驗明你的正身時,就把簽章蓋在他臉上,不過隨隨便便這麼做,也沒人知道你這簽章是真是假,你總不會打了好幾把鑰匙給別人,當然也不會傻到公開自己的私人鑰匙。

那麼你也許會說:我們需要一把公開的鑰匙,問題就來了,我們該把鑰匙放在哪裡?會不會有人的鑰匙打得跟我一模一樣?或者很多人都有我的公開鑰匙,搞得大家不知道該跟誰拿,誰才是真的?

一個可能的答案是:我們需要在你我之外,具備公信力的組織,在確認了我們的身份後,把私鑰留給你,在用你的姓名啦、申請日期啦、使用期限等等訊息混在一起作出你的公鑰,對外公開為數位憑證。以後大家想知道你之為你,算算你的數位憑證就成啦 ~


Authenticated Encryption

對於加密與驗證,剛接觸時往往會存在一個迷思。無論是加密或驗證 :

  • 我們都有一個演算法,一份明文。
  • 我們都會把明文給塞到算法裡
  • 結果都會跑出一個看似亂碼的東東

這個東東在加密上稱為密文,在鑑別上則叫做驗證。儘管跑出來的結果都不是給人看的(通常如此),不過行為的目的卻大不相同。

加密做的是:保證資料的安全性
驗證做的是:保證資料的完整性

而雙管齊下的方法就是Authenticated encryption,直觀來看有這幾種型式:
3 ways of authenticated encryption

  • 對 M 進行加密處理及用 M 產生信息戳記 T
  • 先用 M 產生信息戳記,再用信息戳記 T 及 M 放入加密器產生 C
  • 先對 M 進行加密處理,再用密文 C 產生信息戳記 T

M(Message)是我們欲處理的信息,C(Ciphertext)得出的是密文,來保證M的安全性,T是鑑別戳記(Tag),用來確認M的完整性。

然而,這三種方法都存在一個缺點,即是對於N個區塊而言,他們往往要進行2N次的處理,因為加密跟認證分開來了。為了解決這個問題,出現了IAPM與OCB這兩種新模式。


IAPM

IAPM

S0~SM是用做擾亂資料,因為這是個近似ECB的模式。Sigma P 是由P1 Xor P2… Xor Pm-1得出的,Cm即為產生的校正碼。


OCB (Offset codebook Mode)

Checksum = M1 ⊕…⊕ Mn,對於流程的更細部內容,參見這邊

OCB