算法:如何使用 x 和 y 滑鼠移動座標生成隨機數據?
背景:
我正在製作一個有趣的程序作為學習練習。我想從 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。
本論文提出了一種從計算設備中的麥克風輸入中生成偽隨機數的方法。