寫在前面:
最近因為疫情,閉關了半個多月準備的事情延期了,也不知道什麼時候才能弄。另外的事情又冒出來了,所以只能把可搜尋加密先放放,寫一下密碼學的複習筆記了。但最近寫可搜尋加密發現還是有人看的,讓我十分有動力。忙完這點事情希望可以儘快把可搜尋加密更完。
下面就進入今天的正題 —— 密碼學基礎概念。
在開始介紹之前可以先看看三個有趣的問題:
① 電話拋幣協議 這個問題簡單描述就是:在沒有第三方協助下,通話雙方有辦法在電話裡模擬拋擲一枚公平的硬幣嗎?
② 百萬富翁問題 這個問題簡單描述就是:兩個百萬富翁相比較一下誰更富有,但是不想暴露自己的確切錢數,也不想讓第三方知道,要怎麼比較呢?
③ 零知識證明問題 這個問題簡單描述就是:在不洩露任何有用資訊的前提下,向驗證者證明自己確實知道某一事情。
關於這些問題其實網上有很多寫得很好的文章,在這裡我只是給出一個對其簡單解釋的文章/課件連結,想要深入瞭解可以自行搜尋。
一、基本概念
接下來就對密碼學中經常用到的一些字母簡單介紹。
M —— 明文空間 C —— 密文空間 K —— 金鑰 E —— 加密演算法 D —— 解密演算法
有E(m)=c;D(c)=m.
一些常見的人物:
Alice:協議發起者 Bob:協議應答者 Eve:竊聽者和可能的攻擊者 Oscar:被動的觀察者,僅僅根據從公開通道獲得的資料進行破譯 Malice,Mallory:主動的攻擊者,可能會攔截資料、篡改資訊和冒充合法的通訊者。
1.1 基於公開通道的攻擊手段
可以看到有;①中斷 ②竊聽 ③篡改 ④偽造 四種攻擊手段。
攻擊又可以分為被動攻擊和主動攻擊。被動攻擊難以被檢測到,但可以用密碼學方式來防範。主動攻擊常常是對資料流的篡改,可以被檢測到。
(原諒我比較懶不想在畫圖了,直接把筆記的圖貼上來hhh)
1.2 密碼分析的攻擊方式
根據攻擊所能獲得的資訊資源,可以將其攻擊方式分為六類:
① 唯密文攻擊:攻擊者有一些訊息的密文,這些訊息都是用同一加密演算法的。攻擊者的目的是恢復儘可能多的明文,當然最好是獲得訊息的加密金鑰。
② 已知明文攻擊:攻擊者在得到密文的同時還知道這些訊息的明文。攻擊的目標就是根據加密資訊推匯出用來加密的金鑰,或者等價的,即使沒有找到金鑰但是能找到一種方法,能對同一金鑰加密的密文獲得其明文。
③ 選擇明文攻擊: 攻擊者不僅可以獲得一些密文-明文訊息對,而且能選擇被加密的明文。這比已知明文攻擊更加有效,因為攻擊者可以選擇能加密的特定明文塊去獲得密文,那些快可能產生更多金鑰訊息。
④ 自適應選擇明文攻擊: 這是比選擇明文攻擊具有更多許可權的攻擊方式。攻擊者不僅可以選擇一大塊明文用來加密獲得密文,還可以基於以前的結果修正這個選擇,選擇另一塊餘地一塊明文相關的明文塊。
⑤ 選擇密文攻擊: 攻擊者能選擇不同的被加密的密文,並可能得到對應的解密的明文。比如,攻擊者能選擇不同的被加密的密文,並可能得到對應解密的明文。比如,攻擊者獲得了某個解密機,或者攻擊這是在滲透在保密系統內部的員工,可以有一定的許可權獲得某些密文的原文等。
⑥ 選擇金鑰攻擊: 指密碼分析者具有不同的金鑰間關係的有關知識。如在類似於差分密碼分析的相關金鑰分析中有所應用。
1.3 基於金鑰的演算法
加密和解密演算法,根據所使用的金鑰的性質,通常分為兩類:對稱演算法和公開金鑰演算法。在實際使用中,加密和解密的金鑰可能有所區分,下面兩個式子更精確的描述加解密過程:
y = Ek1(x) (1)
x = Dk2(y) (2)
(1)對稱金鑰密碼演算法
加密金鑰k1和解密金鑰k2相同或相關(k1和k2可以相互推導)。
主要包含 序列演算法 和 分組演算法。
序列演算法:一次只對明文中的單個位元(又是對位元組)運算。
分組演算法:對明文中一組位元進行運算。
對稱金鑰密碼演算法例子:古典加密體制、DES、AES.
(2)非對稱金鑰面積碼演算法(公開金鑰演算法)
加密金鑰k1和解密金鑰k2之間沒有任何關聯。在使用中,通常將加密金鑰公開,所有人都可以用這個金鑰加密,而只有解密金鑰的持有者才可以解密。
Alice只要知道Bob的公鑰,就可以將自己的訊息用Bob的公鑰進行加密,然後傳送給Bob.對於加密後的訊息,只有Bob才能夠解密。
例子:RSA.
1.4 密碼協議
密碼協議是應用密碼學,解決實際資訊系統中資訊保安問題的方式。協議是一系列步驟,它包含雙方或多方。設計它的目的是要完成一項任務,協議不同於演算法和任務,它具有如下特點:
(1)協議中的參與方都必須瞭解協議,並預先知道所要完成的所有步驟。
(2)協議中的每個參與方都必須同一並遵守它。
(3)協議必須是清楚的。每一步都必須明確定義。如進行通訊或完成一方或者多方運算,並不會引起誤解。
(4)協議必須是完整的。對每種情況必須規定具體的動作。
密碼協議的主要目標:
密碼協議在安全系統中,其關鍵性目的並不是保證密碼演算法的不可破譯,二是假設密碼演算法本身是安全的。藉助這種安全的密碼演算法,達到以下四個主要目標:
(1)機密性
搭線竊聽者Eve不能讀取到通道上的傳輸的資訊的明文,主要的手段是先加密後傳輸,由接受者解密。
(2)完整性
接收者Bob需要確認Alice的訊息沒有被更改過。密碼學的雜湊函式,就提供了檢測方法來檢測資料是否被攻擊者有意無意地修改過。
(3)認證性
接收者Bob需要確認訊息確實是Alice傳送的,而不是冒名頂替的行為。通常這種認證包含兩類:實體認證 和 資料來源認證。對訊息中所涉及參與方的鑑別,也常用身份鑑別來表示。身份認證主要是確認主體是都合法的參與者;資料來源認證主要是確認訊息是由他所聲稱的主體生成和傳送的。
(4)抗抵賴性
也稱為不可否認性。對於一個已經進行的行為,參與的主體不能否認。即傳送者時候不能否認其傳送訊息的行為,資料接收者不能否認其接收資料的行為。
1.5 密碼演算法的安全性
(1)無條件安全(Unconditionally secure)
無論破譯者有多少個密文,他也無法解出相應的明文。即使解出也無法驗證正確性。
(2)計算上安全(Conputationally secure)
破譯代價超出訊息本身價值,破譯時間超出資訊有效期。
1.6 對加密系統的要求
(1)系統應該是實際上安全的。截獲密文或已知明文對時,要決定金鑰或任意明文在計算上不可行的。
(2)加密解密演算法適用於金鑰空間中所有元素。
(3)系統易於實現,使用方便。
(4)系統的安全性不依賴於對加密體制或加密演算法的保密,而是依賴於金鑰,即Kerckhoff原則。
(5)系統的使用不應使通訊網路的效率過分降低。
1.7 “採用混淆、擴散和乘積的方法來設計密碼”
(1)混淆
混淆:是密文和明文、金鑰之間的關係複雜化。
“混淆”可以隱藏明文、密文、金鑰之間的任何關係,好的“混淆”可以使複雜甚至強有力的密碼分析工具不得奏效。最容易的方法是“代替”法。
(2)擴散
擴散:將每一位明文和金鑰的影響擴大到儘可能多的密文位中。
“擴散”是一種將明文冗餘度分散到密文中的方法。即將單個明文或金鑰位的影響儘可能擴大到更多地密文中去,不僅將統計關係隱藏起來,也使密碼分析者尋求明文冗餘度增加了難度。最簡單的“擴散”方法是“置換”法。