現在我們可以繼續我們的場景:
假設有一天,alice
收到了乙份署名為
bob的檔案。
alice
希望能夠確認這份檔案一定是來自
bob;另外
alice
希望能夠確信,這份檔案在傳輸過程中並沒有被它人篡改。那麼基於非對稱金鑰演算法我們應該怎麼做?
確認檔案一定來自於bob
,其實就是
bob無法否認自己傳送過這份檔案。資訊保安中稱作
不可抵賴性;另一方面,確信檔案並沒有中途被篡改,則稱作不可篡改性。
在非對稱金鑰演算法中提到,公鑰加密的內容使用私鑰可以解密。同樣的,基於私鑰加密的內容使用公鑰也可以解密,兩者一一對應。因此我們可以很容易想到。如果bob
利用自己手裡的私鑰對檔案進行加密後,傳輸給
alice
。alice
再通過公鑰庫中
bob的公鑰進行解密,則可以證明檔案一定是由
bob發出(由於只有
bob持有私鑰)。另外,因為傳輸的是密文,如果能夠使用公鑰解密,同時也證明了檔案並沒有中途被篡改。這樣的做法其實已經同時滿足了不可抵賴性和不可篡改性。
然而,由於傳輸的檔案可能很大,為了證明檔案的不可抵賴性和不可篡改性,需要對整個檔案進行加密,由於非對稱演算法效率較低,這樣做的代價太大。因此常規的做法是用到
資訊摘要
和數字簽名
的方式。
所謂資訊摘要,其實就是某種hash
演算法。將資訊明文轉化為固定長度的字元,它具有如下特點:
①無論輸入的訊息有多長,計算出來的訊息摘要的長度總是固定的;
②用相同的摘要演算法對相同的訊息求兩次摘要,其結果必然相同;
③一般地,只要輸入的訊息不同,對其進行摘要以後產生的摘要訊息也幾乎不可能相同;
④訊息摘要函式是單向函式,即只能進行正向的資訊摘要,而無法從摘要中恢復出任何的訊息;
⑤好的摘要演算法,沒有人能從中找到「碰撞
」,雖然「碰撞
」是肯定存在的。即對於給定的乙個摘要,不可能找到一條資訊使其摘要正好是給定的。或者說,無法找到兩條訊息,是它們的摘要相同。
一般的,我們將資訊的摘要也稱作資訊的指紋。如同指紋的含義,相同的資訊一定會得相同的指紋,而僅通過指紋又無法還原出原始資訊。目前主要的摘要演算法有md5和sha1。
當有了資訊摘要技術以後,基於bob
向alice
傳送檔案的場景,我們可以進行如下的操作:
第一步:
① bob將原始的資訊進行一次資訊摘要演算法,得到原始資訊的摘要值;
② bob使用自己的私鑰,對該摘要值進行加密。得到資訊摘要的密文;
③ bob將原始檔案和摘要值的密文一起傳送給
alice
。④ 一般的,我們將原始檔案和摘要密文稱作bob
對原始檔案的簽名結果。
第二步:
① 當alice接收到
bob傳輸的資訊(原始檔案,資訊摘要密文)後,使用
bob的公鑰將摘要密文解密,得到資訊摘要明文;
② 使用資訊摘要演算法,取原文的摘要資訊,獲取原始檔案摘要資訊;
③ alice比較解密後的摘要資訊和取得的摘要資訊。如果相同,則可以證明檔案一定由
bob傳送,並且中途並沒有經過任何篡改。一般將這個過程稱作驗籤。
所謂數字簽名,就是對原始檔案的「指紋」進行了私鑰加密。這樣,即可保證檔案的特徵(摘要值)一定經過了私鑰的加密。同時由於資訊摘要的長度普遍不長(md5
為128
位,sha1
主要為256
位),也並沒有帶來太大的開銷。
如同對稱金鑰演算法,在大部分開發語言中,基於非對稱演算法的數字簽名,數字加密演算法。也都進行了一定的封裝。如下鏈結就比較詳細的描述了基於jce
如何實現數字簽名、加密、驗證等:
數字簽名與數字證書技術簡介(三)
基於非對稱金鑰演算法,bob生成了一對公私鑰。bob將公鑰發布在公開的金鑰庫中。而alice在向bob傳送加密檔案或者驗證bob簽名的檔案時,均要從公鑰庫取到bob的公鑰。我們已經知道,一般來說公鑰就是一段固定長度的字串,並沒有特定的含義。為了讓alice能夠方便的辨別公鑰,我們可以考慮對給公鑰附加...
數字簽名與數字證書
數字簽名 將 報文按雙方約定的hash 演算法計算得到乙個固定位數的 報文摘要。在 數學上保證 只要改動報文中任何一位,重新計算出的 報文摘要值就會與原先的值不相符。這樣就保證了報文的不可更改性。將該報文摘要值用傳送者的私人 金鑰加密,然後連同原報文一起傳送給接收者,而產生的報文即稱 數字簽名 數字...
數字簽名與數字證書
數字簽名 將 報文按雙方約定的hash 演算法計算得到乙個固定位數的 報文摘要。在 數學上保證 只要改動報文中任何一位,重新計算出的 報文摘要值就會與原先的值不相符。這樣就保證了報文的不可更改性。將該報文摘要值用傳送者的私人 金鑰加密 然後連同原報文一起傳送給接收者,而產生的報文即稱 數字簽名 數字...