密碼學之前後向安全性

Max1z發表於2021-11-29

本文將討論密碼學中的 前向安全性(Forward Security) 與 後向安全性(Backward Security) ,希望讀完本文後,你再也不會混淆這兩個概念。

在開始本文之前,希望你有如下預備知識:

  • 密碼學(Cryptography)是一門什麼樣的學科?
  • 單向函式(One Way Function)是什麼?有哪些例子?
  • 密碼演算法與金鑰是什麼?敵手(Adversary)在密碼學中是一個怎樣的概念?

單向函式與密碼演算法

現代密碼學的基石:偽隨機性

Pseudorandomness,即偽隨機性,是一個現代密碼演算法必須要具備的性質,因為從反面考慮,如果你設計的密碼演算法都做不到「看起來」是隨機的,那豈不是很容易就被攻破了?當然,偽隨機性在數學上有著更嚴格的定義與論證,在密碼學中也有更深厚的歷史背景(比如其實是姚期智院士率先給出的偽隨機性正式定義[1])。偽隨機作為現代密碼學的核心要素,如何更好地實現它一直是許多科學家追逐的目標,比如採用物理的隨機熵源(真隨機數發生器),或者使用一個祕密的隨機種子(金鑰)等等。沒有偽隨機性作為演算法的根基,Rivest也不能打包票對你說“哦我的老夥計,試試這個RSA吧,它真的很棒”。

在現代密碼演算法中,偽隨機性可以由偽隨機數發生器(PseudoRandom Number Generator,PRNG)來提供。這就是說,要設計一個具備偽隨機性的密碼演算法,你可以先明確怎麼得到一個PRNG。因此,PRNG這個部件的好壞,將直接決定了演算法是否足夠安全。PRNG在現代密碼學語義中的定義如下:

令$G$為一多項式時間演算法,其輸入為$s\in \{0, 1\}^{n}$,即為一長度為$n$的01位元串,輸出的長度記作$l(n)$;其中,$l(\cdot )$也為一多項式時間演算法,但與$G$不同的是,$l(n)$只是表示是$n$的多項式界下的一個值,$l(\cdot )$可以等於$n^{2}$,也可以等於$n$,只要是多項式界內的即可。若G為一PRNG,則應同時滿足如下兩個條件:

  1. 對於任意的$n$,都有$l(n) > n$;
  2. 若此時對於任意一具有多項式資源的敵手$\mathcal{A}$,都存在一個可忽略(negligible)的概率$\epsilon $,使得下式成立:

$$ |\mathrm{Pr}[\mathcal{A}(r)=1] - \mathrm{Pr}[\mathcal{A}(G(s))=1]| \le \epsilon $$

其中,$r$為一隨機位元串(不用管它從哪來的),而$G(s)$即為$G$的輸出,為一偽隨機位元串. 而$\mathcal{A}(r)=1$與$\mathcal{A}(G(s))=1$分別表示敵手$\mathcal{A}$能正確判斷出所給位元串是真隨機串還是偽隨機串。因此,條件2表明敵手$\mathcal{A}$面對$G$的輸出時,只能以一個可忽略的、極小的概率將其與真隨機串區分開來,這保證了每個PRNG的輸出都會足夠貼近真實的隨機輸出。而對於條件1,如果我們先假設$l(n) \le n$,那這意味著輸入與輸出都不一定能滿足雙射的條件,即PRNG的一個輸出甚至可能對應著多個輸入。由此,這樣的PRNG很容易就被攻擊者猜解碰撞出來了;因此如果令$l(n) > n$,如$l(n)=2n$,那麼一個輸入$s$則平均對應著$2^{n}=2^{2n}/2^{n}$個PRNG輸出,也就是這是一種非常稀疏的對映關係,這種「擴充套件性」保證了採取窮舉手段從PRNG的輸出空間來進行碰撞是困難的。

現在我們有了偽隨機性這把(簡陋)的螺絲刀,還能造出更好的工具嗎?

單向函式

首先便是直接由偽隨機性抽象而來的、更加直觀的,但也非常重要的性質:One-Wayness,即單向性。顧名思義,再結合PRNG的定義,相信大家此時對單向性及單向函式(One-Wayness Function, OWF)也會有這樣一個模糊理解:

給函式一個$x$,可以跟容易算出對應的函式值$y$,但是對於函式值$y$,很難逆推得到原來的$x$

這種理解其實已經非常接近單向函式的正式定義了,如下所示:

