天天看點

Javacard技術總結之--- 消息摘要算法

 Javacard技術總結之--- 消息摘要算法

概述:

       在智能卡與外界的通信中,消息摘要主要用來保證資訊交換過程資料的完整性(integrity)、真實性(authenticity)、私密性(Confidentiality)。消息摘要是對原始資料按照一定算法進行計算得到的結果,它主要檢測原始資料是否被修改過。通常用公鑰密碼算法進行數字簽名時,一般不是對消息直接簽名,而是對消息進行hash等運算獲得一個固定長度的消息摘要,再對這個消息摘要進行簽名,這樣既可以減少計算量、提高效率,也可以破壞數字簽名算法的某些代數結構。

消息摘要和加密的差別:

消息摘要與加密不同,加密是對原始資料進行變換,可以從變換後的資料中獲得原始資料,而消息摘要是從原始資料中獲得一部分資訊,它比原始資料少得多,是以消息摘要可以看作是原始資料的指紋。

消息摘要算法的種類:

消息摘要算法包含 MD,SHA,MAC三大系列。經常用來驗證資料的完整性,也是是數字簽名的核心算法。這三大體系的典型算法如下:    

l  MD算法包括:MD2,MD4,MD5 三種算法

l  SHA算法包括 SHA-1,SHA-2系列算法:SHA-224,SHA-256,SHA-384,SHA-512

l  MAC算法主要包括: HmacMD5,HmacSHA1 、HmacSHA256,HmacSHA384, HmacSHA512算法

l  消息摘要算法衍生算法:RipeMD系列、RipeMD128....Tiger,GOST3411以及Whirlpool算法

消息摘要(MD)原理:

例如當甲和乙通信時,如下圖所示,甲有一段秘密的文字如:"My Secret Words",消息摘要(假如使用MD5)經算法變換後得固定長度128bit到MD5碼(b9944e9367d2e40dd1f0c4040d4daaf7),将資料和消息摘要一起發送給乙方。乙方收到資料時使用事先約定好的消息摘要算法對資料進行處理,如果乙方生成的MD5不是(b9944e9367d2e40dd1f0c4040d4daaf7),則說明資料在傳輸的過程中遭到破壞。假如"My SecretWords "(多了一空格),MD5(12c774468f981a9487c30773d8093561)差别非常大,而且之間沒有任何關系。

Javacard技術總結之--- 消息摘要算法

MAC:

上述的通訊過程會産生問題,即若傳遞過程中别人修改了資料時,同時也修改了消息摘要。乙方就無法确認資料是否正确。消息驗證碼(MAC)可以解決這一問題。 使用消息驗證碼的前提是 甲方和乙方雙方有一個共同的密鑰,這樣甲方可以将資料計算出來的消息摘要加密後發給乙,以防止消息摘要被改。由于使用了共同的密鑰,是以稱為“驗證碼”。MAC機制的傳輸過程如下圖所示: 

Javacard技術總結之--- 消息摘要算法

使用消息驗證碼的前提是 甲和乙雙方有一個共同的密鑰,這樣甲可以将資料計算出來的消息摘要加密後發給乙,以防止消息摘要被改。由于使用了共同的密鑰,是以稱為“驗證碼”。 

數字簽名:

使用以上兩種技術可以保證資料沒有經過改變,但接收者還無法确定資料是否确實是某個人發來的。盡管消息碼可以确定資料是某個有同樣密鑰的人發來的,但這要求雙方具有共享的密鑰,若有一組使用者共享,我們就無法确定資料的來源了。    

數字簽名可以解決這一問題。數字簽名利用非對稱加密技術,發送者使用私鑰加密資料産生的消息摘要(簽名),接收者使用發送者的公鑰解密消息摘要以驗證簽名是否是某個人的。由于私鑰隻有加密者才有,是以假如接收者用某個公鑰解密了某個消息摘要,就可以确定這段消息摘要必然是對應的私鑰持有者發來的。     

