node.js - 如何在 nodejs 中使用 getRandomValues()?

我正在使用 Javascript 生成 wireguard key 对,但它是面向浏览器的,所以我删除了窗口对象,并且还有一个问题阻止创建私钥。

问题是我无法在 nodejs 中运行的这行代码:

    function generatePresharedKey() {

var privateKey = new Uint8Array(32);
var crypto = require('crypto');
crypto.getRandomValues(privateKey);

                return privateKey;
        }

这是我得到的错误

crypto.getRandomValues(privateKey);
       ^

TypeError: crypto.getRandomValues is not a function

如果我尝试使用 require 调用 getRandomValues,它会说找不到模块。 var getRandomValues = require('get-random-values');

如何导入它? npm install get-random-values 没有帮助。

有什么建议吗?

在这里摆弄:

/*! SPDX-License-Identifier: GPL-2.0
 *
 * Copyright (C) 2015-2020 Jason A. Donenfeld <Jason@zx2c4.com>. All Rights Reserved.
 */
function gf(init) {
                var r = new Float64Array(16);
                if (init) {
                        for (var i = 0; i < init.length; ++i)
                                r[i] = init[i];
                }
                return r;
        }

function pack(o, n) {
                var b, m = gf(), t = gf();
                for (var i = 0; i < 16; ++i)
                        t[i] = n[i];
                carry(t);
                carry(t);
                carry(t);
                for (var j = 0; j < 2; ++j) {
                        m[0] = t[0] - 0xffed;
                        for (var i = 1; i < 15; ++i) {
                                m[i] = t[i] - 0xffff - ((m[i - 1] >> 16) & 1);
                                m[i - 1] &= 0xffff;
                        }
                        m[15] = t[15] - 0x7fff - ((m[14] >> 16) & 1);
                        b = (m[15] >> 16) & 1;
                        m[14] &= 0xffff;
                        cswap(t, m, 1 - b);
                }
                for (var i = 0; i < 16; ++i) {
                        o[2 * i] = t[i] & 0xff;
                        o[2 * i + 1] = t[i] >> 8;
                }
        }


function carry(o) {
                var c;
                for (var i = 0; i < 16; ++i) {
                        o[(i + 1) % 16] += (i < 15 ? 1 : 38) * Math.floor(o[i] / 65536);
                        o[i] &= 0xffff;
                }
        }

function cswap(p, q, b) {
                var t, c = ~(b - 1);
                for (var i = 0; i < 16; ++i) {
                        t = c & (p[i] ^ q[i]);
                        p[i] ^= t;
                        q[i] ^= t;
                }
        }

function add(o, a, b) {
                for (var i = 0; i < 16; ++i)
                        o[i] = (a[i] + b[i]) | 0;
        }
function subtract(o, a, b) {
                for (var i = 0; i < 16; ++i)
                        o[i] = (a[i] - b[i]) | 0;
        }
function multmod(o, a, b) {
                var t = new Float64Array(31);
                for (var i = 0; i < 16; ++i) {
                        for (var j = 0; j < 16; ++j)
                                t[i + j] += a[i] * b[j];
                }
                for (var i = 0; i < 15; ++i)
                        t[i] += 38 * t[i + 16];
                for (var i = 0; i < 16; ++i)
                        o[i] = t[i];
                carry(o);
                carry(o);
        }
function invert(o, i) {
                var c = gf();
                for (var a = 0; a < 16; ++a)
                        c[a] = i[a];
                for (var a = 253; a >= 0; --a) {
                        multmod(c, c, c);
                        if (a !== 2 && a !== 4)
                                multmod(c, c, i);
                }
                for (var a = 0; a < 16; ++a)
                        o[a] = c[a];
        }
function clamp(z) {
                z[31] = (z[31] & 127) | 64;
                z[0] &= 248;
        }

