Re: Случайный пароль
От: L_G Россия  
Дата: 20.05.23 14:59
Оценка:
По поводу истинно случайного seed: если колхозить самому, то 2 хороших источника истинной случайности — это кадры с видеокамеры (объектив, закрытый "шторкой" — не помеха) и аудиоданные со звукового входа (хоть микрофонного, хоть линейного, отсутствие подключенного источника — не помеха), т.е. АЦП. Датчики температуры проца/материнки — тоже годятся. Любой АЦП шумит. Можно попытаться собрать только шум, используя N младших бит от каждого сабпикселя/сэмпла, но лучше тупо хешировать достаточный по размеру блок данных.

С доступом к этим устройствам, понятно, гемор, но, кажется, есть еще вариант: если в цикле замерять время исполнения одного маленького кусочка кода, то время будет каждый раз немножко разное, и немного истинной случайности в этом не может не быть (подразумевая, что речь идет о Windows/Linux, а не о микроконтроллерах и т.п.).
Замерять лучше функцией, использующей процессорную инструкцию rdtsc (надеюсь, есть в используемых стандартных библиотеках), как вариант — WinAPI-шной QueryPerformanceCounter.
Пример на коленке (100 голых вызовов этой самой rdtsc, результаты замеров в т.ч. побитно. Если что, сорри, я далек от С++):
#include <iostream>
#include <bitset>
#include <intrin.h> // есть не везде. на godbolt есть в MinGW (clang/gcc12). где-то - <x86intrin.h> (например, в ICC)
#pragma intrinsic(__rdtsc)

int main() {
    unsigned __int64 c = 0, c0;
    int a[100];
    for (int i = 0; i < 100; ++i) {
      c0 = c; c = __rdtsc();
      a[i] = c - c0;
    }
    for (int i = 0; i < 100; ++i) {
      std::cout << a[i] << ' ' << std::bitset<8>(a[i]) << std::endl;
    }
}

https://godbolt.org/z/3G4jd5eqc
Распределение сильно неравномерное, но закономерности явной нет. (На godbolt все чётные, на моём компе присутствует кратность трём...)
UPD: выкинул output из цикла замеров и попытку получить 1 "хороший" бит из нескольких.
Очевидно, лучше набрать побольше в байтах и захешировать всю последовательность.
Каша в голове — пища для ума (с)
Отредактировано 21.05.2023 15:33 L_G . Предыдущая версия . Еще …
Отредактировано 21.05.2023 15:25 L_G . Предыдущая версия .
Отредактировано 21.05.2023 15:13 L_G . Предыдущая версия .
Отредактировано 21.05.2023 12:51 L_G . Предыдущая версия .
Отредактировано 20.05.2023 21:07 L_G . Предыдущая версия .
Отредактировано 20.05.2023 19:35 L_G . Предыдущая версия .
Отредактировано 20.05.2023 18:49 L_G . Предыдущая версия .
Отредактировано 20.05.2023 17:01 L_G . Предыдущая версия .
Отредактировано 20.05.2023 16:45 L_G . Предыдущая версия .
Отредактировано 20.05.2023 16:20 L_G . Предыдущая версия .
Отредактировано 20.05.2023 15:08 L_G . Предыдущая версия .
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.