使用數字簽名的前提是接收資料者能夠确信驗證簽名時(用發送者的私鑰加密消息摘要)所用的公鑰确實是某個人的 (因為有可能有人假告公鑰)。數字證書可以解決這個問題。   

數字證書:

數字證書含有兩部分資料:一部分是對應主體(機關或個人)的資訊,另一部分是這個主體所對應的公鑰。即數字證書儲存了主體和它的公鑰的一一對應關系。同樣,數字證書也有可能被假造,如何判定數字證書的内容的真實性呢?是以,有效的數字證書必須經過權威 CA的簽名,即權威CA驗證數字證書的内容的真實性,然後再在數字證書上使用自己的私鑰簽名(相當于在證書加章确認)。   

這樣,當使用者收到這樣的數字證書後,會用相應的權威 CA的公鑰驗證該證書的簽名(因為權威的CA的公鑰在作業系統中己經安裝)。根據非對稱加密的原理,假如該證書不是權威CA簽名的,将不能通過驗證,即該證書是不可靠的。   

若通過驗證,即可證明此證書含的資訊(發信人的公鑰和資訊)是無誤的。于是可以信任該證書,便可以通過該證書内含的公鑰來确認資料确實是發送者發來的。于是,雙方通信時, 甲把資料的消息摘要用自己的私鑰加密(即簽名),然後把自己的數字證書和資料及簽名後的消息摘要一起發送給乙,乙處檢視甲的數字證書,假如甲的數字證書是經過權威CA驗證可靠的,便信任甲,便可使用甲的數字證書中附帶的甲的公鑰解密消息摘要(這一過程同時确認了發送資料的人又可以解密消息摘要),然後通過解密後的消息摘要驗證資料是否正确無誤沒被修改。   

Hash

一般翻譯做“散列”,也有直接音譯為"哈希"的,就是把任意長度的輸入(又叫做預映射, pre-image),通過雜湊演算法,變換成固定長度的輸出,該輸出就是散列值。這種轉換是一種壓縮映射,也就是,散列值的空間通常遠小于輸入的空間,不同的輸入可能會散列成相同的輸出,而不可能從散列值來唯一的确定輸入值。簡單的說就是一種将任意長度的消息壓縮到某一固定長度的消息摘要的函數。

HMAC 

HMAC(Hash Message Authentication Code,散列消息驗證碼,基于密鑰的Hash

算法的認證協定,HMAC運算利用雜湊演算法,以一個密鑰和一個消息為輸入,生成一個消息摘要作為輸出。可看做是消息摘要和Hash的一個結合。常用的算法有:

l  HmacMD5  

l  HmacSHA1  

l  HmacSHA256  

l  HmacSHA384  

l  HmacSHA512

 HMAC需要一個加密用散列函數(表示為H)和一個密鑰K。我們假設H是一個将資料塊用一個基本的疊代壓縮函數來加密的散列函數。我們用B來表示資料塊的字長。(以上說提到的散列函數的分割資料塊字長B=64),用L來表示散列函數的輸出資料字長(MD5中L=16,SHA—1中L=20)。鑒别密鑰的長度可以是小于等于資料塊字長的任何正整數值。應用程式中使用的密鑰長度若是比B大,則首先用使用散列函數H作用于它,然後用H輸出的L長度字元串作為在HMAC中實際使用的密鑰。一般情況下,推薦的最小密鑰K長度是L個字長。(與H的輸出資料長度相等)。

 GP規範中的應用:

       圖一:生成消息摘要,未使用加密

Javacard技術總結之--- 消息摘要算法

       圖二:在圖一描述生成消息摘要基礎上,使用密碼,生成消息摘要的簽名

Javacard技術總結之--- 消息摘要算法

圖三:在APDU指令中,将要發送的資料先進行MAC,将生成的消息認證資料附加到發送的指令後面。

Javacard技術總結之--- 消息摘要算法

繼續閱讀