node.js를 사용하여 10의 거듭 제곱 계수에 대한 cryptographc 난수 생성

맘삭

암호화 라이브러리를 사용하면 라이브러리에서 여러 개의 임의 바이트를 제공하도록 요청할 수 있습니다. 문제는이 바이트가 각각 0에서 255까지의 숫자 (포함)이므로 균일하게 분산 된 결과를 만드는 것이 그렇게 간단하지 않다는 것입니다.

내 말은 다음과 같습니다.

이 함수는 10, 100, ... 10 ^ b 인 숫자 N을 받고, 여기서 b는 1과 8 사이의 숫자 (더 클 수 있지만 더 큰 것은 필요하지 않음)이고 0과 사이의 숫자를 반환합니다. 주어진 숫자 (주어진 숫자를 포함하지 않음), 즉 N이 100이면 함수의 결과는 0에서 99까지이고 N이 10이면 결과는 0에서 9까지입니다.

Math.random을 사용하고 N을 곱한 다음 floor를 사용하여 난수를 만들 수 있습니다. 그러나 Math.random은 암호 학적으로 안전하지 않으므로 임의로 생성 된 2 ^ 8m 숫자를 사용하여 수행해야합니다. 여기서 m은 crypto.randomBytes에 주어진 바이트 수입니다.

분명히 작동하는 간단한 기능을 만들었습니다. 그러나 난수에 약간의 편향을 유도하는 것이 상당히 쉽다는 것을 알고 있으며 프로젝트에 다소 중요하기 때문에 검증을 받고 싶습니다.

genera_aleatorio_residuo_potencia10 : function (n, cb) {
  var digitos = Math.log(n) / Math.LN10;
  var extra_base2 = digitos > 8 ? digitos - 8 : 0;
  if (Math.floor(digitos + .4) - digitos > 0.00000001) {
    return cb("Numero no es potencia de 10 (10, 100, 1000...)", null);
  }
  digitos = Math.round(digitos);
  async.parallel({
    r1 : crypto_helper.generador_random_bytes(1),
    r2 : crypto_helper.generador_random_bytes(1)
  }, function (err, res) {
    if (err) {
      return cb(err, null);
    }
    var r1 = res.r1[0] + 1;
    var r2 = res.r2[0] + 1;
    var aleatorio = (Math.pow(5, digitos) - 1) * Math.pow(2, extra_base2) * r1 + r2;
    cb(null, aleatorio % n);
  });
}

말할 필요도없이 : crypto_helper.generador_random_bytes는 비동기 라이브러리를 더 친숙하게 만들기 위해 자주 사용하는 node.js의 crypto.randomBytes의 래퍼입니다.

Math.pow (5, digitos) 및 Math.pow (2, extra_base2)를 사용하는 이유는 N과 256 사이의 최소 공배수 때문입니다. 실제로 n은 100000000보다 크지 않으므로 Math.pow ( 2, extra_base2)는 우리 제품에서 사용해서는 안되지만 다른 사람들에게도 이해가되는지 확인하고 싶습니다.

맘삭

Java의 SecureRandom.nextInt (int)가 여기에서 수행하는 작업을 간단히 모방하여 훌륭한 솔루션을 찾았습니다. SecureRandom.nextInt (int) 코드를 작성할 수있는 즉시 코드를 게시합니다 (현재 바쁘다). 제안 된 솔루션에 편향이 있음을 확인했기 때문에 개발 한 코드를 사용할 계획입니다 (전혀 허용되지 않음).

다음은 JDK 코드의 적응입니다. 31 비트 숫자에 대한 제한에 주목하십시오. JS가 32 비트로 2의 보수에 대해 모든 비트 연산을 수행한다는 것을 깨달았 기 때문입니다. 나는 그것을 사용하지 않을 것이기 때문에 2의 거듭 제곱에 대한 특별한 경우를 구현하지 않았습니다. 해결책은 일반적으로 10의 거듭 제곱뿐 아니라 10의 거듭 제곱을위한 것입니다. 10 진법을 사용하는 숫자에 대한 더 나은 솔루션이 있어야합니다. 다른 사람들이 더 쉽게 사용할 수 있도록 라이브러리를 사용하지 않고 영어로 만들도록 코드를 다시 작성했습니다.

var crypto_random_number_range = function (n, cb) {
  //result is a number from 0 a n-1
  //Javascript works with 32 bits for bitwise operations but these are signed (2-complement), so it is good to limit the size of n
  if (n <= 0 || n > 2147483647) {
    return cb("n must be larger than 0 and smaller than 2147483647", null);
  }
  var bits, val;
  async.doWhilst(
    function (cb2) {
      crypto.randomBytes(4, function (err, rbytes) {
        if (err) {
          return cb2(err);
        }
        bits = ((rbytes[3] & 0x7f) << 24) + 
          (rbytes[2] << 16) + (rbytes[1] << 8) + rbytes[0];
        val = bits % n;
        cb2();
      });
    }, function () {
      return (bits - val + (n-1)) < 0;
    }, function (err) {
      if (err) {
        return cb(err, null);
      }
      return cb(null, val);
    }
  );
}

몇 번의 테스트를했지만 제대로 작동하는 것 같습니다.

이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.

침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제

에서 수정
0

몇 마디 만하겠습니다

0리뷰
로그인참여 후 검토

관련 기사

분류에서Dev

11의 거듭 제곱에 대한 임의의 base64 숫자를 생성하는 방법

분류에서Dev

쉘 스크립팅 : 실수를 지수로 사용하여 숫자의 거듭 제곱 계산

분류에서Dev

10의 거듭 제곱을 곱한 후 소수에 가장 가까운 정수를 찾는 방법

분류에서Dev

함수의 n 번째 거듭 제곱을 계산하기 위해 Haskell 함수를 작성합니까?

분류에서Dev

큰 수에 대한 A ^ B (A 거듭 제곱 B)의 알고리즘

분류에서Dev

동일한 난수를 생성하는 Node.js 채팅 봇?

분류에서Dev

PHP를 사용하여 1에서 10 사이의 30 개의 난수 생성

분류에서Dev

거듭 제곱을 사용하여 계산 수행

분류에서Dev

재귀를 사용하여 큰 숫자의 거듭 제곱 계산

분류에서Dev

재귀를 사용하여 거듭 제곱의 합을 생성하는 방법은 무엇입니까?

분류에서Dev

난수에 대한 난수 시드를 생성하는 방법

분류에서Dev

NetLogo의 확률-하나를 사용하거나 난수 생성

분류에서Dev

큰 힘에 대해 왼쪽 이동 연산자를 사용하여 2의 거듭 제곱을 계산하려면 어떻게해야합니까?

분류에서Dev

고정 소수점에서 근사 2의 거듭 제곱

분류에서Dev

JS-거듭 제곱 부호 / 지수 대 숫자

분류에서Dev

srand를 사용하여 난수 생성

분류에서Dev

JAXB 및 Java를 사용하여 여러 계층 수준의 XML 파일에 대한 모델 클래스 생성

분류에서Dev

실수의 거듭 제곱 찾기

분류에서Dev

음수의 임의의 거듭 제곱을 취하는 방법

분류에서Dev

지수가 10 진수이고 1보다 작은 지수를 찾기위한 거듭 제곱 함수

분류에서Dev

2를 10000000의 거듭 제곱으로 계산하는 방법

분류에서Dev

srand ()를 사용한 난수 생성

분류에서Dev

C ++ : Stroustrup 예제를 사용한 난수 생성?

분류에서Dev

동일한 시드를 사용하여 코드의 다른 부분에서 C ++-11에서 난수 생성

분류에서Dev

지수와 거듭 제곱에 대한 O 표기 증명

분류에서Dev

사용 가능한 이진 난수 (0 또는 1 반환) 함수를 사용하여 정수 난수 생성

분류에서Dev

스레드로부터 안전하지 않은 난수 생성기를 사용하여 C의 pi monte carlo에 대한 OpenMP pragma 수정

분류에서Dev

이 의사 난수 생성기를 사용하는 것이 여기서 안전한지 확인하십시오.

분류에서Dev

0에서 n 사이의 RNGCryptoServiceProvider를 사용하여 난수 목록 생성

Related 관련 기사

  1. 1

    11의 거듭 제곱에 대한 임의의 base64 숫자를 생성하는 방법

  2. 2

    쉘 스크립팅 : 실수를 지수로 사용하여 숫자의 거듭 제곱 계산

  3. 3

    10의 거듭 제곱을 곱한 후 소수에 가장 가까운 정수를 찾는 방법

  4. 4

    함수의 n 번째 거듭 제곱을 계산하기 위해 Haskell 함수를 작성합니까?

  5. 5

    큰 수에 대한 A ^ B (A 거듭 제곱 B)의 알고리즘

  6. 6

    동일한 난수를 생성하는 Node.js 채팅 봇?

  7. 7

    PHP를 사용하여 1에서 10 사이의 30 개의 난수 생성

  8. 8

    거듭 제곱을 사용하여 계산 수행

  9. 9

    재귀를 사용하여 큰 숫자의 거듭 제곱 계산

  10. 10

    재귀를 사용하여 거듭 제곱의 합을 생성하는 방법은 무엇입니까?

  11. 11

    난수에 대한 난수 시드를 생성하는 방법

  12. 12

    NetLogo의 확률-하나를 사용하거나 난수 생성

  13. 13

    큰 힘에 대해 왼쪽 이동 연산자를 사용하여 2의 거듭 제곱을 계산하려면 어떻게해야합니까?

  14. 14

    고정 소수점에서 근사 2의 거듭 제곱

  15. 15

    JS-거듭 제곱 부호 / 지수 대 숫자

  16. 16

    srand를 사용하여 난수 생성

  17. 17

    JAXB 및 Java를 사용하여 여러 계층 수준의 XML 파일에 대한 모델 클래스 생성

  18. 18

    실수의 거듭 제곱 찾기

  19. 19

    음수의 임의의 거듭 제곱을 취하는 방법

  20. 20

    지수가 10 진수이고 1보다 작은 지수를 찾기위한 거듭 제곱 함수

  21. 21

    2를 10000000의 거듭 제곱으로 계산하는 방법

  22. 22

    srand ()를 사용한 난수 생성

  23. 23

    C ++ : Stroustrup 예제를 사용한 난수 생성?

  24. 24

    동일한 시드를 사용하여 코드의 다른 부분에서 C ++-11에서 난수 생성

  25. 25

    지수와 거듭 제곱에 대한 O 표기 증명

  26. 26

    사용 가능한 이진 난수 (0 또는 1 반환) 함수를 사용하여 정수 난수 생성

  27. 27

    스레드로부터 안전하지 않은 난수 생성기를 사용하여 C의 pi monte carlo에 대한 OpenMP pragma 수정

  28. 28

    이 의사 난수 생성기를 사용하는 것이 여기서 안전한지 확인하십시오.

  29. 29

    0에서 n 사이의 RNGCryptoServiceProvider를 사용하여 난수 목록 생성

뜨겁다태그

보관