LINUX.ORG.RU

Инициализация генератора случайных чисел

 


0

1

Пришлось разрабатывать программу, которая использует aes256cbc для шифрования данных. Используется libtomcrypt. С++11.

Нужно проинициализировать генератор случайных чисел. В C++ вижу random, в libtomcrypt - rng_make_prng(). В качестве PRNG будет использоваться fortuna из libtomcrypt.

Вопрос:

  • как корректно добавить энтропии фортуне? Откуда ее брать? C++ random? За примеры кода буду благодарен, с примерами скудно.
  • какой критерий, что энтропия достаточна. Есть функция у фортуны entropy(), которая вернет значение. Какое значение считается приемлемым?
  • надо ли следить за уровнем энтропии в процессе работы системы, и «подкачивать» новой, если уменьшается?

Спасибо.

★★

Откуда ее брать? C++ random?

в C++ STL нет интерфейса для получения энтропии, там только всякие генераторы псевдослучайных чисел.

советую как минимум покурить этот ман: https://man7.org/linux/man-pages/man7/random.7.html. Еще лучше не дергать эти api напрямую, а воспользоваться проверенной библиотекой, например openssl. https://www.openssl.org/docs/man3.2/man3/RAND_bytes.html

Lrrr ★★★★★
()
Последнее исправление: Lrrr (всего исправлений: 1)

Откуда ее брать?

Кроссплатформенно - читать /dev/random.

В OpenBSD есть функция getentropy(), которая позже была заимствована в Linux и FreeBSD.

В Linux есть функция getrandom(), которая позже была заимствована FreeBSD.

В старых системах вариантов кроме чтения /dev/random нет, эти функции появились относительно недавно - вроде меньше 10 лет назад.

firkax ★★★★★
()
Последнее исправление: firkax (всего исправлений: 1)
Ответ на: комментарий от Lrrr

в C++ STL нет интерфейса для получения энтропии, там только всякие генераторы псевдослучайных чисел.

ктото запретил в томже с++ ifstream + /dev/random ?

также есть смысл запускать спец демон энтропии, иначе блокировки.

anonymous2 ★★★★★
()
Последнее исправление: anonymous2 (всего исправлений: 2)
Ответ на: комментарий от blex

можно например брать с внешних девайсов, например с rutoken (он и aes256cbc умеет), + это сертифицировано - но это медленно.

anonymous2 ★★★★★
()
Последнее исправление: anonymous2 (всего исправлений: 2)
Ответ на: комментарий от blex

Нет, но достаточно ли его? Может надо комбинировать?

Генераторы случайных чисел это сложно и про это много науки есть…

Если нужно использовать авторитетные решения, то использую генераторы сертифицированные соотв. службами той страны, в которой работаешь.

В целом, тебе правильно сказали, получение случайных чисел это не внутренняя проблема твоего решения, это отдельное внешнее решение, из которого ты получаешь числа того качества, которое требуется. Поэтому источник данных лучше сделать параметром. Базово читать лучше из /dev/random, если нужна скорость, а качество не так важно, то можно из /dev/urandom, если нужны сертифицированные решения, то железка в комп и соотв. файл /dev/rng*** от оборудования…

soomrack ★★★★
()

Сид читай из /dev/random. Генерируй качественным криптографическим генератором случайных чисел. «Переинициализировать» нормальный генератор не нужно.

random к криптографии отношения никакого не имеет и его использовать нигде не нужно.

aes-cbc использовать не рекомендуется, он уязвим к некоторым атакам при неправильной реализации. Лучше использовать aes-gcm. Или очень внимательно почитать, что про это пишут.

Рассмотри вариант использования openssl или одного из его популярных форков. Про этот libtomcrypt я услышал сегодня в первый раз и это не очень хороший признак, когда речь идёт о библиотеке для шифрования. Ещё хорошая библиотека - libsodium.

vbr ★★★
()
Последнее исправление: vbr (всего исправлений: 2)

обычно приложение использует истинно случайное число, как затравку для генератора псевдослучайных чисел. это криптографически безопасно и производительность такого решения выше.

истинно случайное число создает ОС, с привлечением железного ГСЧ или без. с железным ГСЧ лучше, но его отсутствие это не шоустоппер.

криптографические библиотеки лучше брать старые, унылые и проверенные. любой признак новизны в том, что касается криптографии - повод насторожиться.

olelookoe ★★★
()
Ответ на: комментарий от no-dashi-v2

Ну во-первых кто сказал, что она корректно реализует алгоритм во всех случаях? В том же TLS есть тонкие моменты, при ошибках в которых будет уязвимость, хотя работать в то же время будет нормально.

Во-вторых есть атаки через побочные каналы. Самое известное - время выполнения алгоритма, но есть и другие каналы. В популярных библиотеках про это, как правило, думают, вплоть до реализации частей алгоритма на ассемблере, если это позволяет получить более предсказуемый код.

В-третьих с использованием нормальной библиотеки вопрос у топикстартера вообще возникать не должен. Генерация случайных чисел это очень важная часть криптографии и отдавать её на откуп пользователю это верный способ получить уязвимую программу. Библиотека должна сама генерировать случайные числа и должна сама знать, где их лучше брать, по крайней мере на типовых платформах.

vbr ★★★
()

Спасибо всем отписавшимся. Выбор алгоритма не в моей власти, выбор библиотеки - частично (tomcrypt уже используется в проекте для других задач, нужны веские аргументы против нее. Библиотека старая, сопровождается давно, с хорошей документацией, в отличие от OpenSSL).

Попробую посмотреть на поведение энтропии в fortuna в процессе работы, надеюсь, что мои опасения ложные.

std::random_device(«default») пока в качестве источника энтропии, потом буду думать дальше.

blex ★★
() автор топика

В botan так:

The following entropy sources are currently used:
The system RNG (/dev/urandom, getrandom, arc4random, BCryptGenRandom, or RtlGenRandom).
Processor provided RNG outputs (RDRAND, RDSEED, DARN) are used if available, but not counted as contributing entropy
The getentropy call is used on OpenBSD, FreeBSD, and macOS
/proc walk: read files in /proc. Last ditch protection against flawed system RNG.
Win32 stats: takes snapshot of current system processes. Last ditch protection against flawed system RNG.

dataman ★★★★
()