任何密碼都可以用窮舉推算出來,只是時間問題。如果是這樣的話,那不是很不安全?汪陽2017-07-25 15:58:31

題主一句“只是時間問題”就打算把我們打發了。

說實話,難道你這個問題裡面還有比時間更大的問題?

任何密碼都可以用窮舉推算出來,只是時間問題。如果是這樣的話,那不是很不安全?知乎使用者2017-08-31 20:57:29

一個月以前被邀請回答這個問題,覺得太簡單就沒答,評論了一句“這可能是知乎密碼學話題下最萌的問題吧”。

然而今天我再次刷到了這個問題,下邊的答案卻沒有一個讓我滿意的,大多數答案的概念都是混淆的。所以還是決定簡單說說。

首先要搞清楚概念:什麼是密碼方案?什麼是密碼標準?

一個完整的密碼方案由三個演算法組成:金鑰生成演算法、加密演算法和解密演算法。其中金鑰生成演算法是一個隨機演算法,輸入一個安全引數,它會給出合法的加密金鑰和對應的解密金鑰;加密演算法的輸入是待加密的明文和加密金鑰,輸出是加密後的密文;解密演算法的輸入是密文和解密金鑰,輸出是明文。

一個成熟的密碼方案,以上所說的所有演算法都是公開的,其安全性全部來自於金鑰。那麼這個安全性如何體現呢?這裡要簡單地提兩個概念:圖靈機及其時間複雜度。

圖靈機是一種計算機器:給定輸入,它會按照內建的規則進行計算,最後停機並給出一個輸出(這裡不糾結紙帶等概念)。比如說我可以設計一個圖靈機,它可以計算輸入的二倍。那麼我就列印輸入,並在最後加一個 0 (二進位制數乘 2 就在末位添一個 0)。

而時間複雜度是說,對於一個特定的圖靈機,輸入長度為 n 時,停機所需的基本運算的次數

f(n)

。這裡的基本運算涉及對紙帶的操作,大家理解為對二進位制的一位進行一次操作即可。

說清楚了這兩個概念,我們現在就可以談安全性的定義了。在定義中我們引入了“敵手”這個概念。一個敵手可以理解為一個圖靈機,它擁有我們的密文,可能還擁有一些其他的資訊或能力。不過一般情況下,我們只允許它擁有多項式時間的能力,也就是說這臺“圖靈機”的時間複雜度

f(n)

必須總小於某一個多項式。我們把這種敵手稱為 P。P。T。 (機率多項式時間)的敵手。

此外,我們還需要定義“可忽略函式”。一個可忽略函式是一個正值函式,它下降的速度比任何多項式的倒數都快。也就是說,一個函式

\text{negl}(n)

是一個可忽略函式,當且僅當對任意的多項式

p(n)

\lim_{n\rightarrow \infty}\text{negl}(n)p(n)=0

這樣,我們就可以定義一個密碼方案的安全性了:

一個密碼方案是安全的,當且僅當對任意的 P。P。T 敵手,攻破方案的機率是一個可忽略函式。

當然,這個定義是很不嚴謹的,因為“攻破”這個詞沒有被很好地定義。在實際的研究中,我們會考慮不同的敵手能力和不同的“攻破程度”。但最基本的考慮仍是:P。P。T。 的敵手能不能以大於可忽略函式的機率搞定。

比如說最著名的公鑰加密方案 RSA ,如果只能窮舉

N

較小的素因子

p

,那麼平均需要列舉的數量級是

\sqrt{N}

。而輸入

N

的話,長度是

\log N

級別的。也就是說,敵手列舉的次數至多是

\log N

的多項式級別的。而對於任何一個

\log N

的多項式,它在

N\rightarrow \infty

時與

N

的比值的極限都是

0

,因此破解的機率就是一個可忽略的函式,這樣 RSA 加密方案就是安全的。

如果以後有一天,我們可以確定私鑰的每一個位元,那麼破解 RSA 的時間就是輸入長度的線性函式,那麼執行線性時間就可以確定私鑰,自然破解的機率就不是可忽略的。如果那樣,RSA 就不再安全了。

而密碼標準則是根據最新的計算機計算能力和密碼方案的研究制定的實際應用密碼學方案的實現準則。比如說三四十年前,512 位元的 RSA 方案就能抵抗當時世界上最快的計算機(我沒有查,只是舉個例子),那麼密碼標準可能就是金鑰長度為 512 位元。再過 20 年,計算機的計算能力提高了,那就變成 1024 位元。

當然了,密碼標準可不僅僅是金鑰長度,它包括了實現密碼方案每一個細節的要求,每一個要求都是密碼學專家總結出的可能的漏洞。而且密碼標準也會隨著最新的研究成果不斷更新,以保證按照標準進行實現時方案的安全性。

回到題主的問題:我們現實生活中所用到、接觸到的各種密碼系統,都是對安全的密碼方案,按照密碼標準實現出來的(當然也有大意的程式設計師不按照標準做,它們通常得到了系統被攻破的後果23333),這兩者就是密碼安全性的保障。如果沒有意外情況(比如說你自己在家琢磨出了確定 RSA 每一位私鑰的演算法並且沒有公開),那麼按照標準設計的系統,即使使用最先進的計算機,其破解時間往往都是不可承受的。當計算機的計算能力發展時,密碼標準會相應地進行修正,以保證這個不可承受性成立。

正是在這種情況下,我們才能放心地享受資訊科技帶給我們的種種便利。

9。1 補充:評論區注意到了兩個值得一提的問題。

@以琛 提到,密碼的安全性是相對的,只要破解代價遠遠超過密文價值即可。

事實上不是這樣的。我舉個例子:山東三男子投18萬造假幣 僅造出16萬枚1元假硬幣

大家顯然認為,這樣的行為是很蠢的。但是注意到新聞中有這麼一句話:

中央財經大學

中國銀行

業研究中心主任郭田勇教授分析認為,山東制販假幣的犯罪團伙投入18萬元只造出16萬元假硬幣的主要原因,在於

購買模具裝置和材料

的成本較高。

購買模具和材料的成本高,因此只造出 16 萬。但是模具已經買了,所以再繼續造的話,每造一枚硬幣的成本肯定低於一元了。如果他們持續製造,最後同樣會獲取暴利。

密碼安全和這個問題有類似之處:破解一臺價值一元的計算機的漏洞可能需要花費一千元,但破解之後編寫程式,放那跑一天,說不定就攻破了三千臺有這個漏洞的計算機。可能你的資訊不值錢,不會有人專門盯著你去破解,但是有可能有人隨手寫的爬蟲包含了你的網頁,你又恰好有這個漏洞,你的資訊一樣是被非法獲取了的。

@池塘裡的魚 提到,我們可以在輸入密碼的時候採取輸錯三次就凍結這樣的手段,防止暴力破解。

事實上,這種情形已經不是所謂的“密碼學”所研究的了。這不是一種加密機制,而是一種線上驗證機制。我們所說的密碼學,說的是我將一個資訊用一個金鑰進行處理,得到的密文可以被擁有解密金鑰的人輕易地解密,得到訊息;而對沒有這個金鑰的敵手,則很難解密。也就是說,敵手能夠獲取到密文並對其進行離線處理,比如暴力破解等等。而我答案裡所說的一切,都是在這個模型下討論的。

任何密碼都可以用窮舉推算出來,只是時間問題。如果是這樣的話,那不是很不安全?倪偉2017-09-01 16:53:26

人的平均壽命不到3×10^9秒。

人類有記載的歷史,只有1。5×10^11秒。

地球到現在也只有1。4×10^17秒。

宇宙的年齡大約是4。2×10^17秒。

很多密碼的窮舉時間遠大於這些數。

是的,時間可以算是這個宇宙最稀缺的資源。

任何密碼都可以用窮舉推算出來,只是時間問題。如果是這樣的話,那不是很不安全?玄星2017-09-06 04:26:31

這個答案是對 @王希 答案的一點補充,也是對 @王希 答案下 @錢宇 的問題的回答。閱讀這個答案需要一些CS本科程度的知識背景。

問題 1

是因為二進位制輸入,長度是log2 N嗎

是。同樣也是因為使用了圖靈機(Turing machine)或者random access machine 做為計算模型,而且假設 1)資料都是用二進位制表示,2)圖靈機紙帶(tape)上,每個格子(cell)裡只寫一位0或者一位1。那麼輸入資料十進位制N的總長度所需要的格子數也就是

\mathcal{O}(\log N)

個了

下面用小寫字母n來表示

\log N

,即

n=\log N

問題 2

敵手列舉的次數至多是 的多項式級別的,為什麼不能列舉更多次呢?

這是對安全模型中攻擊者能力的一個限制,我換個角度來回答。

直觀上來說,沒有金鑰的話,必須要求敵手解密的速度比持有金鑰的使用者“

慢足夠多

”,否則不安全。更確切地說,敵手即使使用的是最好的破解演算法,在

沒有金鑰

的情況下,也

必須嘗試比有金鑰使用者多得多的次數

才能攻破加密演算法。

不過,嘗試次數多出多少才算足夠多呢?

得超過使用者演算法所在的複雜度等級(complexity class) 吧

考慮一些常見演算法的複雜度和它們所處的複雜度等級,後者定義參考

