Javascript CS-PRNG-64位随机

Javascript CS-PRNG-64位随机,javascript,security,cryptography,Javascript,Security,Cryptography,我需要在Javascript中生成一个加密安全的64位无符号随机整数。第一个问题是Javascript只允许64位有符号整数,所以我认为9223372036854775808是支持的最大整数,而不使用浮点?为了解决这个问题,我可以使用一个大数字库,没问题 我的方法: var randNum = SHA256( randBigInt(128, 0) ) % 2^64; 其中SHA256()是一个安全的散列函数,下面将randBigInt()定义为一个非加密PRNG,我给它一个128位的种子,所以

我需要在Javascript中生成一个加密安全的64位无符号随机整数。第一个问题是Javascript只允许64位有符号整数,所以我认为9223372036854775808是支持的最大整数,而不使用浮点?为了解决这个问题,我可以使用一个大数字库,没问题

我的方法:

var randNum = SHA256( randBigInt(128, 0) ) % 2^64;
其中SHA256()是一个安全的散列函数,下面将randBigInt()定义为一个非加密PRNG,我给它一个128位的种子,所以暴力不应该是一个问题

randBigInt(n,s) //return an n-bit random BigInt (n>=1).  If s=1, then the most significant of those n bits is set to 1.
这是生成加密安全的64位随机整数的安全方法吗?重要的是,采用2^64模是否能保证100%我有一个64位的数字

一个抽象的例子,假设这个数字是素数(我不知道),我将在伽罗瓦字段[2^p]中使用它,其中p必须是64位,因此每个可能的1-63位数字都是一个字段元素。在这个查询中,我的随机整数必须大于任何63位数字。我不确定我是否正确地使用了256位哈希输出的2^64模


谢谢(希望有意义)

所有JavaScript数字实际上都是IEEE 754的两倍,这意味着您只能精确地表示大小为0的整数,您不能通过以这种方式散列输出,将非加密安全PRNG转换为安全PRNG你得到的熵与你作为PRNG种子的输入所提供的熵一样多。当然,输出看起来是随机的,但是如果攻击者知道你的方案(你应该假设他们知道,把Kerchoff的原理当作公理),那么他们可以猜测和/或强行输入

此外,您似乎有点不清楚“64位数字”到底想要什么。您想要64位随机数据(在这种情况下,设置最高位的概率应为50%),还是想要一些其他属性,如介于2^63和2^64-1之间的数字?你到底想干什么

加密安全散列函数的输出(小心:我不确定SHA256本身作为PRNG是否理想)应该通过统计测试,因此您可以非常确定每个位为1的概率是(非常接近)50%。这对于生成对称密钥很好,但这不是你在这里暗示的? (正如你继续说的,如果你在谈论GF(2^p),你确实需要一个给定大小的素数。如果你正在做的是,有一些算法可以生成可能的和可证明的素数,你应该研究它们。)

转到:

等等

精确度和实施


获取1000个十进制伪随机数并查看代码。

非常感谢,这很有意义。如果我们假设我可以得到一个高熵源来为SHA256设定种子,并且SHA256“足够安全”,我将如何将256位的结果更改为64位的数字?这是在秘密共享应用程序中使用的,我需要一个大于63位秘密的n位数字。这个秘密是63位,我需要一个比这个大的数字。因此,我必须假设机密是完整的63位,这意味着我需要将256位散列值移动到63-64位之间的范围,这样它就保证大于机密(即最大值,完整的63位)。假设您将摘要作为二进制字符串获取,只需将前8个字节适当地馈送到bignum库。如果您需要一个介于2^63和2^64-1之间的数字,请在执行此操作时设置最顶端字节的顶部位。为了精确起见:“您最多获得了与您提供的相同的熵[…]”此RNG似乎是一位对此主题没有经验的人的作品。仅仅因为设计师相信他们的发明并不意味着结果实际上是安全的,符合最新的标准。