一個函式f若稱為單向函式,則應滿足如下兩個條件:

  1. (容易計算)存在一多項式時間演算法$A_{f}(\cdot )$,對於任意輸入$x \in \{0, 1\}^{*}$,都能在多項式時間內輸出$A_{f}(x)=f(x)$;
  2. (難以求逆)對於所有的多項式時間演算法$D(\cdot )$,都存在一個極小的可忽略概率$\epsilon$,使得下式成立:

$$ Pr[D(f(x)) \in f^{-1}(f(x))] \le \epsilon $$

其中,$x$的選取是從$\{0,1\}^{n}$中隨機均勻取樣。在上述定義中,難以求逆這一性質只需要在輸入是均勻選取的這一條件下成立即可,即對於極個別的輸出點,攻擊者還是有可能還原其對應的輸入的。在某些比較極端的定義裡,難以求逆這一性質甚至只要求在輸入$x$足夠長時才滿足。

此時你可能會說,既然一個單向函式是容易計算的,那對於一個特定的輸出$y$,那我為什麼不能試著遍歷所有$x_{i}$,從而找到$f(x^{*})=y$?沒錯,任何單向函式在給出足夠時間和計算資源的條件下,都是可求逆的;但不要忘記條件2中面向的是多項式時間演算法,對於那些指更高階的攻擊演算法,單向函式可能真的一下就被攻破了。因此,條件2所謂的難以求逆,實際上是難以「高效」求逆。

