AVR Rasgele Sayı Üreticisi


12

TI ( slaa338 ) ' den "gerçek" ("sözde" aksine) rastgele sayılar üretmek için bir teknik açıklayan bir appnote okudum . Bu hedefe ulaşmak için MSP430'un biraz egzotik saat alt sisteminden yararlanır. Herkes "gerçek" rasgele sayılar üretmek için bir AVR (özellikle XMega's ilgileniyorum) üzerinde uygulanabilecek bir teknik biliyor mu?


1
psuedo zar oyunları için rastgele çalışır. Bence kriptografik olarak güvenli istiyor.
Kortuk

2
İhtiyacınız olan uygulama ve / veya tesadüf derecesi hakkında bir ipucu verebilir misiniz? Kriptografi içinse, sadece tohum kalitesinin yanı sıra ek hususlar da vardır. Daha önce yapılmış bazı öneriler - çeşitli türlerdeki çevresel girdileri örneklemek gibi, gereksinimlerinize göre uygun olabilir veya olmayabilir.
Windell Oskay

Yanıtlar:


6

XMega'yı ne kadar kötü kullanıyorsunuz? Kripto ve rasgele sayı üretimi projenizin büyük bir parçasıysa, Atmel'in SecureAVR serisinde yerleşik bir rasgele donanım numarası bulunur ve şifreleme uygulamaları için tasarlanmıştır.

Ne olursa olsun, iyi bir dağılıma sahip rastgele bir tohum kaynağı bulacağınızdan şüpheliyim. Her seferinde farklı bir tohumla başladığınız sürece, bu size rasgele sayılardan oluşan güzel bir set verecektir. Bir LGC hızlı ve kolay bir sahte rastgele jeneratördür:

static unsigned long Seed; 

/* Call before first use of NextVal */
unsigned long InitSeed()
{
   //Your code for random seed here

   // Correct distribution errors in seed
   NextVal();
   NextVal();
   NextVal();
   return NextVal();
}

 /* Linear Congruential Generator 
  * Constants from  
  * "Numerical Recipes in C" 
  * by way of 
   * <http://en.wikipedia.org/wiki/Linear_congruential_generator#LCGs_in_common_use>
   * Note: Secure implementations may want to get uncommon/new LCG values
  */
unsigned long NextVal()
{
  Seed=Seed*1664525L+1013904223L;
  return Seed;
} 

1
Bu harika, SecureAVR hattının var olduğunu fark etmedim, işaretçi için teşekkürler!
vicatcu

BTW: GERÇEKTEN güvenliğe ihtiyacınız varsa, sunduğum basit, etkili ve hızlı LCG yöntemi istediğiniz şey değildir: Birçok LCG kırılabilir; arka arkaya 2-3 değer elde edin ve bunları bilinen sabitler kümesiyle bir LCG jeneratörüne takın - bu Wikipedia sayfasındaki her şeyi içerir. Eşleşen bir desen, saldırganın bir sonraki sayının ne olacağını tahmin etmesini sağlar. Sabitlerin yoktan ne olduğunu anlamak da (ancak daha zor) mümkündür.
Kevin Vermeer

1
@reemrevnivek FYI, Atmel, SecureAVR serisini satıyor ... AVR'nin geliştirme ortamı açısından tamamen farklı bir top oyunu olan kriptografik şeyler istiyorsanız ARM tabanlı 32 bit işlemcilerini tavsiye ediyorlar. Onlarda True RNG'leri olan bir çiftleri var, belki bir gün onlarla oynayacağım.
vicatcu

7

ADC'yi bir donanım gürültü kaynağına bağlayın ve gerekirse rasgele sayıları "beyazlatmak" için yazılım kullanın.

İşte bunu yapan AVR tabanlı bir proje: Leon'un Mini Taşınabilir Rasgele Sayı Üreticisi (mPRNG)

Kriptografik olarak ne kadar güvenli olması gerektiğine bağlı olarak, topraklanmış bir analog girişin gürültüsünü veya " dahili sıcaklık sensörünü " harici donanım yerine rastgele tohum olarak kullanabilirsiniz.

Güncelleme : Daha sonra Arduino için çipin zamanlayıcılarını entropi kaynağı olarak kullanan bir program yazdım (gürültülü bitler kesildiği için ADC işe yaramaz hale geldi) ve bu Entropy kütüphanesinin oluşturulmasına ilham verdi .

Her iki durumda da, rasgelelik, örneğin, sadece yavaş değişen sıcaklık değerinin kendisinden değil , bir okumadan diğerine rastgele değişen en az anlamlı bitlerden kaynaklanmaktadır. Değeri birçok kez okudum, her çıkış biti için bir kez, önceki okuma ile bit kaydırma ve XORing. İlişkilendirilmemiş bir bitle gerçekten rastgele bir bit XORing rastgelelığı korur , böylece rastgele tüm bitlere yayılır ve gerçek beyaz gürültü haline gelir. Bununla birlikte, bit hızınız çok yüksek olmayacaktır, çünkü edinme süresi veya zamanlayıcı döngüsü başına sadece bir bit çıkış alırsınız. Zamanlayıcı yöntemiyle yaklaşık 64 bit / sn alıyordum.


5
(Az ya da çok doğru) bir RNG adını vermek, "-PRNG" talihsiz bir durumdur.
Nick T

ADC için +1, sanırım muhtemelen bir sıcaklık sensöründen daha yüksek bir frekansta değişen bir şey arıyorsunuz.
Ahtapot

1
@Otoptop Sıcaklığı entropi kaynağı olarak kullanmıyorsunuz, sıcaklık sabit olsa bile ADC'yi her okuduğunuzda rastgele değişecek olan gürültülü en az önemli bitleri kullanıyorsunuz. Arduino üzerinde test ettiğimde, bu bitler her zaman 0 idi, bu yüzden uygun değildi ve bunun yerine zamanlayıcı varyasyonunu kullanmak zorunda kaldım. Bu yöntemi kullandığım başka bir MCU'da, ADC'nin LSB'leri gürültülü ve kullanılabilirdi.
Endolit

3

Rastgele bir tohum üretmek için başka bir numara, harici bir olaya kadar saat döngü sayısını saymaktır. Örneğin, bu bir kişi tarafından kullanılacak bir cihazsa, 'git' düğmesine basana kadar saat döngü sayısını sayın ve bunu rastgele tohum olarak kullanın.


4
Bu, bir cihazın kontrolünü sağlayarak içeri girebildikleri için yan kanal saldırılarına karşı çok güvenli olmayabilir, ancak tüm şifrelemelerde olduğu gibi, uygulama uygulanabilirliği belirler.
Kortuk

3

Aynı diziyle yeniden başlatmadığınızdan emin olmak için, eepromda somme bayt kullanıyorum:

#include <avr/eeprom.h>
#include <stdlib.h> // rand

u16  EEMEM randinit; 

int main(void) {
        srand(eeprom_read_word(&randinit));
        eeprom_write_word(&randinit,rand());
        [...]
 }

Bu oldukça iyi bir rastgele verir ve program / bellekte çok pahalı değildir.


2
Bu her seferinde bayt 0'ı okur. Bu baytın rastgele olduğuna dair ne gibi kanıtlarınız var? Eğer öyleyse, bu harika bir teknik!
Kevin Vermeer

Bu kelime (aslında bayt 0 ve 1) rastgele olacaktır, çünkü her başlangıçta rastgele oluşturucuyu içeriği ile başlatırım. Sonra yeni bir rand () ile yüklüyorum. Bir sonraki init şu anki olandan rastgele görünecek ... ve benzeri ... Ama randinit'i ffff'ye (veya 0000?) Sıfırlarsam, aynı randinit dizisine sahip olurum! Yani mükemmel değil. ); I * Hex yüklerken eepromunu silin sigorta hakkında bir uyarı unuttum
jojo l'abricot


2

RandomSeed () gibi bir şey kullanmaya baktınız mı ? - Arduino IDE'de kullanılır

Bu işlevi, atmel AVR üzerinde yüzen (serbest) bir analog pim örneklemek için kullanabilirsiniz, daha sonra bu değeri sahte rasgele sayı işlevi için rasgele bir başlangıç ​​noktası oluşturmak için kullanır (random ().

Random () tarafından oluşturulan değer sahte bir rasgele sayı olabilir - ancak randomSeed () tarafından oluşturulan rasgele başlangıç ​​noktası olabildiğince rastgele bir sayı / değer olmalıdır.


2
Analog pimler gibi şeyleri örneklemek rastgele yakındır, ancak eşit bir dağılımı olmayacaktır. Bununla birlikte, tohumu birkaç kez rastgele çalıştırın ve olacaktır.
Kevin Vermeer

.... bir sahte rasgele sayı üreteci ile bir çift ... <- Bu nasıl kayboldu? NTS: Önce beyne, sonra parmaklara geç.
Kevin Vermeer

Tam olarak - Şifreleme / koruma vb.İçin kullanıldığında en güvenli değil, ancak üretken müzik veya zar oyunları gibi güzel bir rastgele sayı verecektir. Uygulaması da iyi ve kolaydır :)
Jim

1

AVR donanımı ile bunu nasıl yapacağınıza dair bir makale var. Saat titreşimine güvenmeyi içerir. Temel olarak, ayrı bir saat kaynağından ayrılan ayrı bir zamanlayıcının alt bitlerini örneklemek için bir saat kaynağını temel alan bir zamanlayıcı kesmesi kullanırsınız. İki saatin kendileriyle ilişkili rastgele bir titreşimi olacak ve örnekleme mükemmel bir şekilde periyodik olmayacak.

Ben bir STM32 mikrodenetleyici üzerinde bu kavram küçük bir kanıt yaptı, kod github burada . Bir dizi randomizasyon test takımına dayalı olarak bazı iyi sonuçlar elde etti.

Bence bu, saldırması son derece kolay olan bir ADC ile yüzen bir pimi örneklemekten daha iyi olduğunu düşünüyorum (pimi zemine bağlayın ve numaranız artık çok rastgele değil!). Bir saat titreşimi tabanlı RNG'yi manipüle etmenin bir yolu olduğuna eminim, ancak bunu tamamen çipli dahili saat kaynaklarından yola çıkarak yapabileceğimden biraz daha iyi hissetmemi sağlıyor.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.