我應該如何計算密碼的熵?
如果密碼的一部分是一個完整的正常英文單詞,那部分的熵是否取決於存在的英文單詞的數量、選擇算法已知的英文單詞的數量、攻擊者假設的英文單詞的數量?
語言是否重要,德語、法語、意大利語或西班牙語的每個單詞的平均熵是否與英語的平均熵顯著不同?
一個數字是否總是有熵 $ \log_2(10) = 3.321928 $ ?
熵是對密碼可能是什麼的度量,因此它與密碼本身並不真正相關,而是與選擇過程相關。
我們將熵定義為值 $ S $ 這種最佳猜測攻擊平均需要 $ S/2 $ 猜測。“平均”在這裡是一個重要的詞。我們假設“最好的攻擊者”知道哪些密碼比其他人更有可能被選擇,並且會從最可能的密碼開始進行猜測攻擊。模型如下:我們假設密碼是用電腦上的程序生成的;該程序純粹是確定性的,並使用加密的強 PRNG 作為 alea 的來源(例如
/dev/urandom
在 Linux 系統或CryptGenRandom()
Windows 上)。攻擊者擁有程序原始碼的副本;攻擊者沒有的是 PRNG 實際產生的隨機位的副本。如果選擇過程的隨機部分是一致的(例如使用骰子或具有良好 PRNG 的電腦,而不是人類在他的腦海中製造“隨機”機會),則熵很容易計算。例如,如果你有一個 2000 個單詞的列表,並在其中選擇一個(均勻地),那麼熵是 $ S = 2000 $ . 熵通常用比特表示:熵 $ n $ bits 是您從一系列 $ n $ 已被統一且彼此獨立地選擇的位(例如,通過為每個位翻轉硬幣);它是一個簡單的對數刻度:" $ n $ bits of entropy”的意思是“熵是 $ S = 2^n $ “(然後攻擊成本為 $ 2^{n-1} $ 一般)。
如果您將密碼視為彼此獨立選擇的兩半,那麼總熵是每一半熵的乘積;當用位表示時,這變成了一個和,因為這就是對數的作用:它們將乘法轉換為和。因此,如果您從 2000 個列表中隨機且獨立地取出兩個詞(即從不排除任何組合,即使這兩個詞結果相同),那麼總熵為 $ 2000\cdot2000 = 4000000 $ . 以位表示,每個字都意味著大約 11 位的熵(因為 $ 2^{11} $ 接近 $ 2000 $ ),總熵接近 22 位(而且,事實上, $ 2^{22} $ 接近 $ 4000000 $ ).
這回答了您關於數字的問題:十進制數字的熵為 10,只要它是隨機、均勻地選擇且獨立於密碼的所有其他隨機部分。自從 $ 10 = 2^{3.321928…} $ 然後每個數字為熵增加大約 3.32 個額外的位。
如果一個人參與了選擇過程,那麼計算熵就會變得更加困難。例如,如果一個人選擇了兩個數字,並且第一個數字是“4”,那麼第二個數字是“2”的機率要高得多 $ \frac1{10} $ . 可以說,攻擊者也很難:他還需要做更多的工作來對潛在密碼進行排序,以便從最可能的密碼開始。但這變成了一個心理問題,攻擊者試圖模擬使用者的思維過程,而我們試圖模擬攻擊者的思維過程:很難以任何合適的精度量化事物。