最近正在研究基於屬性的非對稱加密,一開始看了b.waters等一些大牛的文章,裡面對演算法的安全性證明讓人很是頭疼。後來我也找了幾篇國內的博士**,還有其他學者的文章,看得多了好像找到了一些思路。今天就來總結一下關於可證明安全的思想。
首先,不管加密演算法有著什麼樣稀奇古怪的,或者標新立異的功能,最終都逃不開乙個關鍵問題——演算法是否安全呢?面對這個問題,光是說說演算法絕對安全之類的話那是肯定不行的,必須得有乙個嚴格的證明過程。那麼怎樣才能給出乙個可靠的證明呢?
我們知道,加密演算法的基礎就是數學,尤其是數論知識。因此對於攻擊者來說,加密演算法不可破解這個命題就必然對應於某個核心的數學問題對他來說不可解。幸運的是,在數現有的數論知識裡,前人已經為我們總結出了許多不可解的難題。比如computational diffie-hellman assumption等等。這些數學難題利用現有的知識是無法找到多項式時間的演算法的,你也可以理解為隨著難題裡某個引數的變化,解決這個難題的時間和計算量都是成指數級增長的。目前在安全領域,這些數學難題已經可以視為一種公理化的存在,所以在證明乙個加密演算法是否安全的時候,就可以將這個加密演算法規約到某個具體的數學難題上來。那麼該如何給出一種形式化的規約呢?請看下面。
如果你堅信你的演算法是安全的,那麼久大膽給出乙個你認為正確的定理,這個定理的形式是這樣的:如果解答某個數學難題是困難的,那麼破解這個演算法就是困難的。接下來你就要開始證明你的定理的了,證明思路是一種反證法思路:假設破解這個演算法不困難,如果推導出解答某個難題也不困難,這與這個數學難題的難解性相矛盾了,那麼就表示該假設不成立,則證明了這個演算法是安全的。
具體的證明方法如下:
設計4種角色:
1. 演算法敵手,目的是破解加密演算法;
2. 演算法挑戰者,代表加密演算法接受演算法敵手的挑戰;
3. 難題敵手,目的是破解數學難題,手段是假裝成演算法挑戰者,通過與演算法敵手的互動借助其實力破解數學難題;
4. 難題挑戰者,代表數學難題接收難題敵手的挑戰。
假定這個演算法敵手在多項式時間內能以不可忽略的優勢破解演算法,設破解所需的時間為t(k),優勢為ε(k)。現在將某種難題嵌入到設計的演算法當中(這是設計證明過程的關鍵,也是難點所在,如果有可能後面會單獨開一篇來講解),難題敵手充當演算法挑戰者欺騙演算法敵手,使演算法敵手認為在進行真實的攻擊,並利用演算法敵手的破解結果來解答難題。互動的流程如下:
1. 難題挑戰者首先生成難題的引數並傳送給難題敵手,難題敵手偽裝成演算法挑戰者,根據數學難題引數進一步構造演算法的公鑰引數並傳送給演算法敵手;
2. 演算法敵手發起詢問,這個詢問根據不同的安全級別(選擇明文攻擊/選擇密文攻擊)包括金鑰生成詢問、加密詢問或解密詢問,包括難題敵手採用某些設計好的詭計返回詢問結果,這些詢問結果可能是真實的,可能是隨機,但演算法敵手絕對分辨不出來;
3. 演算法敵手發起挑戰,傳送兩段等長的明文給難題敵手,難題敵手隨機選擇其中一段明文,進行加密並返回給演算法敵手;
4. (可選,如果是針對自適應的攻擊就加上這個過程)演算法敵手再次發起詢問,詢問內容和之前一樣;
5. 演算法敵手猜測密文加密的明文是哪乙個,或者直接計算出明文是什麼,隨後難題敵手利用演算法的結果做出難題的解答,並最終返回給難題挑戰者。
這一互動過程結束後,需要說明如果互動過程順利結束,那麼以上的模擬對於演算法敵手來說是完備的,即對演算法敵手來說無法區分該過程和真實的加密演算法的區別。
然後根據條件,給出解答難題的優勢ε'(k)與破解演算法的優勢ε(k)的關係,以及解答難題所需的時間t'(k)與破解演算法所需時間t(k)的關係。
如果給出了明確的數學關係,表示解答難題也不難,這與定理的條件相矛盾,也就表示證明之初的假設不成立,所以破解演算法是困難,即演算法是安全的。
最終給出定理:如果解答某個難題是困難的,那麼破解這個演算法就是困難的。
安全管理思想
1 專案開發制度流程 辦公環境開發 辦公環境測試 idc環境測試 idc正式環境 2 資料庫更新流程 開發人員提交需求 開發主管審核 部門領導審核 dba審核 dba執行 每步都需測試 3 專案週期制度指定 4 操作申請流程 1 開發人員許可權申請流程 2 資料庫更新執行流程 3 爛sql語句計入k...
Kruskal演算法的思想 證明及步驟
把n個頂點看成看成n棵分離的樹 每棵樹只有乙個頂點 每次選取可連線兩個分離樹中權值最小的邊把兩個分離的樹合成乙個新的樹取代原來的兩個分離樹,如果重複n 1步後便得到最小生成樹。t0存放生成樹的邊,初值為空 c t0 最小生成樹的權,初值為0 vs分離樹頂點的集合,初值為 a b w分別為邊的頂點和權...
Kruskal演算法的思想 證明及步驟
把n個頂點看成看成n棵分離的樹 每棵樹只有乙個頂點 每次選取可連線兩個分離樹中權值最小的邊把兩個分離的樹合成乙個新的樹取代原來的兩個分離樹,如果重複n 1步後便得到最小生成樹。t0存放生成樹的邊,初值為空 c t0 最小生成樹的權,初值為0 vs分離樹頂點的集合,初值為 a b w分別為邊的頂點和權...