2014-03-05 29 views
0

所以我知道以下面的方式生成密碼是一個壞主意。我會說它只有少數(可能是5個左右)熵,但我無法正確計算它。以這種方式生成的熵密碼只有多少(或少)

有人可以告訴我,如何計算使用Oracle的JDK 7以下列方式生成的長度爲n的密碼所需的平均嘗試次數?

我假定的相關因素是:

  • 字母表尺寸(62 - 5用於限制混亂的前瞻性字符),
  • 兩個步驟的過程來選擇的字符類,然後字符,
  • 四捨五入到整數,
  • 嘗試直到成功取樣字符的方式,
  • Math.random()的內在屬性。

但我無法得到確切的數字。

char[] generate(int n) { 
    char[] pw = new char[n]; 
    for (int i = 0; i < n; i++) { 
     int c; 
     while (true) { 
      c = randomCharacter(c); 
      if (c == '0' || c == 'O' || c == 'I' || c == '1' || c == 'l') 
       continue; 
      else 
       break; 
     } 
     pw[i] = (char) c; 
    } 
    return pw; 
} 

int randomCharacter(int c) { 
    switch ((int) (Math.random() * 3)) { 
    case 0: 
     c = '0' + (int) (Math.random() * 10); 
     break; 
    case 1: 
     c = 'a' + (int) (Math.random() * 26); 
     break; 
    case 2: 
     c = 'A' + (int) (Math.random() * 26); 
     break; 
    } 
    return c; 
} 
+1

'Math.random'的內在屬性取決於它的實現。你沒有指定一個。你甚至沒有指定這種語言(我猜可能是java)。 – CodesInChaos

+0

好點,我遇到了標籤限制,忘了在其他地方提到它。 –

回答

1

假設Math.random()是不可預測的,對於randomCharacter功能,要返回的一特定位的概率爲1/3 * 1/10,和一個字母,1/3 * 1/52的。

對於pw數組中的條目,某些字符無效,因此剩餘字符的概率會變高。 您需要重新調整概率,使得總和再次變爲1,即除以剩餘概率的總和。 結果是一個數字的概率爲1/3 * 1/10/(8 * 1/3 * 1/10 + 47 * 1/3 * 1/52),而一個字母1/3 * 1/52/(8 * 1/3 * 1/10 + 47 * 1/3 * 1/52)

堵塞香農熵公式中的所有這些值給出每個字符約5.7位熵的結果。

如果您要使用57個有效字符的單個數組,並使用單個隨機數對其進行索引,那麼您將得到每個字符約5.8位的熵。

+0

如果Math.random()只是一個PRNG,而不是理想不可預測的,它仍然保留嗎?我認爲一般PRNG多次調用它來獲取單個字符實際上會減少熵 –

+0

如果PRNG是可預測的,攻擊者將能夠預測您的密碼,所以在這種情況下,熵是零。 –

+0

我的意思是,PRNG輸出並不完全獨立於以前的值。實際上,例如第二個字母分佈依賴於第一個字母(這就是爲什麼你通常會想要使用加密PRNG)。這顯然減少了熵,但如何量化呢? –

相關問題