Сообщение Re: Случайный пароль от 20.05.2023 14:59
Изменено 20.05.2023 15:08 L_G
Re: Случайный пароль
По поводу истинно случайного seed: если колхозить самому, то 2 хороших источника истинной случайности — это кадры с видеокамеры и аудиоданные со звукового входа (хоть микрофонного, хоть линейного), т.е. АЦП. Любой АЦП шумит, нужно этот шум и брать, т.е. только N младших бит от каждого сабпикселя/сэмпла (и лучше N=1, хотя может быть надежнее проксорить между собой N младших битов, N=3..4).
(Известно, что XOR двух случайных чисел неизвестного качества даст случайное число качеством НЕ ХУЖЕ лучшего из исходных.)
С доступом к этим устройствам, понятно, гемор, но, кажется, есть еще вариант: если в цикле замерять время исполнения одного маленького кусочка кода, то время будет каждый раз немножко разное, и немного истинной случайности в этом не может не быть. Опять же надежнее проксорить несколько младших битов (получая 1 случайный бит за 1 цикл/замер).
Замерять лучше функцией, использующей процессорную инструкцию rdtsc (надеюсь, есть в используемых стандартных библиотеках).
Пример на коленке (показывает 16 битов из 100 замеров. Если что, сорри, я далек от С++):
(выглядит ОК. только последний бит почему-то всегда 0. поэтому и предлагаю ксорить несколько битов.)
(Известно, что 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 (надеюсь, есть в используемых стандартных библиотеках).
Пример на коленке (показывает 16 битов из 100 замеров. Если что, сорри, я далек от С++):
(Результат выглядит ОК. только последний бит почему-то всегда 0. поэтому и предлагаю ксорить несколько битов.)
(Известно, что 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. поэтому и предлагаю ксорить несколько битов.)