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)差別非常大,而且之間沒有任何關係。



MAC:

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

  

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

 

數字簽名:

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

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

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

 

數字證書:

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

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

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

 

Hash

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

 

HMAC 

HMAC(Hash Message Authentication Code,散列消息鑑別碼,基於密鑰的Hash

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

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規範中的應用:

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


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

 

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

 

 

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