隨機預言機模型學習


一,哈希函數

對於密碼學中的哈希函數,需要滿足兩個要求:

  1. 單向性:只能正向計算而不能逆向計算;輸出的長度與輸入的長度無關。
  2. 防碰撞:不存在兩個不同的消息M1和M2,使得H(M1)=H(M2)。

然而,哈希函數並不是真正的隨機函數,隨機函數是難以實現的。但是我們可以利用假裝隨機函數來證明安全性。

二,隨機預言機

在密碼學里面,隨機預言機(英語:Random oracle)是一部預言機(簡單說像是理論的黑箱),對任何輸入都回傳一個真正均勻隨機的輸出,不過對相同的輸入,該預言機每次都會用同一方法輸出。換句話說,隨機預言機是一個將所有可能輸入與輸出作隨機映射的函數。

安全性證明的解釋

安全性證明通常考慮兩個或多個當事方的交互,其中一方是就是我們的對手。 在一個典型的例子中,大多數玩家都是“誠實的” ,這意味着他們會按照一個明確的安全協議進行操作。 另一方面,對手可以為所欲為。 對手的目標是破壞這個計划。

對於加密方案,允許對手做能夠在“真實世界”環境中可以做的事情。 例如: 他可能能夠獲得選擇明文的加密選擇密文的解密。 在大多數情況下,他會攔截由一個誠實的加密器傳輸的合法密文。 在這種情況下對手的目標是學習潛在的明文(即解密)。

標准的做法是假設各方都知道方案或協議,包括如何計算使用的哈希函數。 這是一個常識性的假設,有時也被稱為科克霍夫斯原理(Kerckhoffs 原理)。 此外,我們通常假設對手在某些方面是有限的——他沒有無限的計算能力或時間,這意味着對手不能暴力破解解密的密鑰。

隨機預言機模型中的安全性證明。 所有參與者(Encryptor、 Decryptor 和對手)都可以調用隨機預言,后者為它們計算哈希函數並向所有參與者提供一致的響應。即將理想的哈希函數(隨機函數)放在預言模型,任何一方需要的哈希操作都由隨機預言機模型完成。

利用哈希函數的流密碼

1. 隨機選擇一個密鑰(比如128位長),並與發送方和接收方共享。將 IV 設置為 1。

2. 將明文消息切割成等長的塊 M1,…,MN,其中每個塊的長度正好與哈希函數的輸出長度相等。

3. 使用 || 表示連接,對消息進行加密,如下:

C1 = H(key || IV)       ⊕ M1

C2 = H(key || IV+1)   ⊕ M2

CN = H(key || IV+N) ⊕ MN

4. 輸出 (IV, C1, C2, ..., CN) 作為密文。

5. 確保在加密下一條消息之前設置IV = (IV+N+1)。

簡單的證明

假設我想證明這個方案在隨機預言模型中是安全的,通常我們會使用“安全”的特定定義來處理真正的對手可以做的一些事情。 我們將使用以下簡化的描述:

某個誠實的人——加密機——要加密一條消息。敵人會截獲密文。如果敵人能夠了解除文本長度之外的任何有關潛在明文的信息,那么他就“贏了”。

根據上面的方案描述,加密者首先選擇一個隨機密鑰(步驟1)。 他把他的明文分成塊(步驟2)。 對於每個塊 i=1到 N,他查詢預言以獲得 H(key || i) 。 最后,他用純文本塊(步驟3)對接收到的哈希表進行 XOR 操作,並發送密文(C1,... ,CN)以便敵方攔截(步驟4)。

我們現在可以做以下觀察

  1. 在內部,預言從一個空表開始。
  2. 每次預言從加密器收到一個新的表單查詢,它都會為輸出值產生一個新的完全隨機的字符串表示輸出值。 它將輸入和輸出都存儲在表中,並將輸出發送回加密器。
  3. 加密器使用這些隨機字符串中的某一個對每個消息塊進行 XOR 操作,從而形成密文塊(C1,... ,CN)。
  4. 加密器從來不會對相同的輸入字符串請求兩次,因為IV總是遞增的。最后,我們做一個最重要的觀察。
  5. 使用完全隨機的密鑰字符串是一種非常有效的加密方法。事實上,它是一次性的,只要對手不知道隨機字符串,結果的密文本身就是隨機分布的,因此不會顯示關於底層消息的任何信息(除了它的長度)。

根據觀察(5),我們所要做的就是證明當預言對“key || i”進行哈希時,(a)每個返回值都是完全隨機的;(b)對手不了解這些返回值。如果我們能做到這一點,那么我們就能保證密文(C1,... ,CN)將是一個隨機字符串,而對手對底層明文一無所知!

最終分析

上面所提出的(a)部分是很簡單的。當加密器要求預言計算H(key || i),前提是以前沒有計算過這個值,那么預言將生成一個完全隨機的字符串。而且,加密器從來不會對相同的輸入值請求兩次,因為它總是更新它的IV值。

(b)部分稍微難一點。有沒有什么方法可以讓對手知道即使是i從1到N的一個值H(key|| i)的預言輸出?預言不會將它的表公開,而且對手無法“偵聽”加密器發出的哈希調用。

但是對手可以查詢預言。具體來說,他所要做的就是在“key|| i”上查詢任何1 <= i <= N的預言,他將得到加密器用於加密密文的一個字符串。如果對手掌握了這些字符串中的一個,她可以很容易地恢復(至少部分恢復)明文,我們的論證就不再有效了。

這里有一個明顯的問題:對手不知道密鑰。因此,為了在“key || i”上查詢,對手必須猜測密鑰。 

但是對我們來說幸運的是,密鑰是隨機的,而且相當大(128位)。 這告訴了我們一些關於對手成功概率的信息。

