android開發你應該懂的密碼基礎

LemonYang發表於2016-12-09

本篇文章其實算是《圖解密碼技術》一書的讀書筆記。對於密碼技術的入門推薦好好看完這本書。

對稱密碼

對稱加密,是指加密和解密使用相同的金鑰。對稱加密的優點是速度比較快,但是會存在金鑰配送的問題。在金鑰配送方面可以使用Diffie-Hellman演算法來解決。下面是對稱加密常用的演算法:

  • DES(Data Encryption Standard)

一種將64位元的明文加密成64位元密文的對稱密碼演算法。des的金鑰長度規格上講是64位,因為每隔七位元設定一個錯誤檢查位元,實質金鑰長度是56位。示意圖如下所示:

android開發你應該懂的密碼基礎

  • 三重DES

為了增強DES的加密強度,將DES重複3次所得的一種密碼演算法(注意加密的步驟是:加密-解密-加密)。示意圖如下所示:

android開發你應該懂的密碼基礎

  • AES(Advanced Encryption Standard)

AES加密資料塊分組長度必須為128位元,金鑰長度可以是128位元、192位元、256位元中的任意一個(如果資料塊及金鑰長度不足時,會補齊)

分組密碼的模式

分組密碼:每次只能處理特定長度的一塊資料的一類密碼演算法;流密碼:對資料流進行連續處理的一類密碼演算法

  • ECB(Electronic CodeBook mode)電子密碼本模式

在ECB模式中,將明文分組加密之後的結果直接成為密文分組.示意圖如下所示:

android開發你應該懂的密碼基礎

  • CBC(Cipher Block Chaining mode)密碼分組連結模式

在CBC模式中,首先將明文分組與前一個密文分組進行異或運算,然後再進行加密(初始化向量IV).示意圖如下所示:

android開發你應該懂的密碼基礎

  • CFB(Cipher FeedBack mode) 密文反饋模式

在CFB模式中,前一個密文分組會被送回到密碼演算法的輸入端.示意圖如下所示:

android開發你應該懂的密碼基礎

  • OFB(Output FeedBack mode) 輸出反饋模式

在OFB模式中,密碼演算法的輸出會反饋到密碼演算法的輸入中。示意圖如下所示:

android開發你應該懂的密碼基礎

  • CTR(Counter mode) 計數器模式

CTR模式是一種通過逐次累加的計數器進行加密來生成金鑰流的流密碼.示意圖如下所示:

android開發你應該懂的密碼基礎

下面使用一張表格總結上面幾種模式的差異和優缺點:

模式 優點 缺點 備註
ECB模式 簡單、快速;
支援平行計算(加密、解密)
明文的重複排列會反映在密文中;
通過刪除、替換密文分組可以對明文進行操作;
對包含某些錯誤位元的密文進行解密時,
對應分組會出錯;不能抵禦重放攻擊
不應使用
CBC模式 明文的重複序列不會反映在密文中;
解密支援平行計算;
能夠解密任意密文分組
加密不支援平行計算;
對包含某些錯誤位元的密文進行解密時,
第一分組的全部位元以及後一個分組的相應位元會出錯;
推薦使用
CFB模式 不需要填充;
解密支援平行計算;
能夠解密任意密文分組
加密不支援平行計算;
對包含某些錯誤位元的密文進行解密時,
第一分組的全部位元以及後一個分組的相應位元會出錯;
不能抵禦重放攻擊
現已不使用,推薦使用CTR模式代替
OFB模式 不需要填充;
可事先進行解密、加密的準備;
加密、解密使用相同結構;
對包含某些位元錯誤的密文進行解密時,
只有明文中相應位元會出錯
不支援平行計算;
主動攻擊者反轉密文某些位元時,
明文分組相應位元也會受到反轉
推薦使用CTR模式代替
CTR模式 不需要填充;
可事先進行解密、加密的準備;
加密、解密使用相同結構;
對包含某些位元錯誤的密文進行解密時,
只有明文中相應位元會出錯;
支援平行計算(加密、解密)
主動攻擊者反轉密文某些位元時,
明文分組相應位元也會受到反轉
推薦使用

公鑰密碼

跟對稱加密不同,非對稱加密在加密和解密兩個階段使用的是不同的金鑰。加密時候使用的金鑰我們稱之為公鑰,解密時使用的金鑰稱之為金鑰。通常公鑰都是公開的,私鑰是通訊雙方自己保留不能公開的。在非對稱加密中使用到的主要是 RSA演算法 。其互動流程大概如下所示:

android開發你應該懂的密碼基礎

單向雜湊函式(訊息摘要)

單向雜湊函式只能辨別出“篡改”,無法辨別出“偽裝”

  • 常見單向雜湊函式

    • MD5
    • SHA-1 SHA-256 SHA-384 SHA-512
  • 應用

    • 檢測軟體是否被篡改
    • 一次性口令
    • 為隨機數生成器
    • 數字簽名
    • PBE(Password Base Encryption)基於口令的加密
    • 訊息認證碼
  • 攻擊

    • 暴力攻擊,如彩虹表

訊息認證碼MAC(message authentication code)

訊息認證碼是一種確認完整性並進行認證的技術。訊息認證碼的輸入包括任意長度的訊息和一個傳送者與接收者之間共享的金鑰,輸出一個固定長度的資料,稱為MAC值

訊息認證碼可以識別篡改和偽裝,但是不能解決“對第三方證明”以及“防止否認”這兩個問題

  • 實現方法

    • 使用單向雜湊函式,如HMAC
    • 使用分組密碼實現

      將分組密碼的金鑰作為訊息認證碼的共享金鑰來使用,並使用CBC模式將訊息加密,將除最後一個密文分組以外的丟棄,並將最後一個密文分組作為MAC值

  • 應用例項

    • IPsec:對通訊內容的認證和完整性校驗都是採用訊息認證碼完成
    • SSL/TLS:對通訊內容的認證和完整性校驗也使用了訊息認證碼
  • 攻擊

    • 重放攻擊
    • 暴力破解

數字簽名

數字簽名可以識別篡改和偽裝,還能防止否認

  • 數字簽名與公鑰密碼

  • 應用

    • 安全資訊公告
    • 軟體下載
    • 公鑰證書

      驗證數字簽名時需要使用合法的公鑰,而為了確保公鑰合法,可以將公鑰作為訊息體,對其加上數字簽名

    • SSL/TLS

      SSL/TLS在認證伺服器身份是否合法的時候需要使用伺服器證書,而伺服器證書就是加上了數字簽名的伺服器公鑰

  • 實現

    使用RSA

  • 攻擊

    • 中間人攻擊
    • 對單向雜湊函式的攻擊
    • 利用數字簽名攻擊公鑰密碼
    • 證書

為公鑰新增數字簽名

下面附上一張簡單的思維導圖

android開發你應該懂的密碼基礎

上面總結的比較簡單,只是大概談及了一下概念。如果對於具體細節感興趣的推薦看一下《圖解密碼技術》這本書。感謝你寶貴的時間閱讀這篇文章。

相關文章