Криптографически безопасное случайное целое число между двумя значениями - PullRequest
0 голосов
/ 13 июля 2020

Я использовал RNGCryptoServiceProvider для создания случайного целого числа. Это сгенерирует случайное целое число между нижней и верхней границами целого числа.

private static RNGCryptoServiceProvider rngCryptoServiceProvider = new RNGCryptoServiceProvider();

public int Execute(int lowerBound, int upperBound)
{
    // initialize an array of bytes equal to the number of bytes in an integer
    var numberOfBytes = sizeof(int);
    var bytes = new byte[numberOfBytes];

    // fill the array with random bytes
    rngCryptoServiceProvider.GetBytes(bytes);

    // convert the byte array to an integer
    var bitsAsInteger = BitConverter.ToInt32(bytes, 0);
    
    return bitsAsInteger;
}

Теперь я хочу сгенерировать случайное целое число между двумя целыми числами. Судя по тому, что я прочитал, это нетривиальная задача. Итак, я подумал, что могу случайным образом засеять класс System.Random и использовать функциональность Next() для вычислений. Это разумный подход?

private static RNGCryptoServiceProvider rngCryptoServiceProvider = new RNGCryptoServiceProvider();

public int Execute(int lowerBound, int upperBound)
{
    // initialize an array of bytes equal to the number of bytes in an integer
    var numberOfBytes = sizeof(int);
    var bytes = new byte[numberOfBytes];

    // fill the array with random bytes
    rngCryptoServiceProvider.GetBytes(bytes);

    // convert the byte array to an integer
    var bitsAsInteger = BitConverter.ToInt32(bytes, 0);

    // use the random integer to seed the non cryptographically secure Random class
    var random = new System.Random(bitsAsInteger);
    
    // use the Next() functionality to do the math to get a random number between two values
    var randomInteger = random.Next(lowerBound, upperBound);
    
    return randomInteger;
}

Есть ли другой способ достичь того же результата без использования System.Random?

1 Ответ

0 голосов
/ 13 июля 2020

Вы можете использовать модуль.

private static RNGCryptoServiceProvider rngCryptoServiceProvider = new RNGCryptoServiceProvider();

public int Execute(int lowerBound, int upperBound)
{
    // initialize an array of bytes equal to the number of bytes in an integer
    var numberOfBytes = sizeof(int);
    var bytes = new byte[numberOfBytes];

    // fill the array with random bytes
    rngCryptoServiceProvider.GetBytes(bytes);

    // convert the byte array to an integer
    var bitsAsInteger = BitConverter.ToInt32(bytes, 0);
    var m = (int)(Math.Abs(bitsAsInteger) % ((long)int.MaxValue - int.MinValue));
    return m + lowerBound;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...