具體來說: 如果她只做了一個猜測,那么她猜對正確的密鑰的概率是相當小的: 可能的密鑰數中的一個。 對於我們的具體例子來說,她的成功概率是1/(2^128) ,這是個天文數字。 當然,她可以嘗試多次猜測;如果是q,那么成功概率上升到q/(2^128)。

我們開始時的基本假設是,對手的計算能力有限。 這意味着她只能執行一定數量的哈希。 在正式的安全性證明中,我們可以使用多項式和指數時間。 但是,與其這樣做,不如讓我們插入一些具體的數字。

假設對手只有時間計算2^40(1.1萬億)哈希值。 假設我們使用了一個128位的密鑰,那么她猜測密鑰的概率最多是(2 ^ 40) / (2 ^ 128)1 / (2 ^ 88)。 這仍然是一個相當小的數字。

你認為在現實世界中對手能夠計算超過2^40的哈希值嗎? 代入你自己的數字——計算保持不變。如果你認為這個方案不夠安全,你可以嘗試讓密鑰變長。

這里的要點是,我們已經證明了在隨機預言模型中,上面的方案“與密鑰一樣安全”。換句話說,對手攻擊該方案的最大希望是通過暴力猜解的方式找到密鑰。只要密鑰足夠大,我們就可以有把握地得出這樣一個“現實的”結論,即對手知道信息的概率很低。

三,證明流程

一般流程

當我們說一個加密方案是“可證明的安全”時,我們通常指的是在某種假設下它是安全的。 對於大多數實際的方案來說,這個假設本質上是數學性質的。 例如,我們可以假設很難分解大的復合數,或者很難在格中找到最短的向量,從而找到一個加密方案。 在這種情況下,“難搞”並不意味着“我不知道該怎么做”。它的意思是: 沒有(有效的)算法可以做到這一點。

現在,我提到這些都是假設。 我們並不完全知道這些問題是困難的。 然而,我們傾向於認為,如果一些聰明的人已經注意到這個問題有一段時間了,但是沒有人在解決這個問題上取得任何進展,那就意味着這可能並不容易。 在某些情況下,問題甚至可能屬於一類有用的問題,例如,它可能是一個 NP-Hard 問題。

即使你不願盲目相信這些假設,安全性證據仍然是有用的。 分析一個新的密碼系統可以消耗大量的時間和精力。 如果我們至少可以將每個新方案“簡化”為少數幾個數學問題中的一個,我們就可以傾注我們的腦力來解決這些問題,因為我們知道我們的工作將適用於每個使用這些問題的方案。

 具體來說,這種證明的一般流程如下:

1. 假設問題 X 很難。

2. 證明如果存在一個(有效的)算法來“破壞”我們的加密方案,那么就存在一個(有效的)算法來解決問題X。

3. 含蓄地指出(2)意味着如果方案可以被打破,那么問題X就不會很難。

如果第(1)點為真,那么第(3)點顯然不可能為真。 根據這個邏輯,我們可以得出這樣的結論: 如果問題 X 很難,那么就不可能有算法破解我們的加密方案。

當然,還沒有解釋如何實際完成步驟(2) ,這是非常重要的。 這也是最美妙的部分。 在大多數簡化中,步驟(2)實際上包括編寫一個解決問題 X 的有效算法。

因此,這就是爭論的症結所在:假設有一種算法有效地“破壞”了我們的加密方案,那么我們可以把它塞進我們的“求解器”算法留下的洞(求解算法缺少的子程序)里。這將產生一個有效地解決 X 問題的算法,因此,它完全滿足我們在點(2)中所要求的。

黑匣子

有一個基本的簡化證明必須遵守的限制。 我們的“問題 X 解決程序”算法必須使用“加密方案破壞程序”的子程序作為一個黑盒。它無法對破壞程序算法的內部工作方式做出假設。例如,我們不能在“求解器”算法中對破壞程序算法進行反編譯,或者窺視它的內部內存寄存器,然后假定它們將包含我們需要的部分結果。

這是因為我們的簡化只有當它與打破方案的每一個可能的算法一起工作時才有效。 因為我們不能預先猜測這樣的算法在內部是如何工作的,我們不能依賴於它的內部工作。 破解加密程序的算法會被可怕地混淆,以至於我們無法理解它,即使我們把代碼握在手中。

因此,在傳統的黑盒簡化中,我們可以指望破壞程序算法有一個標准的“ API”(我們將在某個時候進行定義)。 它通常接受公鑰和密文(或簽名等) ,並輸出一些有用的信息,這些信息構成了我們對“破壞”的定義。 盡管它並不總是需要成功,但我們希望它能夠以合理的概率成功。 但是算法中發生的所有事情都必須對我們隱瞞。

回到隨機預言模型

隨機預言模型中沒有人能夠自己計算哈希。 每一方——包括敵方(“破解程序”算法的同義詞)——都必須通過向特定的外部方發送消息來進行哈希。 該方使用隨機函數計算哈希,並將其發送回調用方。

在隨機預言模型中,預言為包括敵方在內的所有各方計算哈希。

如果我們建立一個簡化,則意味着我們可以利用從這些調用中泄露的額外信息。 我們知道算法必須進行這些哈希調用,因此必須在 API 中存在一個“端口”來進行這些調用。 一旦我們制定了這個規定,我們的簡化就可以進入這個端口,攔截敵方的哈希調用,查看它要求的消息,甚至可能篡改它返回的結果。更正式地說,在隨機預言模型中,對手(也就是我們的“破解程序”算法)不再完全是一個黑盒子。 在一個非常重要的方面,我們可以看到它。 如果它想要進行哈希操作,它就必須在自身之外進行調用。

在一個極端的情況下,我們的簡化甚至可以運行自己的假“預言”,只要我們始終回復令人信服的答復。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM