Я прочитал приложение от TI ( slaa338 ), в котором описана методика генерации «реальных» (в отличие от «псевдо») случайных чисел. Он использует несколько экзотическую подсистему часов MSP430 для достижения этой цели. Кто-нибудь знает метод, который может быть реализован на AVR (меня интересует, в частности, XMega) для генерации «реальных» случайных чисел?
avr
xmega
random-number
vicatcu
источник
источник
Ответы:
Насколько плохо вы используете XMega? Если генерация шифрования и случайных чисел является важной частью вашего проекта, в серию Atmel SecureAVR встроено аппаратное случайное число, и оно предназначено для криптографических приложений.
Несмотря на это, я сомневаюсь, что вы найдете случайный начальный источник с хорошим распределением. Вы захотите запустить его через генератор псевдослучайных чисел несколько раз. Если вы каждый раз начинаете с нового начального числа, это даст вам хороший набор случайных чисел. LGC - это быстрый и простой генератор псевдослучайных данных:
источник
Подключите АЦП к аппаратному источнику шума и используйте программное обеспечение для «отбеливания» случайных чисел, если это необходимо.
Вот проект на основе AVR, который делает это: мини портативный генератор случайных чисел Леона (mPRNG)
В зависимости от того, насколько криптографически он должен быть защищен, вы можете использовать шум заземленного аналогового входа или « внутреннего датчика температуры » в качестве начального числа случайности вместо внешнего оборудования.
Обновление : позже я написал программу для Arduino, которая использует таймеры чипа в качестве источника энтропии (АЦП оказался бесполезным, потому что биты с шумом усекаются), и это вдохновило на создание библиотеки Entropy .
В обоих случаях случайность связана, например, не с самим значением температуры, которое изменяется только медленно, а с младшими значащими битами , которые случайным образом меняются от одного чтения к следующему. Я прочитал значение несколько раз, один раз для каждого бита вывода, сдвига битов и XORing с предыдущим чтением. XOR по-настоящему случайного бита с некоррелированным битом сохраняет случайность , поэтому случайность распространяется на все биты и становится настоящим белым шумом. Тем не менее, ваша скорость передачи данных будет не очень высокой, поскольку вы получаете только один бит вывода за время захвата или цикл таймера. С помощью метода таймера я получил около 64 бит / с.
источник
Еще одна хитрость для генерации случайного начального числа - подсчет количества тактов до появления внешнего события. Например, если это устройство будет использоваться человеком, посчитайте количество тактов, пока он не нажмет кнопку «идти», и используйте его в качестве случайного начального числа.
источник
Чтобы не перезапускать с той же последовательностью, я использую somme byte в eeprom:
Это дает довольно хороший случай, и не стоит много в программе / памяти.
источник
Я создал библиотеку, которая в то время как оригинал, разработанный для Arduino, хорошо работает как класс в реализации C ++, использующей g ++ на avr, но в действительности она недавно была перенесена и на архитектуру ARM.
Он использует джиттер между сторожевым таймером и системными часами и был протестирован на ряде различных чипов (задокументировано на вики-странице).
http://code.google.com/p/avr-hardware-random-number-generation/wiki/WikiAVRentropy
источник
Вы смотрели на использование чего-то вроде randomSeed () ? - используется в Arduino IDE
Вы можете использовать эту функцию для выборки плавающего (свободного) аналогового вывода на AVR Atmel, затем она использует значение для создания произвольной начальной точки для функции псевдослучайных чисел - random ().
Значение, созданное функцией random (), может быть псевдослучайным числом, но произвольная начальная точка, созданная функцией randomSeed (), должна быть настолько же случайным числом / значением, насколько вы можете получить.
источник
Есть документ о том, как этого добиться с помощью оборудования AVR. Это предполагает полагаться на джиттер часов. В основном, вы используете прерывание таймера, основанное на одном источнике синхронизации, для выборки младших бит отдельного таймера, который синхронизируется с отдельным независимым источником синхронизации. Эти два такта будут иметь некоторый случайный джиттер, связанный с ними, и выборка не будет идеально периодической.
Я сделал небольшое доказательство концепции этого на микроконтроллере STM32, код здесь на github . Он получил некоторые хорошие результаты, основанные на наборе тестов рандомизации.
По моему мнению, это лучше, чем выборка плавающего штифта с помощью АЦП, который очень легко атаковать (привязать штырь к земле, и ваш номер больше не будет случайным!). Я уверен, что есть способ манипулировать RNG на основе джиттера тактовых импульсов, но я чувствую себя немного лучше, когда могу делать это исключительно на основе встроенных внутренних тактовых источников.
источник