Все упомянутые вами алгоритмы (HKDF и SHA-256) являются псевдослучайными. В общем, любой подход, который вы собираетесь использовать здесь для преобразования некоторых действительно случайных чисел в другие последовательности, также является псевдослучайным. Это потому, что эти алгоритмы детерминированы: если вы введете одни и те же данные (энтропию), вы получите те же результаты.
Истинные случайные числа исходят из физического источника и не являются детерминированными. Это может быть радиоактивный распад, тепловой шум, автогенераторы или другие типы источников. Поскольку они не обязательно производят одинаковое количество единиц и нулей, а сбой неизвестен, обычно используется какая-то фильтрация и обработка, которая может быть криптографическим алгоритмом, таким как AES-CBC-MAC или SHA-256, или каким-то другим алгоритмом. устранение или уменьшение предвзятости, например XOR или устранение смещения фон Неймана, или и то, и другое.
Если бы вы использовали TRNG и производили случайные биты, вы могли бы выполнить операцию XOR с большим количеством битов из TRNG и получить ту же безопасность, но это было бы глупо, потому что вы используете вдвое больше битов из TRNG без увеличения безопасности. Точно так же вы можете выполнять модульное сложение байтов с двумя значениями TRNG, но опять же это имеет те же ограничения. Побитовое И смещает вывод, поэтому это может ослабить безопасность.
Поскольку любой алгоритм для расширения вывода TRNG будет псевдослучайным, а не действительно случайным, то, что вы, по сути, предлагаете, звучит как потоковый шифр с предварительно общим ключом на основе TRNG. Тем не менее, это совершенно нормально, как дизайн! Пока вы выбираете безопасный потоковый шифр, это законная и безопасная схема. Однако потоковые шифры не являются одноразовыми блокнотами и не являются доказуемо безопасными, но их гораздо удобнее использовать в реальной жизни.
Если вы решите использовать этот подход, я настоятельно рекомендую вам выбрать существующую, хорошо спроектированную библиотеку для ее создания. TLS поддерживает предварительные общие ключи, и, конечно же, есть другие библиотеки, которые могут делать то же самое для сообщений.