【问题标题】:Cryptographically secure float加密安全浮动
【发布时间】:2016-01-03 10:47:10
【问题描述】:

如何在 Javascript 中生成 cryptographically secure 浮点数?

这应该是Math.random 的插件,范围为 (0, 1),但加密安全。示例用法

cryptoFloat.random();
0.8083966837153522

Secure random numbers in javascript? 展示了如何创建加密安全的 Uint32Array。也许这可以以某种方式转换为浮点数?

【问题讨论】:

  • 是否只需要支持支持window.crypto的浏览器?
  • @T.J.Crowder:实际上,对于我的用例,Firefox 就足够了。越笼统越好。
  • 只是在高层次上标记它:JavaScript 的浮点数是 64 位 IEEE-754 数字(好吧,如果你愿意,你可以得到一个 32 位的数字),这意味着它们只有53(有效)有效二进制数字。这对于几乎任何加密目的来说都是不够的。
  • @T.J.Crowder:警告绝对正确。然而,对于某些情况(统计分布)来说,这已经足够了。

标签: javascript random cryptography


【解决方案1】:

由于下面的代码很简单而且functionally equivalent to the division method,这里是alternate method of altering the bits。 (此代码是从@T.J. Crowder 非常有帮助的答案中复制和修改的)。

// A buffer with just the right size to convert to Float64
let buffer = new ArrayBuffer(8);

// View it as an Int8Array and fill it with 8 random ints
let ints = new Int8Array(buffer);
window.crypto.getRandomValues(ints);

// Set the sign (ints[7][7]) to 0 and the
// exponent (ints[7][6]-[6][5]) to just the right size 
// (all ones except for the highest bit)
ints[7] = 63;
ints[6] |= 0xf0;

// Now view it as a Float64Array, and read the one float from it
let float = new DataView(buffer).getFloat64(0, true) - 1; 
document.body.innerHTML = "The number is " + float;

解释:

The format of a IEEE754 double 是 1 个符号位(ints[7][7]),11 个指数位(ints[7][6]ints[6][5]),其余为尾数(保存值)。计算公式为

要将因子设置为 1,指数需要为 1023。它有 11 位,因此最高位为 2048。这需要设置为 0,其他位为 1。

【讨论】:

  • 酷。你确定不正常的事情不是问题,还是......?
  • @T.J.Crowder:这使用了最大位数。考虑尾数的每一位“将区间分割”为 2:第一个加 1/2 或 0,第二个加 1/4 或 0,第三个加 1/8 或 0,......仅当包含指数时才会出现次正规数的问题。 (那么这些数字显然是对数间隔的)。谢谢你。如果没有你的帮助,我可能不会成功。 (之前没有使用过 JS FloatArrays 等)
  • 不客气,我很高兴能帮上忙。再正常一点,几个小时后我又读了一遍,我不认为这是一个问题;您的方法应该在Number 可以精确表示的数字范围内均匀分布值。次正规通过牺牲精度来扩展范围。从随机性的角度来看,我认为将它们排除在外不会失去任何东西。
  • 我喜欢这个解决方案!非常感谢!尽管如此,虽然现在几乎整个宇宙都是小端的,但它可能值得明确:let float = new DataView(buffer).getFloat64(0, true) - 1;
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-07-05
  • 2011-03-09
  • 2011-05-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多