Random-Number-Generator

算法:如何使用 x 和 y 滑鼠移動座標生成隨機數據?

  • March 10, 2015

背景:

我正在製作一個有趣的程序作為學習練習。我想從 JavaScript 程序生成一些實際的隨機密鑰材料(不是偽隨機)。因為我的程序只是用於逐個字母地加密/解密純文字,所以我選擇使用ASCII 可列印字元集(您可以在標準美式鍵盤上鍵入的字元),它提供了 95 個可能的字元。

我想捕捉使用者在螢幕上的隨機滑鼠移動以捕捉一長串隨機數。我想在 1920x1080 像素的可能螢幕解析度中使用每個滑鼠位置的 x 和 y 座標,然後將它們映射回可能的 ASCII 字元列表中的一個字元。然後我可以在我的密鑰材料中使用該字元。假設程序擷取以下一系列 x 和 y 座標,如下所示:

[478,702]    
[503,701]    
[581,687]    
[633,670]    
[691,646]    
[757,620]    
[814,599] 

問題一:

此時我是否應該將 x 和 y 座標相乘以獲得更好的隨機數,即478 x 702 = 335556並使用這個數字?因為如果我只是單獨取 x 數字,那麼您最終可能會得到連續的數字,例如121, 122, 123, 127,當它們向一個看起來並不特別隨機的方向移動滑鼠時。或者我應該把這些數字加在一起478 + 702 = 1180嗎?或者也許在我得到的每組座標的加法和乘法之間交替來生成隨機數?

問題2:

現在將隨機數映射到我的可能字元列表(數組)中的字元的最佳方法是什麼?如果我有一個[0 - 94]基於零的數組的所有 95 個字元的數組,假設我的隨機數是 1180,我如何將它映射回我的數組中的一個字元?我是否多次循環數組,直到我在第 1180 個字元處,現在使用該字元作為我的鍵?本質上,這就像將 95 個可能的字元連續重複到 1180 個字元,然後取最後一個。或者也許你可以用數學方法解決這個問題?

或者我創建一個大的 2D 數組,其中所有字元水平和垂直重複(就像一個大網格以匹配螢幕大小),然後當 x 和 y 滑鼠座標進入時,我將它映射到大的 x 和 y 索引二維數組並使用該字元?

問題 3:

滑鼠移動產生的隨機數的熵質量是多少?將其映射回減少的字元集會減少熵嗎?如何更好地從滑鼠移動中擷取隨機數據?

問題4:

如果我的螢幕尺寸是 1920x1080 像素,我從中拉出一個 x 和 y 座標。什麼是搜尋空間,即 $ 2^x $ ? 你是怎麼解決的?

非常感謝

開源的PuTTYgen程序在WINPGEN.C中包含以下註釋,它收集滑鼠移動以生成密鑰:

/*
* My brief statistical tests on mouse movements
* suggest that there are about 2.5 bits of
* randomness in the x position, 2.5 in the y
* position, and 1.7 in the message time, making
* 5.7 bits of unpredictability per mouse movement.
* However, other people have told me it's far less
* than that, so I'm going to be stupidly cautious
* and knock that down to a nice round 2. With this
* method, we require two words per mouse movement,
* so with 2 bits per mouse movement we expect 2
* bits every 2 words.
*/

我不知道這個資訊有多準確。我只記得看過它,儘管它值得分享。

如果您可以使用麥克風,這些論文描述了一種生成真正隨機數的方法。

Nur Azman Abu 和 Zulkiflee Muslim,加密密鑰的隨機數生成,工程和 ICT 國際會議論文集,ICEI 2007,2007 年 11 月 27-28 日,馬來西亞馬六甲,第 1 卷,第 255-260 頁。

Nur Azman Abu 和 Zulkiflee Muslim,加密密鑰的隨機房間雜訊,IEEE 數字生態系統和技術國際會議 DEST2008 論文集,2008 年 2 月 27-29 日,泰國彭世洛,pp381-387。

論文提出了一種從計算設備中的麥克風輸入中生成偽隨機數的方法。

引用自:https://crypto.stackexchange.com/questions/8695