Информация об изменениях

Сообщение Re: Случайный пароль от 20.05.2023 14:59

Изменено 20.05.2023 16:20 L_G

Re: Случайный пароль
По поводу истинно случайного seed: если колхозить самому, то 2 хороших источника истинной случайности — это кадры с видеокамеры и аудиоданные со звукового входа (хоть микрофонного, хоть линейного), т.е. АЦП. Любой АЦП шумит, нужно этот шум и брать, т.е. только N младших бит от каждого сабпикселя/сэмпла (и лучше N=1, хотя может быть надежнее проксорить между собой N младших битов, N=3..4).
(Известно, что XOR двух случайных чисел неизвестного качества даст случайное число качеством НЕ ХУЖЕ лучшего из исходных.)

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

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

(Результат выглядит ОК. только последний бит почему-то всегда 0. поэтому и предлагаю ксорить несколько битов.)
Re: Случайный пароль
По поводу истинно случайного seed: если колхозить самому, то 2 хороших источника истинной случайности — это кадры с видеокамеры и аудиоданные со звукового входа (хоть микрофонного, хоть линейного), т.е. АЦП. Любой АЦП шумит, нужно этот шум и брать, т.е. только N младших бит от каждого сабпикселя/сэмпла (и лучше N=1, хотя может быть надежнее проксорить между собой N младших битов, N=3..4).
(Известно, что XOR двух случайных чисел неизвестного качества даст случайное число качеством НЕ ХУЖЕ лучшего из исходных.)

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

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

(Результат выглядит ОК. только последний бит почему-то всегда 0. поэтому и предлагаю ксорить несколько битов.)