一、幾個問題
在提出問題之前,先創建一個使用場景,發送方(甲方)要給接收方(乙方)發送投標書。大家知道,投標書都包括發送方的標的,這個標的是不能被競標者知曉,更不能被競標者修改的。在傳輸的投標書時,提出了以下三個問題:
1、怎么保證發送方(甲方)發送的投標書不泄密給攻擊者呢
2、在傳輸過程中,攻擊者雖然解密不了密文,但是對密文進行編輯,比如截掉了一段信息,加上了一段亂碼,怎么辦?在這個場景中,舉一個極端的例子,修改了標的,怎么辦
3、接收者(乙方)接到了投標書,怎么確定是甲方發出的呢?就是說甲方抵賴,說沒有發送過這樣的一份標書怎么辦?
帶着這三個問題,來學習一下對稱加密技術、非對稱加密機制、Hash函數等密碼學基礎理論。
一、基本概念
保密性:防止信息泄露給未授權個人、實體,信息僅被合法用戶使用的特性。
完整性:是指所有資源只能由授權方或以授權的方式修改,即信息未經授權不能進行改變的特性。
可用性:是指所有資源在適當的時候可以由授權方訪問,即信息可被授權實體訪問並按需求使用的特性
不可否認性:也就是不可抵賴性,確認發送方是發送方本人的特性。
信道的傳輸 模型如下圖一。
二、第一個問題:怎么保證保密性呢?
很顯然,加密!
對於較大文件,需要使用對稱加密算法。
在對稱加密算法中,數據發送方將明文(原始數據)和加密密鑰一起經過特殊加密算法處理使其變成復雜的加密密文,然后在信道中傳輸。
接收方收到密文后,需要使用同一個密鑰及加密算法的逆算法對密文進行解密,得到明文。
在對稱加密算法中,使用的密鑰只有一個,收發雙方使用同一個密鑰對數據進行加密和解密,這就要求解密方事先知道加密密鑰。
如果攻擊者截獲了在信道中傳輸的信息了,由於攻擊者沒有密鑰,沒辦法得到明文,也就是標書,這就保證了數據的保密性。
對稱加密算法的優點:對稱密鑰保密,算法公開、計算量小、加密速度快、加密效率高。
對稱加密算法的缺點:怎樣安全無誤地將對稱密鑰傳輸給接收方?這是對稱加密算法的天生的缺點,胎里帶來的。
圖二:對稱加密技術的原理圖
2.2對稱加密的算法
對稱加密的算法包括兩種,一種是分組加密,包括DES、AES、SM4算法等;
另一種是序列密碼,包括RSA密碼、ElGamal密碼、SM2橢圓曲線公鑰加密算法等。
2.3對稱加密的問題
對稱加密算法最大的問題,就是怎樣安全無誤地將密鑰傳輸給接收方?
三、第二個問題:怎樣傳輸對稱加密算法的密鑰K呢?
實際上,圖一中安全信道是不存在的,如果有安全信道,那么就不需要加密了,直接把明文丟進安全信道內,一切都解決了。這樣的安全信道是不存在的。那么怎樣傳輸對稱加密技術中的密鑰呢?在此我們引入了另一項加密技術,公鑰密碼體制。公鑰是指公開的密鑰。
在對稱加密技術中,發送方和接收方公用一套密鑰,而公鑰密碼技術中,發送方和接收方分別有公鑰和私鑰,公鑰公開,私鑰只有自己知道,並且公鑰和私鑰是成對的,可以並且只能相互加解密。原理見圖三。
圖三 非對稱加密技術
公鑰密碼算法,由於加密、解密的密鑰不同,也叫作非對稱加密算法。
在公鑰密碼體制中,發送方和接收方都有兩套密碼,一套公鑰,一套私鑰。也就是說發送方有自己的公鑰、私鑰和接收方的公鑰。接收方有自己的公鑰、私鑰和發送方的公鑰。公鑰和私鑰互為加解密密鑰。也就是說用公鑰加密可以用同一方的私鑰解密;用私鑰加密,可以用同一方的公鑰解密。
對稱加密算法簡單,加解密密鑰相同且密鑰較短,並且需要傳輸密鑰,因此安全性較弱,加密耗時短,常用來加密大數據。
非對稱加密算法,算法復雜,密鑰相對於對稱加密算法比較長,因此安全性強,加密耗時時間也長,適合加密少量數據。那么可以用對稱加密技術加密真正的明文(通常是大數據),而后用非對稱加密技術加密對稱加密的密鑰(通常數據量較少),這樣綜合利用兩種加密技術,配合堪稱完美。這就是數字信封技術。相當於將對稱加密的密鑰放在一個安全的信封內,在信道中傳輸。
圖4 數字信封技術
第三個問題:怎么保證不可否認性呢?怎么樣保證是甲方發送的標書,如果有人冒充甲方用同樣的加密算法加密了一份假的標書,發送給乙方,乙方誤認為是甲方發送的,甲方怎么證明不是自己發送的呢?或者甲方發給了乙方一份標書,后續又否認自己發過這份標書,這樣的情況怎樣用技術避免呢?
在現實場景中,可以用手工簽名保證不可否認,同樣在網絡場景中,可以用數字簽名來確保不可否認性。
在公鑰密碼體制中,發送方和接收方都有公鑰和私鑰,公鑰是公開的,私鑰只有自己知道。如果用發送方的私鑰加密,用公鑰解密,就可以確保是發送方本人發送的,不是偽造的。這就是數字簽名技術,也是公鑰密碼體制的另一個應用:認證。原理見圖5。
圖5 數字簽名技術
提出一個問題:公鑰密碼體制加密算法復雜,加密時間較長,不適合加密大數據,那么用發送方的私鑰加密標書明文需要很長時間,怎么樣解決這樣的問題呢?
第四個問題:怎么樣知道標書的密文在傳輸過程中沒有被攻擊者篡改呢?
攻擊者截獲了密文,由於不知道密鑰,沒辦法解密,看不到標書的明文;但是可以修改密文,添加一段亂碼或者截掉一段密文,尤其截掉的密文是標的時。那么怎樣知道在傳輸的過程中,信息有沒有被修改過呢?在這里再次引入一個函數,散列函數,也就是常說的Hash函數。Hash函數可以將任意長度的輸入,映射成固定長度的輸出h,輸出h稱作報文摘要,輸出的位數要比輸入的位數小很多。
Hash函數的定義:Hash函數將任意長度的輸入M映射成固定長度的輸出hash碼h。
定義中有兩個點:①任意長度的輸入②固定長度的輸出。
為什么Hash函數可以知道密文在傳輸過程中沒有被篡改呢?這就牽扯到Hash函數的兩個特性
①無論是多長的輸入,改變輸入的任意一位或者多位,都會導致輸出的改變。也就是說是不存在x、y,x不等於y,但是x、y的hash值是一樣的。在傳輸的過程中,如果改變了密文的任一位,那么解密出來的明文的Hash值和原來的Hash值是不一樣的,接收方就可以知道密文在信道中被篡改了。
②Hash函數的單向性。也就是由Hash值不能得到相應的報文。如果Hash函數不具有單向性,攻擊者截獲了明文的Hash值之后,就可以得到明文了,Hash函數也就失去了保證報文完整性的基礎。
使用Hash函數保證數據的完整性、可用性原理件圖三。
步驟:
①對標書明文,用對稱密鑰K進行對稱加密,形成密文
②對標書明文求Hash值,步驟①和步驟②可以互換
③將標書的Hash值拼接在密文后面,形成新的密文,在信道上傳輸
④接收方收到拼接成的密文后,先將密文和Hash值分開,用對稱密鑰K進行解密,得到標書的明文
⑤對步驟④中得到的明文求Hash值
⑥將步驟⑤中的Hash值和步驟④中的原始Hash值進行比較,
綜上所述,我們運用了對稱加密算法、非對稱加密算法(加密、認證兩個功能)、數字信封技術、Hash函數等技術保證了標書在傳輸過程中的保密性、完整性、不可否認性。