對稱加密算法
- 對稱加密算法又可以分成流加密算法和塊加密 算法。
- 流加密算法又稱為序列加密算法或序列密碼,它每次只對明文中的單個位或單個字節 進行加密操作。這種算法的優點是能夠實時進行數據傳輸和解密,缺點是抗攻擊能力比 較弱。
- 塊加密算法又稱為分組加密算法或分組密碼,它每次對明文中的一組數據位進行加密 操作。現在使用的分組加密算法典型的分組長度是64位,因為經過密碼學家們證明,這 個長度大到足以防止破譯攻擊,而又小到足以方便使用。塊加密算法的優點是抗攻擊能力 好,但是實時性稍微差一點。
算法的安全性
-
唯密文攻擊。密碼分析者通過各種途徑得到了使用同一算法加密的密文,密碼分 析者通過分析這些密文得出部分或全部明文消息,有時候也能夠得到加密密鑰,這樣就可 以用來解密別的密文。這種情況下一般要求有較多的密文作為攻擊資料
-
已知明文攻擊。密碼分析者在幸運的情況下,不但得到了密文,而且得到了這些 密文相應的明文。他們通過密文和明文的對照推導出加密的密鑰或者設計一種新的算法, 使得使用相同密鑰和算法加密的信息都能夠被解密。
-
選擇明文攻擊。密碼分析者不但可以得到密文和相應的明文,并且在必要的時候 可以選擇被加密的明文,這樣,密碼分析者能夠獲取更多的信息用來獲得加密的密鑰或者 設計一種新的算法,使得使用相同密鑰和算法加密的信息都能夠被解密。
-
選擇密文攻擊。密碼分析者可以選擇不同的被加密的密文,而且能夠得到相應的 明文,從而從這些信息中推導出密鑰或設計新的解密算法。
-
選擇密鑰攻擊。事實上密碼分析者并不能選擇加密密鑰,這里指他可能具有各種 密鑰之間相互關系的一些專業知識,從而用這些專業知識達到破譯目的。
-
社會工程。事實上,很多情況下這是最有效的方法,就是通過欺騙、威脅、賄賂、 監視和其他非法手段對密鑰持有人進行攻擊,直到得到密鑰為止。
上述的所有攻擊手段 (除了最后一個)都可以作為我們評估一個算法安全性的參考依 據。事實上,沒有一個算法可以宣稱是絕對安全的,各種算法有不同層次的安全性。對算 法安全性的評估沒有統一的標準,但基本上可以從以下幾個方面考慮。
- 價值代價。如果破譯算法的代價大于加密數據的價值,算法可以算是安全的。
- 時間代價。如果破譯算法所需要的時間比加密數據需要保密的時間更長,算法可 以算是安全的
- 可能性。如果使用該密鑰加密的數據量遠遠小于破譯該算法需要的數據量,算法 可以算是安全的。
根據破譯算法程度的不同,可以將算法安全性分為五個等級,下面的安全性由低到高 列出。
- 全部破譯。能得到密鑰,使得所有使用該密鑰加密的密文都能被恢復成明文。
- 全盤推導。通過分析,可以找到一個替代算法,在不知道密鑰的情況下恢復出所 有該密鑰加密的明文。
- 局部推導。能夠從得到的密文中計算出相應的明文。 信息推導。通過分析可以得到部分有關密鑰或明文的信息。 不能破譯。無論給出多少密文信息,都不能恢復出明文信息。事實上,只要使用蠻力攻擊,幾乎所有實際的算法都是可以破譯的 (除了一次一亂密碼)。 在實際使用中,我們只要考慮一個算法在計算上的安全性就可以了。也就是說,當一 個算法用當前所能得到的所有資源都不能破譯的時候,就可以說這個算法是安全的。破譯 算法的難易程度可以用攻擊算法的復雜性來衡量。
攻擊算法的復雜性從下面三個方面衡量。
- 數據復雜性。即攻擊時需要的數據量。
- 計算復雜性。完成攻擊計算所需要的時間或計算量。
- 存儲量需求。進行攻擊所需要的最大存儲空間。
一般來說,攻擊的復雜性值等同于這三個因素中最小的值。
- 復雜性一般用數量級來表示,比如一個算法的計算復雜性是2^128,那么破譯這個算法 就需要2128次運算。這可能用最好的計算機也要花費1015年以上的時間才能完成計算,這 在實際中是不可行的,那么該算法也就是安全的。當然,現在的計算機速度快速發展,目 前看起來不可能破解的算法過幾年或幾十年可能就能輕而易舉地被破解。但是沒有必要擔 心,只要你使用的算法在最近的幾年或幾十年是安全的,那么就是一個計算上安全的算 法。以后計算能力增強了,自然會出現更強大的加密算法
非對稱算法的存在的問題
- 公開密鑰算法比對稱加密算法慢
- 公開密鑰算法抵抗選擇明文攻擊的能力較低。這是因為公開密鑰算法的加密密鑰 是公開的,攻擊者可以嘗試加密各種明文以跟獲取的密文相對照來確定明文。如果明文的 取值范圍是有限的,這種攻擊就很有效。而對稱加密算法因為密鑰都是秘密的,所以不容 易受到這種攻擊。
單向散列函數
- 單向散列函數結合了單向函數和散列函數的特點,是指在一個方向上工作的散列函 數。也就是說,從輸入值得到散列值很容易,但使散列值等于某一個值卻是非常困難的事 情。好的單向散列函數應該具備無沖突的特點。所謂無沖突,并非真正意義上的無沖突, 它實際上是指兩個不同的輸入產生相同散列值的可能性非常小。一般來說,一個好的單向 散列函數如果其輸入值有一位改變,那么將引起其散列值一半數據位的改變。所以,已知 一個散列值,要找到一個輸入值,使得其散列值等于已知散列值在計算上是不可能的。
- 單向散列函數在密碼學中的應用非常廣泛,基本上來說可以分為不加密散列值和加密 散列值的應用。不加密的散列值一般用作文件指紋或數據指紋。
- 加密的散列值一般稱為消息鑒別碼 (MAC),它的功能跟單向散列函數基本一樣,只有擁有解密密鑰的人才能驗證該信息。單向散列函數還應用在數字簽名中以提高運算 的速度。
數字簽名的弊端
- 數字簽名的抗抵賴功能時,基于一個隱性前提,即私鑰跟簽名者個人是 絕對等同的,但是私鑰和其使用者是兩個不可以等同的實體,因此 使用者完全可以聲明私鑰丟失造成數據的泄露。
- 增加限制的措施,比如將私鑰隱藏在不能讀出的硬件模塊 中,用于密碼用途的智能卡就是這樣的設備。
- 采用時間標記也可以一定程度上限制這種抵 賴行為,至少可以確保以前舊的簽名依然有效。事實上,時間標記在實際的數字簽名應用 中經常采用,它可以防止簽名重用和信息重放等攻擊。
多重簽名
- 多重簽名也是實際應用中可能經常遇到的問題,一般都使用單向散列函數,多個簽名 者可以分別對文件的散列值進行簽名,然后再一起發給接收者。如果不使用單向散列函 數,問題會麻煩得多。一種可能的方案是簽名者分別對原來的文件簽名,這樣得到的簽名 文件內容將是原來的n倍,n等于簽名者的個數;另一種可能方案是后一個簽名者在前一 個簽名者的簽名基礎上繼續進行簽名,直到所有簽名者都完成簽名,但是這樣同樣帶來一 個問題,即驗證的時候必須先驗證最后一個簽名者的簽名,然后往前類推,這帶來了應用 上的限制。
高級密鑰交換協議
連鎖密鑰交換協議
- 連鎖密鑰交換協議是解決中間人攻擊的一個巧妙的協議,當然不是一個能夠完全防止 中間人攻擊的協議,只是增加了中間人攻擊的難度。它基于這樣一種技術,即擁有加密消息的一半是沒有意義的,不能進行解密。這種技術是存在的,最簡單的例子就是分組加密算法,因為分組加密算法中消息的解密依賴初始向量,后面部分消息的解密要依靠前面的 消息,所以可以先發送后面部分的消息,然后再發送前面部分的消息,這樣,即使先得到 消息的后面部分也是不能解密信息的。
- 連鎖密鑰交換協議的基本步驟如下。
- 連鎖協議最重要的特點是,雙方發送消息的時候是相互連鎖的,也就是說,通信一方只有收到另一方發送的消息的一部分后才會繼續協議,否則就會等待或終止協議。這樣的 信息發送連鎖,使得中間的攻擊者沒有辦法進行竊聽式的中間人攻擊。
- 攻擊者可以在通信中截獲通信雙方的公鑰,并用自己的公鑰替代通信雙方的公開密 鑰。但是當攻擊者在第2步截獲到消息的時候,雖然該消息是用他的公鑰加密的,但是因 為只有一半,所以至少暫時沒有辦法解密,同時因為協議是連鎖的,所以他這時候只有兩 個選擇,要么偽造一個假消息給Jim,要么終止攻擊行為,我們假設他有勇氣繼續碰運 氣。在第3步的時候,他存在同樣的困難選擇,只好再偽造一個假消息。這樣,當他在后 續的兩步收到可以解密的全部消息時,他已經沒有辦法修改以前偽造的消息。當然,這樣 他還可以用偽造的消息假裝跟通信雙方繼續進行交談,但是這樣顯然比竊聽獲取有用的信 息更加困難。因為 他不使用自己的公鑰替換通信雙方的公鑰,一旦分組第一塊成功之后,就沒有機會解密雙方通信的內容;但是一旦替換了,就只能一直替換下去,就無法完成竊聽的功能。
使用證書的密鑰交換協議
- 基于公鑰算法的密鑰交換協議 之所以被中間人進行攻擊是因為無法將公鑰和個人的身份證明相互關聯。所以攻擊者可以隨意地用任何公開密鑰替代通 信雙方的公開密鑰。假設我們使得公開密鑰跟身份證明是緊緊聯系在一起的,那么攻擊者 就難以通過簡單的替換公開密鑰的方式冒充通信任一方。數字證書或者說數字簽名技術可 以將公開密鑰跟某個人的身份證明關聯在一起。
- 在這種高級密鑰交換協議中,需要一個可信任的第三方,這個第三方能夠驗證任何想 通過驗證的用戶,他是絕對可信的。他用自己的私鑰對一個用戶的公鑰和用戶個人信息進 行簽名,形成一個數字證書。可信任的第三方自己的公鑰是任何用戶都可以取得的,這樣 任何用戶都可以通過驗證這個第三方的數字簽名來確定通信對方發送過來的公鑰是不是真 的是他自己的公鑰。這樣,攻擊者想要冒充第三方就很困難,因為他沒有可信任的第三方 的私鑰,沒有辦法偽造他的簽名。
- 當然,這種使用證書的密鑰交換協議很依賴可信任的第三方,如果可信任的第三方受 到攻擊,整個通信系統的安全性將面臨威脅,但是這種攻擊顯然比中間人攻擊難得多。事實上,即便攻擊者取得了對第三方私鑰的控制權,也難以對以前簽發的公鑰證書進行更方便的攻擊。
?不需要密鑰交換協議的安全通信
?
?