實際上,任意一個PRNG都可看作是一個單向函式 [2],而要證明這一點,即證「對於一個PRNG演算法 $\mathcal{G}$,如果存在敵手$\mathcal{D}$能以不可忽略的概率對 $\mathcal{G}$的輸出結果求逆,那麼存在一敵手$\mathcal{D}^{'}$也能以不可忽略的概率分辨$\mathcal{G}$的輸出與真隨機串。一般而言這種證明採取“安全性歸約”的方法即可,不過這和本文內容無關。總之,基於PRNG可以構造出單向函式,而有了單向函式這個「高階扳手」,我們就可以造出更方便的工具了,比如大名鼎鼎的(密碼學安全的)雜湊函式。

阿克琉斯之踵:金鑰的管理

PRNG與OWF由於其簡潔但重要的計算性質,常被用於生成密碼演算法的金鑰,而PRNG這種「看起來」隨機的特點,正是方便我們生成一些別人不想預測出的敏感資訊。另外,OWF則能幫助我們為已有金鑰提供一個「陷門」(Trapdoor),陷門的輸出(通常為OWF的輸出)可以作為新金鑰、或者某個公開值,或者某個校驗值等等。

二者的配合讓一個系統中,金鑰的線上更新成為了可能。如果一個OWF提供的偽隨機性足夠好,那我們是不是可以用它源源不斷地生成新金鑰呢?當然可以!

 

 

如上圖所示,系統管理員可以使用當前金鑰$K_{i}$、當前時間戳$t_{i}$以及一個鹽值Salt(如0x12345),在MD5這一雜湊函式的幫助下源源不斷的迭代出新金鑰$k_{i + 1} = \mathrm{MD5}( K_{i} || t_{I} || Salt) $。當然,MD5可以替換為其他常見的,更安全的雜湊函式。

可是,隨著密碼分析技術的不斷增強,原來認為安全的MD5目前來看也不那麼安全了,原本的單向函式也不再那麼單向了。而管理員此時還覺得: 

反正我金鑰一直都在給你們更新,況且MD5也沒那麼容易被攻擊,這個方案又不是不能用?

管理員笑了,黑客也笑了。

 

 

 

這種做法有一個無法忽視的風險在於,如果系統中某些使用者喜新厭舊,他只會好好保管手頭上的新金鑰,那麼若攻擊者獲取了他曾經的金鑰,目前的系統還是安全的嗎?另外,如果攻擊者獲取了他目前的金鑰,系統中的歷史狀態還會是安全的嗎?

這樣的金鑰管理問題一直是許多密碼學專家的心頭之恨:“明明這演算法本身已經天衣無縫了,攻擊者還是能從一些奇怪的地方拿到金鑰”,而根據Kerkoff準則,一旦金鑰不安全了,那整個密碼系統也就不安全了。因此,金鑰管理就像是一個資訊系統的阿克琉斯之踵一樣,只要攻擊者擁有足夠精妙的攻擊方法,他便能一擊致命。

前向安全性 與 後向安全性

鋪墊了那麼多,終於要介紹正題了。

直覺上的判斷

如果你直接Google "Forward/Backward Security",你很可能會看到兩種截然相反的定義:

版本一[3]:

  • 前 向安全性是指,當前金鑰被攻擊者獲取後,歷史 的金鑰仍然是安全的
  • 後 向安全性是指,當前金鑰被攻擊者獲取後,未來 的金鑰仍然是安全的

版本二[4]:

  • 前 向安全性是指,當前金鑰被攻擊者獲取後,未來 的金鑰仍然是安全的
  • 後 向安全性是指,當前金鑰被攻擊者獲取後,歷史 的金鑰仍然是安全的

直覺上理解,可能有的讀者在看到「前向」一詞時,腦海裡自然而然會浮現出一根時間軸,前向安全性似乎在告訴你,如果當前時間點的金鑰洩露了,之“前”走過的所有金鑰節點都還是安全的。這樣一來,前向安全性就是說歷史金鑰是安全的,而後向安全性自然就是未來金鑰是安全的嘛(版本一)

誠然,有的讀者可能是這麼理解的:前向安全性的英文是Forward Security,而後向是Backward;而直覺上當你看到「Backward」一詞時,腦海裡同樣會浮現出一根時間軸,這個詞似乎在告訴你,如果當前時間點的金鑰洩露了,那麼往“回”(Backward)走的所有金鑰節點都還是安全的。這樣一來,後向安全性就是說歷史金鑰仍是安全的,而前向安全性自然就是未來金鑰仍是安全的嘛(即版本二)

說實話,我自己的直覺理解是版本二,但實際上,目前學術界公認的正確定義其實是版本一。

如何理解

可能和我一樣認為版本二是正確的讀者不是很能理解版本一中的 前(Forward)與後(Backward) 究竟指的是何處的 前與後,明明讓Backward對應“曾經”,Forward對應“未來”就很通順嘛。其實這種對應關係本身在語義邏輯上並沒有問題,只是在密碼學家看來,二者並非這麼去理解。

在版本二的錯誤定義中,Forward 與 Backward 被理解為在當前金鑰洩露之後,哪個時刻是否還是安全的?即 前與後 修飾的其實是 結果時刻 相對於 密鑰洩露的發生時刻,如下圖所示。

 

而在版本一的正確的定義中,Forward 與 Backward 被理解為哪個時刻的金鑰被洩露了,目前是否還是安全的?即 前與後 修飾的其實是 金鑰洩露的發生時刻 相對於 結果時刻 ,如下圖所示。

因此,在兩種版本的理解中,Forward與Backward的方向是相反的(如圖中的虛線箭頭),而至於為什麼版本一是正確的,而版本二並不太被接受呢?因為正確定義刻畫的是當系統從正常狀態,逐漸轉移到不正常狀態(金鑰被洩露了)的過程中,安全性的變化;即錯誤定義雖然看起來更符合人們的思考邏輯,即面對著當前不正常的系統狀態,那些正常的系統狀態中安全性如何。然而正確定義更能描述清楚系統安全性的演化過程,這比單純符合人們思考第一印象來的要更為「學術化」一些。

總結一下吧

前後向安全性是很多密碼方案都會考慮的一個安全目標,例如金鑰協商、可搜尋加密等等。本文對這一概念重新進行了梳理,也討論了兩種版本定義該如何去理解。最後,如果大家懶得看這麼多,可以按照“前”是以“前”還安全,“後”是以“後”還安全,這樣去記就好。

囉嗦了這些,其實本質上只是文字遊戲罷了,而且兩個版本的定義並不存在絕對的正確與錯誤,有些專業論文也都在混用。讀者還是要把握前後向安全性的精髓,以及這兩個定義究竟有什麼意義,這才是最為重要的。

感謝你的閱讀,最後同樣以一句歌詞作為結束。 

“十年之前你不認識我,我不屬於你,我們還是一樣” —— 林夕《十年》

參考 

[1] https://www.di.ens.fr/users/phan/secuproofs/yao82.pdf

[2] https://crypto.stackexchange.com/questions/41140/is-every-pseudorandom-generator-a-one-way-function

[3] https://en.wikipedia.org/wiki/Forward_secrecy

[4] https://users.ece.cmu.edu/~adrian/projects/sec/node6.html

其他參考閱讀

https://crypto.stackexchange.com/questions/39761/definitions-of-secrecy

https://www.zhihu.com/question/45203206

https://www.quora.com/What-is-exactly-backward-secrecy-property-in-cryptography-attribute-based-encryption

https://en.wikipedia.org/wiki/Forward_secrecy

https://sunhuachuang.gitbooks.io/sun-note/content/cryptography/forward_backward_secrecy.html

https://users.ece.cmu.edu/~adrian/projects/sec/node6.html

相關文章