什麼是訊息鑑別技術?
顧名思義,我們是在識別文件,不過比起去深究文章內涵與背景故事,我們通常會更關心這三件事:
- 送出的訊息是否完整且正確 (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是相同的,可以假定這份文件沒被修改過。
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,直觀來看有這幾種型式:
- 對 M 進行加密處理及用 M 產生信息戳記 T
- 先用 M 產生信息戳記,再用信息戳記 T 及 M 放入加密器產生 C
- 先對 M 進行加密處理,再用密文 C 產生信息戳記 T
M(Message)是我們欲處理的信息,C(Ciphertext)得出的是密文,來保證M的安全性,T是鑑別戳記(Tag),用來確認M的完整性。
然而,這三種方法都存在一個缺點,即是對於N個區塊而言,他們往往要進行2N次的處理,因為加密跟認證分開來了。為了解決這個問題,出現了IAPM與OCB這兩種新模式。
IAPM
S0~SM是用做擾亂資料,因為這是個近似ECB的模式。Sigma P 是由P1 Xor P2… Xor Pm-1得出的,Cm即為產生的校正碼。
OCB (Offset codebook Mode)
Checksum = M1 ⊕…⊕ Mn,對於流程的更細部內容,參見這邊