Javascript 如何重建Math.random()的种子?

Javascript 如何重建Math.random()的种子?,javascript,random,cryptography,Javascript,Random,Cryptography,我知道使用Math.random()进行加密是不安全的。我需要一个重建javascript中用于生成随机数的Math.random()函数的示例代码。例如,如果我有一个由Math.random()生成的随机数,我如何才能知道种子是什么?查看源代码。在本例中,它位于: static const uint64\u t RNG\u乘数=0x5deec66dll; 静态常数64加数=0xBLL; 静态常数64\u t RNG\u掩码=(1LL(48位); } 静态内联双随机_nextDouble(JSC

我知道使用Math.random()进行加密是不安全的。我需要一个重建javascript中用于生成随机数的Math.random()函数的示例代码。例如,如果我有一个由Math.random()生成的随机数,我如何才能知道种子是什么?

查看源代码。在本例中,它位于:

static const uint64\u t RNG\u乘数=0x5deec66dll;
静态常数64加数=0xBLL;
静态常数64\u t RNG\u掩码=(1LL(48位);
}
静态内联双随机_nextDouble(JSContext*cx)
{
uint64\u t*rng=&cx->隔间->rng状态;

return double((random_next(rng,26))单个数字并不意味着特定的种子值。您有办法知道PRNG被调用了多少次吗?“使用依赖于实现的算法或策略,返回一个带正号、大于或等于0但小于1、随机或伪随机选择、在该范围内近似均匀分布的数值。“意思是,你想模拟哪个JavaScript引擎?
Math.random
不能保证安全,但它可以是安全的。至少在Opera中是安全的。因此,当你使用Opera时,你没有机会恢复种子。显然,它与Java中的nextDouble()工作原理相同。
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;
}