- Как сделать генератор случайных чисел на основе шумового диода — пошаговое руководство для практика
- Почему именно шумовой диод?
- Что тебе понадобится
- Как собрать схему — пошагово
- Как проверить, что шум — настоящий
- Преобразование аналогового шума в биты
- Сравнение диодов и подходов
- Что не так с типичными ошибками
- Как сделать лучше — практические рекомендации
- Что выбрать — в зависимости от ситуации
- Итог — что делать прямо сейчас
Как сделать генератор случайных чисел на основе шумового диода — пошаговое руководство для практика
Если ты хочешь получить настоящий, физически случайный поток битов — не псевдослучайный, а тот, что не воспроизводится, не предсказуем и не зависит от алгоритма — шумовой диод это твой инструмент. Не теория. Не библиотека. Реальный физический шум, который ты можешь поймать, усилить и превратить в случайные числа. Я делал такие генераторы для криптографических систем, тестирования ПО и научных экспериментов. Ниже — то, что реально работает, без лишней теории.
Почему именно шумовой диод?
Псевдослучайные генераторы (ПСГ) на основе алгоритмов — это удобно. Но они детерминированы. Если ты знаешь начальное состояние (семя), ты можешь воспроизвести всю последовательность. Это плохо для генерации ключей, случайных сессий, криптографических протоколов. Шумовой диод — это физический источник энтропии. Его выход — результат квантовых эффектов: туннелирование электронов через p-n-переход, тепловые колебания, дробовой шум. Эти процессы не воспроизводимы. Ни один алгоритм не может их предсказать.
Ты не можешь «взломать» физический шум. Только если ты физически не подключишься к самому диоду и не измеришь его суперточно — а это требует лаборатории, а не дешёвого осциллографа. Поэтому для реальных задач, где безопасность важна, шумовой диод — один из самых надёжных источников.
Что тебе понадобится
Ты не собираешь космический телескоп. Это простая схема, которую можно собрать за пару часов на макетной плате. Вот минимальный набор:
- Шумовой диод — например, 1N4148 или BZX85-C3V3 (стабилитрон, работающий в области пробоя). Оба работают, но стабилитрон даёт больше шума при малом токе.
- Операционный усилитель — OPA333 или TL072. Важно: низкий уровень собственного шума, высокий коэффициент усиления.
- Резисторы и конденсаторы — для фильтрации и установки рабочей точки.
- АЦП — микроконтроллер с 10-битным или лучше АЦП (например, ATmega328P или ESP32).
- Источник питания — стабилизированный, 5 В или 3.3 В. Никаких импульсных блоков!
- Экран и изоляция — шум от радио, Wi-Fi, света может «запятнать» сигнал. Лучше поместить схему в металлический корпус.
Не покупай «шумовые диоды» на Алиэкспресс с маркировкой «random noise». Это маркетинг. Бери обычные компоненты, которые точно работают в обратном смещении. Я проверял десятки диодов — не все дают одинаковый шум. Потребуется тестирование.
Как собрать схему — пошагово
- Подключи диод в обратном смещении. Анод — к земле, катод — к входу усилителя. Ток через диод должен быть 1–5 мА. Для 1N4148 — резистор 1 кОм от 5 В к катоду. Для стабилитрона 3.3 В — резистор 1.5 кОм от 5 В.
- Усилитель — инвертирующий каскад. Используй ОУ с коэффициентом усиления 100–500. Подключи резистор 10 кОм от входа к выходу, резистор 100 Ом от входа к земле. Это даст усиление 100x. Стабилитрон даёт шум ~10–50 мкВ, усилитель выдаст 1–5 мВ — этого достаточно для АЦП.
- Фильтр низких частот. Добавь RC-фильтр на выходе усилителя: резистор 1 кОм + конденсатор 100 нФ. Это отсечёт 50 Гц от сети и низкочастотный дрейф. Не убирай его — без него АЦП будет ловить температурные сдвиги, а не шум.
- Подключи к АЦП. Выход фильтра — на вход АЦП. Убедись, что вход АЦП не имеет внутреннего подтягивающего резистора. Если есть — отключи его в настройках микроконтроллера.
- Питание — только стабилизированное. Даже 10 мВ пульсаций от импульсного преобразователя могут заглушить шум диода. Используй LDO-стабилизаторы типа AMS1117-3.3 или LP2985.
- Экранируй всё. Помести схему в алюминиевую коробку. Подключи корпус к земле. Закрой провода фольгой. Шум от Wi-Fi и Bluetooth может быть в 10 раз сильнее, чем шум диода.
Как проверить, что шум — настоящий
Собрал схему? Не торопись считать биты. Сначала проверь, что ты ловишь шум, а не артефакты.
- Подключи осциллограф к выходу усилителя. Если ты видишь чистую синусоиду, пилообразный сигнал или ступеньки — ты поймал помехи, а не шум. Настоящий шум — это хаотичная «шумовая каша» без повторяющихся форм.
- Отключи диод. Если сигнал исчезает — хорошо. Если остаётся — проблема в усилителе или питании.
- Поменяй диод. Если шум стал тише или грубее — значит, ты нашёл «хороший» диод. Не все одинаковы. Потестируй 5–10 штук. Найди тот, у которого амплитуда шума максимальна при одинаковом токе.
- Измерь температуру. Шум зависит от температуры. Если ты видишь, что среднее значение сигнала плавно растёт в течение часа — это дрейф, а не шум. Добавь термостабилизацию (например, термистор + резистивный делитель в цепи обратной связи) или просто дай схеме прогреться 30 минут перед использованием.
Преобразование аналогового шума в биты
Ты поймал шум. Теперь нужно превратить его в последовательность 0 и 1. Это не просто «взять значение АЦП и сравнить с порогом».
Если ты просто сравниваешь напряжение с 1.65 В (половина диапазона 0–3.3 В), ты получишь 50/50, но с зависимостью от температуры и смещения. Шум может быть асимметричным — и тогда ты будешь получать 52% единиц, 48% нулей. Это плохо для криптографии.
Правильный способ — использовать разность между двумя соседними отсчётами.
Вот как это работает:
- Считай два последовательных значения с АЦП:
AиB. - Вычисли разность:
D = B - A. - Если
D > 0— выдаём 1. ЕслиD ≤ 0— выдаём 0.
Почему так? Потому что шум — это случайный процесс. Вероятность того, что следующий отсчёт выше предыдущего, равна вероятности того, что он ниже — при условии, что шум стационарен (не меняется со временем). Это убирает смещение, связанное с постоянной составляющей сигнала.
Частота отсчётов — 10–50 кГц. Быстрее — рискуешь поймать корреляцию между отсчётами. Медленнее — слишком мало битов в секунду. Для 10 кГц и 1 бит на два отсчёта — ты получаешь 5000 бит/с. Этого достаточно для генерации ключей, сессий, хэшей.
Сравнение диодов и подходов
| Источник шума | Уровень шума | Стабильность | Сложность сборки | Скорость (бит/с) | Подходит для криптографии |
|---|---|---|---|---|---|
| 1N4148 (обратное смещение) | Средний | Средняя | Простая | 3000–6000 | Да |
| BZX85-C3V3 (стабилитрон) | Высокий | Хорошая | Простая | 5000–10000 | Да |
| LED (в обратном включении) | Низкий | Плохая | Простая | 500–2000 | Нет |
| Резистор (тепловой шум) | Очень низкий | Хорошая | Сложная | 100–500 | Только с высоким усилением |
| АЦП без источника (только шум микросхемы) | Низкий, нестабильный | Плохая | Простая | 1000–3000 | Нет |
Стабилитрон BZX85-C3V3 — мой выбор по умолчанию. Он даёт больше шума при меньшем токе, чем 1N4148, и менее чувствителен к температуре. 1N4148 — дешевле, но требует более высокого тока и более тщательной стабилизации. LED — не подходит. Многие пытаются использовать их, потому что «они же светятся», но шум у них слишком мал, и он сильно зависит от температуры и вольт-амперной характеристики. Не трать время.
Что не так с типичными ошибками
Люди делают одну и ту же ошибку — снова и снова.
- Собирают схему без экрана. Шум от Wi-Fi — 100 мкВ. Шум от диода — 50 мкВ. Результат — ты генерируешь числа по сигналу от соседнего роутера. Проверь: выключи Wi-Fi — и если распределение битов меняется — ты не генератор, а радиоприёмник.
- Используют импульсный блок питания. Даже если он «тихий» — он создаёт пиковые помехи в диапазоне 100–500 кГц. Это попадает в полосу твоего фильтра. Используй только LDO.
- Сравнивают отсчёт с порогом. Это даёт смещение. Ты не получишь 50/50. Ты получишь 53/47. И это может быть критично для криптографии.
- Не проверяют статистику. Не проверяешь равномерность распределения. Не проверяешь автокорреляцию. Ты думаешь, что всё работает — а на самом деле ты генерируешь 1000 одинаковых бит подряд, потому что схема застряла.
- Считают, что один диод — достаточно. Нет. Даже хороший диод может иметь небольшую корреляцию между отсчётами. Лучше использовать два диода на разных каналах АЦП и XOR-ить их выходы. Это убирает остаточную корреляцию.
Как сделать лучше — практические рекомендации
Если ты хочешь надёжный генератор — не останавливайся на базовой схеме.
- Используй два диода. Подключи два стабилитрона на два разных канала АЦП. Считай пары отсчётов. XOR-ни их. Это убирает симметричные артефакты. Шум становится ещё более случайным.
- Добавь постобработку. Даже после XOR-а могут быть небольшие отклонения. Пропускай выход через алгоритм Von Neumann (или его улучшенную версию): берёшь два бита. Если 00 или 11 — отбрасываешь. Если 01 — выдаёшь 0. Если 10 — выдаёшь 1. Это снижает скорость в 2–4 раза, но гарантирует идеальную 50/50. Для криптографии — стоит.
- Тестируй на Ent, Dieharder, NIST. Запиши 10 МБ данных. Запусти ent (утилита для анализа случайности). Ты должен получить:
- Энтропию: 7.999 бит/байт (максимум — 8)
- Среднее: 127.5 (для байтов)
- Корреляция: близко к 0
Если энтропия ниже 7.9 — ищи проблему в схеме.
- Температурная компенсация. Если ты хочешь, чтобы генератор работал 24/7 — добавь термодатчик и корректируй ток через диод в зависимости от температуры. Даже 10°C изменения меняют шум на 1–2%. Это не критично для разовых задач, но для долгосрочной работы — важно.
- Не хранить данные на флешке. Если ты генерируешь ключи и пишешь их в файл — не пиши их в открытом виде. Храни только хэш от ключа, а сам ключ — в памяти, в защищённом режиме.
Что выбрать — в зависимости от ситуации
- Ты тестируешь ПО или генерируешь сессии для тестов — хватит одного диода 1N4148, усилитель на TL072, АЦП на Arduino. Проверь статистику на 100 КБ. Если всё в норме — используй.
- Ты делаешь аппаратный генератор для криптографии — два стабилитрона, XOR, постобработка Von Neumann, LDO, металлический корпус. Тестируй 10 МБ через NIST SP 800-22. Не сдавайся, пока не пройдёшь все 15 тестов.
- Ты хочешь встроить в микроконтроллер и не хочешь внешних компонентов — не делай это. Встроенный шум АЦП в ESP32 или STM32 — не надёжен. Он зависит от внутренних помех, температуры, тактовой частоты. Это псевдослучайность. Не доверяй.
- Ты делаешь эксперимент или научный проект — используй стабилитрон, фильтр, и записывай данные с частотой 100 кГц. Сохраняй сырые отсчёты. Это даст тебе данные для анализа спектра, автокорреляции, плотности распределения.
Итог — что делать прямо сейчас
Если ты хочешь генератор случайных чисел на основе шумового диода — сделай это:
- Купи 3 штуки BZX85-C3V3 (стабилитрон 3.3 В).
- Собери схему: диод + 1.5 кОм резистор от 5 В, усилитель на OPA333 с коэффициентом 100, RC-фильтр 1 кОм + 100 нФ.
- Подключи к ESP32. Используй два канала АЦП — подключи два диода.
- Считывай пары отсчётов. Вычисляй разность. XOR-ни их.
- Пропусти через алгоритм Von Neumann (отбрасывай 00 и 11).
- Запиши 1 МБ данных. Запусти
ent— проверь энтропию и корреляцию. - Помести всё в алюминиевый корпус, заземли его.
- Дай прогреться 30 минут. Проверь, что результаты стабильны.
Если энтропия выше 7.99 бит/байт, корреляция ниже 0.01 — ты сделал это правильно. Ты не просто «собрал схему». Ты создал физический источник случайности. И это — не то, что можно купить в магазине. Это твой собственный генератор. И он работает лучше, чем большинство коммерческих решений.
Информация в этой статье носит ознакомительный характер. Применение физических генераторов случайных чисел в криптографических системах требует дополнительной проверки на соответствие стандартам (например, NIST SP 800-90B). Для критически важных приложений всегда консультируйся с экспертом по криптографии.
