2016-08-12 5 views
2

В C++ мы можем сгенерировать истинные случайные числа (если ваше оборудование поддерживает) с помощью random_device. И я пишу реализацию алгоритма одноразового использования с C. Есть ли способ генерировать истинные случайные числа в C? Я пишу с C для скорости и некоторые другие причины. Если я использую PRNG, это будет небезопасно.Есть ли эквивалент random_device в C

char *KeyGenerate(unsigned long long StringLength) 
{ 
    std::random_device TrueRandomNumberGenerator; 
    char *Key = (char *) malloc(StringLength + 1); 

    for(unsigned long long I = 0; I < StringLength; I++) 
    { 
     Key[I] = TrueRandomNumberGenerator(); 
    } 
    Key[StringLength] = '\0'; 

    return Key; 
} 
+0

'arc4random' (если таковая имеется) будет генерировать криптографически защищенных случайных чисел. – user3386109

+0

В Linux вы можете прочитать более или менее фактическое «случайное устройство» в '/ dev/random'. – PSkocik

+0

На самом деле, предпочтительнее использовать/dev/urandom вместо/dev/random: http://stackoverflow.com/a/3709644/90511 – hugomg

ответ

3

Стандартная библиотека C очень маленькая. Чтобы получить истинные случайные числа, вам нужно будет использовать API-интерфейсы, специфичные для ОС.

В системах Linux вы можете получить поток криптографически сильных случайных байтов из файла /dev/urandom.

+0

Есть ли более портативный способ сделать это? –

+2

/dev/urandom также работает на BSD и MacOS. Если вам также нужен ваш код для работы с окнами, то, я думаю, у вас будет много других проблем, кроме случайных чисел. Используете ли вы какую-либо библиотеку для переносимости? – hugomg

+0

На самом деле это только консольное приложение. Я использую только стандартную библиотеку C. Windows - это не вопрос. –

0

C использует PRNG (генератор псевдослучайных чисел), так что вы действительно не можете получить истинные случайные числа.

Поскольку ваш код генерирует кучу случайных чисел, вы могли бы просто:

srand(time(NULL)); 
int r = rand(); 

где srand(time(NULL));

будет идти выше цикл. Таким образом, вы семя один раз, затем генерируете свои случайные числа

+1

Функция rand() генерирует предикаты случайных чисел. OP специально сказал, что им нужны криптографически безопасные случайные числа. – hugomg

+0

Я очень недоволен этим ответом. Его попросили получить * истинные случайные числа * (по какой-то причине), и это просто полностью не удается (что опасно в этом контексте). (Я также не могу понять upvotes) – sascha

+0

@sascha OP спросил, можете ли вы создать истинные случайные числа в C, и я сказал, что вы не можете. Ничего в его сообщении не упоминалось криптографически - безопасные случайные числа. – FreeStyle4

1

Как указано в Linux, вы должны прочитать /dev/urandom. На WIndows альтернативы можно было бы использовать CryptGenRandom

Это то, что делается в Python, я считаю, - API вызовы /dev/urandom на основе кода на Linux, но CryptGenRandom на Windows.

Не достаточно знать о OS X

Смежные вопросы