Генератори випадкових чисел за допомогою штифта GPIO?


22

Я щойно прочитав питання про генератор випадкових чисел AVR і зіткнувся з кількома способами генерування випадкових насінин в AVR:

  • Використовуйте спеціальний "Захищений AVR"
  • Використовуйте внутрішній датчик температури
  • Читайте неписаний EEPROM
  • Виміряйте інтервали часу між введеннями користувача
  • Використовуйте плаваючий штифт АЦП.

Чому б не просто один цифровий контакт, налаштований як вхід без підтягування та плаваючого? Теоретично, це повинно генерувати потік випадкових бітів. Чому б не використати це? Чи занадто повільно змінюється держава? Це, як правило, застрягає в 1 або 0? Будь-які інші проблеми?


1
Безпечний AVR мертвий AFAIK
vicatcu

1
Чи не неписаний eeprom завжди 0xFF?
vsz

@vsz, можливо, якщо ти щось напишеш до нього і забудеш те, що написав, зараз це "випадково". Лол.
Vorac

Відповіді:


5

"Випадковий" - хитре слово. У деяких контекстах це просто означає "непередбачуваний", але в інших контекстах - зокрема, тих, що пов'язані з обробкою сигналів та криптографією - він означає "статистично некорельований".

Навіть якщо значення, прочитане з плаваючого штифта, є непередбачуваним ("випадковий" у першому сенсі), воно, ймовірно, не буде корисним у другому значенні.


15

Самоочевидна різниця між використанням цифрового входу та аналоговим полягає в тому, що можливий більший проміжок значень насіння в аналоговому.

По-друге, але, можливо, більш важливо: якщо плаваюче "медіанне" значення цифрового штифта не буде точно посередині між рівнями логічного сенсу (які не є потужністю та рівнем наземної рейки, а пороговими значеннями перемикання для вхідної схеми), отриманий бітовий потік матиме сильний ухил до 1 або 0. Цей зміщення перекошує насіння набагато сильніше, ніж косий аналоговий рівень.

Потрібно було б дуже мало з'єднання, або від сусідніх слідів чи сигналів, або через резистивний підтягування / висунення, спроектоване чи випадкове, щоб штовхнути "плаваючий" цифровий штифт на розблокування - і це може так само статися після розгортання. При розробці будь-якої конструкції найкраще уникати такої форми відмови.


14

Плаваючий вхід не визначено. Це може давати вам випадкові біти, але воно також може затримуватися на рівні 0 або 1. Більшість часу воно застрягне. І коли він справді плаває, це може спричинити підвищений шум системи та енергоспоживання. Плаваючі входи - це взагалі погана річ, навіть коли входи не використовуються ні для чого.


Він не тільки застрягне в 0 або 1 деякий час, але, якщо два транзистори, що складають першу ступінь вхідного буфера, будуть ДОВЕРШЕНО врівноважені, або є якийсь зовнішній джерело струму на шляху чи іншого, вхід буде плавати до 1 або вниз до 0.
wjl

9

Найпростішим рішенням є побудова апаратної схеми генератора випадкових сигналів із неправильно використаних транзисторних ланцюгів відкритого колектора. Використовуйте вихідний потік на вхід мікроконтролера. Відбирайте проби вхідних бітів з інтервалом. Щоб забезпечити приблизно парне число 1s і 0s, просто використовуйте зміну стану як 1, а не зміну як нуль. Генератор шуму Google для транзистора для отримання додаткової інформації.


Цікаво. Як виглядає "неправильно використаний транзисторний ланцюг відкритого колектора"?
Стівен Коллінгз

7
@Remiel - Ви зворотно зміщуєте базовий випромінювальний перехід транзистора, і він діє як справді хитрий ценер. Ви берете дуже шумний ценер, і ви підсилюєте шум, щоб отримати випадковий потік. Дивіться robseward.com/misc/RNG2
Connor Wolf

3

Один випадковий генератор, який є у багатьох мікроконтролерів, - це помилка між двома тактовими джерелами (можливо, одним внутрішнім та іншим зовнішнім). Якщо порівнювати їх, вони незначно дрейфують через шум, який можна використовувати.

Зрештою це залежить, для чого це потрібно? Трохи рандомізації, і ви навіть можете використовувати контактний АЦП, підключений ні до чого. Або просто використовувати такий алгоритм

Mersenne twister http://en.wikipedia.org/wiki/Mersenne_twister

Ні, якщо це криптографічно безпечно, але досить добре для більшості цілей.


саме такий підхід застосовується в примітці програми msp430 у
згаданому

Правильно. Це все одно має бути можливо зробити з тим же джерелом годинника, навіть якщо це не підтримується безпосередньо.
Густаво Литовський

3

Якість випадкового насіння та його алгоритм визначається кількістю ентропії або невизначеності у кожному випадковому біті. Тоді найкращий генератор насіння використовує високу ентропію з дуже невеликими кроками, а не багатьма кроками низької ентропії.

Хороший приклад високої ентропії використовує метод латинських квадратів для випадкового насіння.

Плаваючий вхід легко зміщується через дефекти, витік або шум, що потрапляє.


0

У мікропроцесорі PIC18F потрібно мати насіння для випадкового числа. Насіння може бути будь-яким від 0 до 32767 (15 біт). Я б запропонував на початку програми зробити один із штифтів та аналоговий вхідний штифт. Прочитайте цей штифт і візьміть найменш значущий біт і покладіть його в 16-бітну змінну. Потім змістіть змінну вліво на 1. Прочитайте ще раз контакт і покладіть LSB результату АЦП в перший біт змінної, в який ви зберегли останній біт. Знову зсуньте ліворуч .....

Повторіть це, доки у вашій змінній не буде 15 біт. Це число, яке потрібно ввести у насіння.

Після цього ви можете просто зробити аналоговий вхідний штифт цифровим вхідним штифтом і ввімкнути слабке підтягування на ньому або зробити його цифровим вихідним штифтом. Будь-хто не зупинить цей штифт плавати.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.