【问题标题】:Can crypto.getRandomValues(new Uint32Array(1))[0] / lim ever be negative?crypto.getRandomValues(new Uint32Array(1))[0] / lim 可以是负数吗?
【发布时间】:2020-03-13 18:20:28
【问题描述】:

很好奇crypto.getRandomValues(new Uint32Array(1))[0] / lim 表达式是否可以为负数。

我正在转换的代码在其周围放置了一个 Math.abs 包装器,但我们中的一些人认为它不可能为负数,所以只是想看看其他人的想法?

var lim = Math.pow(2, 32) - 1;
crypto.getRandomValues(new Uint32Array(1))[0] / lim);

这是有关更多上下文的相关问题: Converting getRandomValue.browser from cuid to Typescript?

该库有一个getRandomValue() nodejs 函数,如下所示:

import * as crypto from "crypto"

var lim = Math.pow(2, 32) - 1;

export function getRandomValue () {
  return Math.abs(crypto.randomBytes(4)
    .readInt32BE(0) / lim)
}

我认为对于浏览器,Math.abs 调用被保留,尽管它似乎没有必要,而且很可能是不正确的。

【问题讨论】:

    标签: javascript node.js typescript cryptography cryptojs


    【解决方案1】:

    在这种情况下,使用Math.abs() 将是错误的!

    正如上面的声明所说,有问题的值是UInt32 ... 无符号 32 位整数。

    这仅仅意味着最左边的位(最高有效位)不是被解释为符号位。但是,这并不能防止您在某些情况下不经意地使用该值,假定MSB=1 表示“否定”。

    尽管如此,您使用abs() 将是错误,因为如果它发现MSB=1,这会将整个位模式转换为完全不同的位模式。由于 MSB 只是“构成该值的 32 位之一”,因此假设它是符号位的任何事情都是错误的。而且您还需要注意它永远不会显示为负数,因为它不是。这个数量是 32 位长,而不是 31+符号。确保它总是这样。

    【讨论】:

    • 所以根据您的回答,如果我们删除Math.abs(),代码会更正确吗?我假设如果将其删除,那么对于答案中的其他断言,代码将是正确的?
    • 完全不同的模式或只是 mod 2^31
    猜你喜欢
    • 1970-01-01
    • 2021-09-21
    • 1970-01-01
    • 2019-11-27
    • 2019-08-10
    • 2011-03-19
    • 1970-01-01
    • 2020-02-03
    • 2011-03-12
    相关资源
    最近更新 更多