密碼學學習整理二
密碼學總結二
一.對稱密碼學
密碼體制的分類
- 對稱密碼(加解密使用相同的密鑰)
- 流密碼(序列密碼)
- 分組密碼
- 非對稱密碼(公鑰密碼,加解密使用不同的密鑰)
1.對稱密碼學概述
隨機性
- 一個隨機序列要求每個比特產生的概率都是1/2
- 每個比特與其他比特統計上相互獨立
- 對於計算機而言,計算機產生的一系列隨機數其實是周期性的,只是周期很大
任何人考慮用數學的方法產生隨機數肯定是不合理的
計算機本身只能產生偽隨機序列
隨機序列類型
- (一般)偽隨機序列
- 偽隨機序列應該在統計上是隨機的
- 密碼學意義上安全的偽隨機序列
- 不可預測性,即使知道了產生序列的算法、以前產生的所有比特,也不可能通過計算來預測下一個比特是什麽(準確預測成功的概率很低)目的是防止攻擊者在知道若幹比特後,成功猜測後續比特
- 真隨機序列
- 不能被可靠地重復產生(用完全同樣的輸入操作兩次,得到的是兩個不相關的序列)
- (一般)偽隨機序列
如何得到真隨機序列
使用一種專門的設備(真隨機數發生器),輸入是各種無法預測的信號:周圍空氣狀況、電流的變化率…
輸入是不斷變化的,輸出也就不可重復。
有人能預測產生的下一個數嗎? 他必須重構輸入信號,這沒人能做到
一次一密
- 加密:明文流與密鑰流對應比特異或
- 解密:密文流與密鑰流對應比特異或
- 特點:密鑰流是真隨機序列,且不重復使用(故得名 一次一密)
- 安全性:因為密鑰流是真隨機的,所以沒人能預測下一個比特
- 是無條件安全的,即使攻擊者具有無限的計算資源和計算能力,也無法破譯一次一密 (理論上不可破譯,無條件安全的,對於任意密文 y 和明文 x,都有 Pr[x | y] = Pr[x],即,不能通過分析密文獲得明文的任何信息)
- 原因:密鑰是隨機的,而且明文與密鑰是統計上相互獨立的,使得密文也是隨機的,故而密鑰的隨機性很好的隱藏了明文的統計特性
證明:
密鑰流是隨機的,則每個密鑰比特的概率滿足: Pr[k=0]=1/2, Pr[k=1]=1/2
假設明文流某個比特的概率滿足: Pr[m=0]=p, Pr[m=1]=1-p
對應的密文比特的概率:
Pr[c=0] = Pr[k=0]Pr[m=0]+Pr[k=1]Pr[m=1]=1/2
Pr[c=1] = Pr[k=0]Pr[m=1]+Pr[k=1]Pr[m=0]=1/2
- 只使用異或運算,軟硬件實現非常簡單。但實用性不強
- 密鑰是真隨機的
- 密鑰長度至少等於明文長度
- 每個密鑰只用一次
流密碼
基本思想
用一個較短的密鑰生成密鑰流,在攻擊者(計算能力是有限的)看來是隨機的(偽隨機的)。不是無條件安全的,僅是計算上安全的
- 產生密鑰流的任務由 密鑰流生成器 完成
- 關鍵:如何生成偽隨機性“好”的密鑰流,故而關鍵在於密鑰流生成器的設計
- 分類:
同步流密碼
密鑰流只根據密鑰產生與明文流無關
自同步流密碼
密鑰流不僅與密鑰有關還與明文流有關
- 密鑰流生成器的內部構造
驅動部分
為非線性組合部分提供統計特性“好”的序列 (一般偽隨機序列)
非線性組合部分
將提供的輸入序列組合成密碼學特性“好”的序列 (密碼學意義上安全的偽隨機序列)
- 驅動部分應該實現簡單,且提供統計特性較好的序列。反饋移位寄存器(FSR)可以滿足該要求,是流密碼設計中的常用模塊
FSR的功能
- 以密鑰為初始狀態(輸入)
- 按照確定的遞推關系(由反饋函數決定)
- 產生一個周期長、線性復雜度高、統計特性好的初始序列
- 並將輸出提供給非線性組合等密碼變換,以產生抗密碼分析能力強的偽隨機序列
- 為什麽不直接使用種子作隨機數
- 速度問題:收集種子通常很耗時
- 熵(不確定性):種子的熵通常比較低,但不管其熵如何,偽隨機序列發生器都能產生統計性好的序列
- 如何收集種子才是安全的?
- 毫秒計的時間
- 用戶的輸入
- 鼠標點擊的位置...它們混合在一起便有了不可預測性,可以抵抗種子猜測攻擊
分組密碼
- 特點
- 將明文分成等長(比特)的明文分組。
- 輸入一個明文分組,輸出一個等長(通常)的密文分組。
實質
實質是設計一種算法,能在密鑰控制下,把 n比特明文分組 簡單而迅速地置換成 唯一的 n比特的密文分組,並且這種變換是可逆的(解密)所以,它必須是一個 雙射函數 (因為明文分組空間等於密文分組空間)- 設計分組密碼的兩種基本技術
混亂
使明文和密文之間、密鑰和密文之間的相關統計特性極小化,從而使攻擊者無法找到密鑰(常用方法代換)
擴散
將明文及密鑰的影響盡可能迅速地散布到較多個密文比特中(常用方法置換)
混亂和擴散的思想由香農提出,目的:抵抗攻擊者對密碼系統的統計分析
- 代換
什麽叫 代換?
加密時,明文的每個分組都應產生唯一的密文分組 (具有可逆性,為了解密),稱這種明文分組到密文分組的可逆變換為代換如果明文分組為n比特,則明文分組有多少個可能的取值?
2^n
不同可逆變換有多少個?
2^n!
- 如果分組長度太小,系統則等價於古典的代換密碼,容易通過對明文的統計分析而被攻破。但從實現的角度來看,構造分組長度很大的代換結構也不現實
實際中,常將明文分組再分成較小的“段”,對每個“段”用不同的代換結構(子代換)進行變換,稱每個子代換為代換盒,簡稱為 S盒
- 特點
數據加密標準(DES)
- 分組長度:明文分組、密文分組長度都是 64比特
- 密鑰空間:密鑰長度也是 64比特,其中有效密鑰長度 56比特 (有8比特奇偶校驗位)
- 算法:解密過程與加密過程完全相同,唯一不同的是,子密鑰的使用順序完全相反
- DES的安全性主要依賴於8個非線性代換S盒
- 具有雪崩效應: 明文或密鑰的一點小的變動使密文發生一個大的變化。
- DES算法目前最大的問題: 隨著計算機技術的飛速發展,56bit 的 有效密鑰長度不足以抵禦窮舉攻擊。因為密鑰空間大小只有2^56 ≈ 10^17
- 三重DES (3DES) :使用兩個或三個密鑰,執行三次DES算法
流密碼與分組密碼的比較
- 流密碼的優勢
- 速度快
- 代碼量少(RC4的代碼只有30行)
- 分組密碼的優勢
- 密鑰可以重用
- 有標準化算法(DES、AES)
- 流密碼的優勢
- 填充
通常,明文長度是不固定的,按固定長度分組時,往往最後一個分組長度不足,如何解決?
填充(Padding)- 如何填充
- 填充一些字符補齊最後一個分組。
- 把最後一個分組的最後一個字節稱作填充指示符,所表示的十進制數字就是填充了多少字節。
- 明文尾部、填充的字符和填充指示符一起作為最後一組進行加密。
- 不論最後一個分組長度是否足夠,都要進行填充
- 長度不足時正常填充
- 長度足夠時新建分組填充一個組
分組密碼的工作模式
為什麽需要工作模式?
分組密碼的輸入是一個明文分組,是定長的。
要加密的明文是變長的,長度往往大於一個明文分組。
即使有了安全的分組密碼體制,也需要采用適當的工作模式來隱蔽明文的統計特性,以提高整體的安全性。模式名稱 縮寫 英文全稱 電子密碼本 ECB Electronic CodeBook 密碼分組鏈 CBC Cipher Block Chaining 密碼反饋 CFB Cipher FeedBack 輸出反饋 OFB Output FeedBack 計數器 CTR Counter ECB
- 每個明文分組獨立加/解密
- 優點
- 簡單、高速
- 無差錯傳播:單個密文分組出現錯誤只會影響該分組的解密,不會影響到其他分組
- 缺點
- 分組彼此獨立,相同密鑰下,相同明文分組得出相同密文分組
- 這會暴露明文數據的格式和統計特征
- 且易受重放、插入攻擊,五種模式中安全性最弱
- ECB適用於發送少量數據的場合,一般不推薦
CBC
- 每個明文分組先與前一密文分組異或,再進行加密
- 初始矢量 IV
- 加密第一個明文分組時,尚無反饋的密文,為此需要預先置入一個,稱為 初始矢量 IV(Initial Vector)
- 收發雙方必須使用相同IV
- IV無需加密保護,可以隨密文一起發送給接收方
- 最好使用不同IV(比如每次將IV加1)加密不同明文
- CBC適用於文件加密,較ECB模式慢
- 有限差錯傳播
- 單個密文分組出現錯誤會影響該分組和後面一個密文分組的解密
- 可自同步,只要後面一個密文分組沒錯,便不會影響後續密文分組的解密
CFB
- 速度
- 實現簡單(只要求加密算法)
- 比CBC慢很多,每次只有少數比特完成加密
- IV
- 加密不同的明文,必須使用不同的IV
- 差錯傳播
- 單個密文分組出現一個比特錯誤,不僅影響該分組,還會最多影響後續[64/j]個密文分組的解密
- 自同步
- 單個密文分組出現錯誤,只要後續[64/j]個密文分組沒有錯誤,後面的便可正確解密
- CFB適用於 明文按字符(如電傳電報)或按比特處理的流密碼中
- CFB適用於 無延遲的加密和傳播
- CFB適用於 容忍以少量錯誤擴展換來恢復同步能力的場合
- 速度
OFB
- 速度
- 實現簡單(只要求加密算法)
- 比CBC慢很多,每次只有少數比特完成加密
- IV
- 加密不同的明文,必須使用不同的IV
- 無差錯傳播
- 單個密文分組出現錯誤,只影響該分組的解密
- 自同步
- 能從密文錯誤中得以恢復;但丟失密文比特會無法實現自同步
- 密鑰流
- 可預計算 (因為密鑰流獨立於明文)
- OFB適用於 必須避免錯誤傳播的高速同步系統
- 速度
CTR
- 速度
- 實現簡單(只要求加密算法)
- 效率高
- 可預計算
- 可並行加密、吞吐量僅受可並行數量的限制
- 其他
- 可隨機訪問密文數據塊
- 可證明安全性
- CTR適用於 需要並行處理的應用領域
- 速度
- 對稱密鑰管理
- 保護密鑰是很重要的,因為所有的安全性都依賴於密鑰的機密性(柯克霍夫斯原則)
- Q&A
- 是否可以記住密鑰,這樣就不用存儲,別人也偷看不了?
- 理論上可以,但不實際,因為密鑰是隨機的,很難記憶
- 既然有地方安全保存密鑰,為啥不直接把敏感信息放在那裏?
- 保護短的密鑰比保護數以兆計的信息更容易
- 是否可以記住密鑰,這樣就不用存儲,別人也偷看不了?
- 用 密鑰 保護數以兆計的信息,用一些其他技術保護大約16字節(128bit)的密鑰
- 主要技術
- 基於口令的加密(PBE)
- 加密
- 選擇一個口令
- 偽隨機序列發生器產生一個salt
- 用一個算法混合口令和salt,通常使用Hash函數
- 從Hash函數的輸出中取出所需要長度的比特作為密鑰
- 密鑰用完後丟棄。用腦子記住口令。
- salt無需保密,可以和加密後的數據一起保存。
- 解密
- 輸入口令
- 從保存點(磁盤)取出salt和密文
- 用算法(Hash函數)混合口令和salt,產生密鑰
- 用該密鑰解密密文,以恢復明文
- 加密
- 為什麽不直接用口令作密鑰?
- 口令的熵很小,遠達不到密鑰所要求的隨機程度
- salt (鹽值) 是幹什麽用的?
- 為防止字典攻擊中的預計算
- 為什麽salt和密文一起保存,保密salt不是更安全?
- 使用salt的唯一目的是防止字典攻擊中的預計算,而不是增加安全性
- 即使salt不保密,仍能達到目的。
- 此外,如果保密salt的話,還不如直接保密密鑰。
- 基於硬件的密鑰存儲
- 生物統計學
- 基於口令的加密(PBE)
- 保護密鑰的密鑰
- 通信時,通常使用兩種密鑰
- 會話密鑰 (臨時密鑰)
- 密鑰加密密鑰 (KEK)
- 使用方法
- 每次通信使用不同的會話密鑰保護明文
- KEK保護會話密鑰,並將之傳給對方
- 目的
- 因為每次通信使用不同的會話密鑰,攻擊者無法獲得同一密鑰加密的大量密文,使得破譯更加困難
- 用KEK保護會話密鑰,用什麽保護KEK?
- 使用 基於口令的加密,步驟如下:
- 用口令和salt產生KEK。
- 用KEK加密會話密鑰,用會話密鑰加密明文
- 記住口令,保存salt和加密後的會話密鑰
- 將密文和加密後的會話密鑰傳給對方
- 至於KEK,丟掉就OK了
- 使用 基於口令的加密,步驟如下:
- 通信時,通常使用兩種密鑰
- 對基於口令的加密的攻擊
- 假設攻擊者闖入你的電腦,偷走salt和密文(或 加密後的會話密鑰),他如何計算密鑰?
- 窮舉攻擊密鑰(無需salt 也可以發動)
- 字典攻擊 (猜測口令)
- 因為salt不保密,如果攻擊者獲得了salt,他仍能發起字典攻擊,只不過要多花一些時間
- 構造或下載一本常用口令的字典,然後嘗試每個口令和salt產生的密鑰
- 兩種攻擊方法的比較
- 相比之下,字典攻擊速度更快。但若口令不在字典裏,當然不會成功
- 一個聰明的攻擊者一般會這樣做
- 首先嘗試字典攻擊,失敗後換用改進的窮舉密鑰攻擊。
- 如何抵擋字典攻擊
- 基本思想
- 想辦法 降低攻擊者的計算速度
- 基本方法
- Hash函數混合salt和口令後,將輸出再次用Hash函數混合,重復進行多次,假設1000次。
- 優點
- Hash函數計算速度比你想象的快得多。
- 事實上,計算1000次Hash函數比你從鍵盤輸入口令的時間還要短。
- 但攻擊者不得不對字典中每個口令計算1000次,使他總的計算時間會很長
- 其他的實用方法
- 對於一些在線系統,如ATM機、網上銀行、電子郵箱、論壇等,可以限制用戶輸入口令的次數
- 若在規定次數內沒有輸入正確的口令,便吞卡,或提示半小時後才能再次使用系統
- 基本思想
- 假設攻擊者闖入你的電腦,偷走salt和密文(或 加密後的會話密鑰),他如何計算密鑰?
- 基於硬件的密鑰存儲
- 基於硬件的密鑰存儲
- 把密鑰保存在一個硬件設備上
- 令牌
- 可以隨身攜帶:錢包裏、鑰匙鏈上、當戒指戴
- 攻擊者要獲得密鑰,必須先拿到令牌,這增加了攻擊難度
- 令牌內部還有進一步保護措施
- 需要輸入一個正確的口令才能使令牌發揮作用
- 試圖用物理手段獲得密鑰,令牌還有自毀功能
- 令牌的唯一缺點
- 必須把密鑰加載到內存裏才行,有可能會被木馬等病毒偷走
- 但密鑰使用完畢就從內存中抹掉了,短短幾分鐘甚至幾秒鐘的停留還是問題不大的
- 令牌
- 密碼加速器
- 有專門進行密碼運算的芯片,比一般CPU處理密碼更快,也比常規計算機更安全的存儲數據。
- 安全特性
- 存儲空間對外界不可見
- 一旦被撬,有自毀裝置
- 不允許密鑰離開。加密時把明文送入加速器,它返回密文。
- 通常與令牌一起使用
- 只有插入令牌,提供令牌正確的口令,加速器才能工作
密碼學學習整理二