我知道使用Math.random()進行加密的目的是不安全的。我需要重構JavaScript中用於生成隨機數的Math.random()函數的示例代碼。例如,如果我有一個由Math.random()生成的隨機數,我怎麼才能知道種子是什麼?如何重建Math.random()的種子?
0
A
回答
2
看看源代碼。在這種情況下,它在mozilla/js/src/jsmath.cpp:
static const uint64_t RNG_MULTIPLIER = 0x5DEECE66DLL;
static const uint64_t RNG_ADDEND = 0xBLL;
static const uint64_t RNG_MASK = (1LL << 48) - 1;
static const double RNG_DSCALE = double(1LL << 53);
/*
* Math.random() support, lifted from java.util.Random.java.
*/
...
extern uint64_t random_next(uint64_t *rngState, int bits)
{
uint64_t nextstate = *rngState * RNG_MULTIPLIER;
nextstate += RNG_ADDEND;
nextstate &= RNG_MASK;
*rngState = nextstate;
return nextstate >> (48 - bits);
}
static inline double random_nextDouble(JSContext *cx)
{
uint64_t *rng = &cx->compartment->rngState;
return double((random_next(rng, 26) << 27) + random_next(rng, 27))/RNG_DSCALE;
}
所以,
- 呼叫
Math.random()
- 乘以2 得到一個整數
n
(你要明確使用uint64_t中) - 將其分割成RNG輸出(的高位):頂部26位
n>>27
和底部27位n&((1<<27)-1)
。 - 27位可以從或者第一個或第二個RNG輸出(比如C,我不認爲C++在這裏對評估順序有任何保證)。所以...
- 對可能的較低位進行遍歷2 。
- 看看您是否可以通過向後運行RNG轉發或來實現此目的。
- 如果是,輸出該數字作爲候選人。
由於RNG的性質,具有多個候選可以是一種可能性。
向後運行RNG是一個練習給讀者(您只需計算0x5DEECE66D的模乘2 )的乘法逆。或者,您可以使用26位數字並猜測所有可能的輸入。
+0
謝謝,顯然,它與Java中的nextDouble()相同。 – Wise 2013-02-25 17:50:51
相關問題
- 1. 預測Javascript的Math.random種子
- 2. 在Math.random()上設置種子
- 3. 如何在Apex中設置Math.random()的種子
- 4. 在Java中隨機種子Math.random
- 5. 當Javascript math.random方法播種
- 6. 如何製作JavaScript Math.random重複?
- 7. Math.random重複自己
- 8. 種子 - 如何重新初始化我的種子 - 軌道
- 9. 如何使用Math.random()
- 10. 如何使用Math.random
- 11. 如何使用Math.random
- 12. Math.random()的隨機性如何?
- 13. 如何f的概率圖=的Math.random()*的Math.random()看起來像
- 14. Math.random()是什麼時候播種?
- 15. 如何創建隨機種子
- 16. (Corona SDK)如何取消math.random?
- 17. 的Math.random()不應重複相同數量
- 18. 不要重複math.random的組合()
- 19. 如何在JS /種子中的GObject子類中創建方法
- 20. 的Math.random()解釋
- 21. 的Math.random錯誤
- 22. Math.random()的精度
- 23. 不從的Math.random
- 24. 的Math.random功能
- 25. 麻煩的Math.random()
- 26. Java中的Math.random()
- 27. 的Math.random在Java
- 28. Javascript Math.random()
- 29. 從math.random
- 30. 如何刪除種子方法引入的種子數據?
猜測隨機種子,直到它工作 – 2013-02-22 22:47:34
單個數字並不意味着一個特定的種子值。 – 2013-02-22 22:48:15
你有什麼方法可以知道PRNG被調用了多少次? – TML 2013-02-22 22:48:27