function generatePublicKey(privateKey) {
                var r, z = new Uint8Array(32);
                var a = gf([1]),
                        b = gf([9]),
                        c = gf(),
                        d = gf([1]),
                        e = gf(),
                        f = gf(),
                        _121665 = gf([0xdb41, 1]),
                        _9 = gf([9]);
                for (var i = 0; i < 32; ++i)
                        z[i] = privateKey[i];
                clamp(z);
                for (var i = 254; i >= 0; --i) {
                        r = (z[i >>> 3] >>> (i & 7)) & 1;
                        cswap(a, b, r);
                        cswap(c, d, r);
                        add(e, a, c);
                        subtract(a, a, c);
                        add(c, b, d);
                        subtract(b, b, d);
                        multmod(d, e, e);
                        multmod(f, a, a);
                        multmod(a, c, a);
                        multmod(c, b, e);
                        add(e, a, c);
                        subtract(a, a, c);
                        multmod(b, a, a);
                        subtract(c, d, f);
                        multmod(a, c, _121665);
                        add(a, a, d);
                        multmod(c, c, a);
                        multmod(a, d, f);
                        multmod(d, b, _9);
                        multmod(b, e, e);
                        cswap(a, b, r);
                        cswap(c, d, r);
                }
                invert(c, c);
                multmod(a, a, c);
                pack(z, a);
                return z;
        }


function generatePresharedKey() {
                var privateKey = new Uint8Array(32);
//var crypto = require('crypto').randomBytes;
//var getRandomValues = require('get-random-values');
//crypto.getRandomValues(privateKey);
const webcrypto = require('crypto').webcrypto;
webcrypto.getRandomValues(privateKey);
                return privateKey;
        }

function generatePrivateKey() {
                var privateKey = generatePresharedKey();
                clamp(privateKey);
                return privateKey;
        }
 
function encodeBase64(dest, src) {
                var input = Uint8Array.from([(src[0] >> 2) & 63, ((src[0] << 4) | (src[1] >> 4)) & 63, ((src[1] << 2) | (src[2] >> 6)) & 63, src[2] & 63]);
                for (var i = 0; i < 4; ++i)
                        dest[i] = input[i] + 65 +
                        (((25 - input[i]) >> 8) & 6) -
                        (((51 - input[i]) >> 8) & 75) -
                        (((61 - input[i]) >> 8) & 15) +
                        (((62 - input[i]) >> 8) & 3);
        }

function keyToBase64(key) {
                var i, base64 = new Uint8Array(44);
                for (i = 0; i < 32 / 3; ++i)
                        encodeBase64(base64.subarray(i * 4), key.subarray(i * 3));
                encodeBase64(base64.subarray(i * 4), Uint8Array.from([key[i * 3 + 0], key[i * 3 + 1], 0]));
                base64[43] = 61;
                return String.fromCharCode.apply(null, base64);
        }


function generateKeypair() {
  var privateKey = generatePrivateKey();
  var publicKey = generatePublicKey(privateKey);
  return {
    publicKey: keyToBase64(publicKey),
    privateKey: keyToBase64(privateKey)
  };
}

function doSomething() {
        const   keypair = generateKeypair()
  var m = JSON.stringify(keypair)
 var op = JSON.parse(m)
  console.log(keypair)
 //console.log(op.publicKey)
  document.getElementById("demo").innerHTML =  op.publicKey + "</br>" +  op.privateKey;
   
}


doSomething();

最佳答案

类别:Crypto

  • 添加于:v15.0.0

Calling require('crypto').webcrypto returns an instance of the Crypto class. Crypto is a singleton that provides access to the remainder of the crypto API.

例子:

const privateKey = new Uint8Array(32);
const webcrypto = require('crypto').webcrypto;
webcrypto.getRandomValues(privateKey);

结果:

÷ÆVY{ñÕÓ»ÃVíA0²†xò¥x´ü^18

https://stackoverflow.com/questions/69088396/

相关文章:

git - 如何创建自定义 git/bash 脚本?

c# - 如何按值列表分组,然后计算每个值的条目数量

go - 在 golang 中将 []*string 转换为 []string

python - 您如何为加权平均平均值迭代地为数据框列赋予权重?

snowflake-cloud-data-platform - 使用 Google 作为身份提供商

c++ - 如何区分ascii值和数字?

javascript - JS : proper way of using optional cha

visual-studio-code - 如何在 VS Code 中按字母顺序排列纯文本列表?

swiftui - PresentationMode 触发器 "Variable X used be

ruby-on-rails - Rubocop 在 Rails 中的蓝图序列化程序自定义字段中警告