http://

cs。brown。edu/~jes/book/

pdfs/ModelsOfComputation_Chapter8。pdf

二進位制數奇偶性判斷 這個屬於

\mathbf{L}

,也就是在以

\log \ n

為多項式的時間內、確定性圖靈機上可解的。(其實只需要常數時間)

二叉樹查詢

O(n)

這個屬於

\mathbf{P}

,也就是在n的多項式時間內、確定性圖靈機上可解的。

pollard‘s rho, 用來解決一般域上的離散對數問題

\mathcal{O}(2^{n/2})

屬於

\mathbf{NP}

不同複雜度等級對應的時間(即操作步數)的差距是巨大的

\begin{align} & n = 128 \\ & \log n = 7 \\ & n^2 = 16384\\ & 2^n = 3.4028237e+38 \end{align}

所以如果正常解密需要n^2步,而攻擊者沒金鑰得需要2^n步的話,就正好說明加密比較安全。

很有意思的一個觀察是,如果同一個複雜度等級內的函式彼此相乘c次,比如

(log \ n)^c

,其中c是和n無關的常數,且n足夠大,那麼

(\log \ n)^c

仍舊是小於n的,因此仍舊屬於

\mathbf{L}

。類似的有

n^c < 2^{d\cdot n}

,d是另一個與n無關的常數,且n足夠大。

形式上來說,假設

p(n)

q(n)

都屬於一個複雜度等級

\mathcal{C}

, 那麼

p(n)+q(n)

p(n)\cdot q(n)

以及

(p(n))^c

都屬於

\mathcal{C}

。(

注1

再回到上面對攻擊者嘗試次數的討論。

假設正常使用者的計算時間是

p(n)

成功的

攻擊者的最大嘗試次數是

A(n)

,那麼任意攻擊者總的時間複雜度是

\mathcal{O}(A(n)\cdot p(n))

。這裡考慮

p(n) \in \mathbf{P}

的情況,即使用者計算的複雜度還是一個多項式。那麼,

一個安全的演算法必須使得 #FormatImgID_41# 能到達比 #FormatImgID_42# 更上層的複雜度等級

,比如到

\mathbf{NP}{\text{ \ }}\mathbf{P}

甚至

\mathbf{PSPACE}{\text{ \ }} \mathbf{NP}

反過來,為了論證這一點,

只需要論證對於所有的攻擊者,只要嘗試次數次數#FormatImgID_45# (即

A(n)

還是個多項式),都攻不破加密就可以了

。套用三體的設定,但凡攻擊者木有做降維打擊(自己擁有有效解決PSPACE-hard問題計算能力,反過來算NP-complete問題),嗯,演算法還是很安全的。

嘗試次數比具體的解密操作多出些無所謂,無論

A(n)=2p(n)

還是

(p(n))^c

這種形式,但是不能多出一個數量級。至於

A(n)

本身就屬於

O(2^n)

,而且我們在討論計算性安全(computational security) 的話,呃,肯定暴力破解了啊,因為可能的金鑰個數也就是這麼多……

注1, 為了可讀性,我在這裡混用了“問題的複雜性”和“演算法的時間複雜度”這兩個概念,都用了描述前者的complexity class

任何密碼都可以用窮舉推算出來,只是時間問題。如果是這樣的話,那不是很不安全?Belleve2018-01-01 20:39:10

反對 @baskice ,不好好搞萌百炒什麼幣(

2015 年全球初級能源產出是 168,519 TWh[1],假設這些能源全部拿去喂 Antminer R4 礦機 [2] 的話,可以帶動

2.27509729\times 10^{10}

臺,換算成算力就是

1.8200778\times 10^{23} \mathrm{H\cdot s^{-1}}

假設用窮舉所有 256 位串的方法去破解某個 hash 的話,所需的時間是多少呢?

\frac{2^{256} \mathrm{H} }{ \frac{168519 \mathrm{TW\cdot h}}{1\mathrm{a} \cdot 845\mathrm{W}} \cdot 8\mathrm{TH\cdot s^{-1}} }=6.3619306 \times 10^{53}\mathrm{s}

對不起,時間真的是宇宙中最稀少的資源。

我們再來反向算一下。

你有

2^{256}\mathrm{H}

的任務,用同款礦機換算成能量就是

1.22305394 × 10^{67}\mathrm{J}

,差不多是整個可觀測宇宙等效能量的 1% 。

也就是說,整個宇宙,也就夠你破解 100 次密碼……

[1]:

https://www。

eia。gov/outlooks/ieo/pd

f/0484(2017)。pdf

[2]:Antminer R4, the most silent yet powerful bitcoin miner