เครื่องกำเนิดเลขสุ่ม AVR


12

ฉันได้อ่าน appnote จาก TI ( slaa338 ) ที่อธิบายถึงเทคนิคในการสร้างตัวเลข "เป็นของจริง" (ตรงข้ามกับ "สุ่ม") มันใช้ประโยชน์จากระบบย่อยนาฬิกาที่ค่อนข้างแปลกใหม่ของ MSP430 เพื่อให้บรรลุเป้าหมายนี้ ไม่มีใครรู้เทคนิคที่สามารถนำไปใช้กับ AVR (ฉันสนใจ XMega โดยเฉพาะ) เพื่อสร้างตัวเลขสุ่ม "สำหรับ" จริงหรือไม่?


1
psuedo สุ่มใช้สำหรับเกมลูกเต๋า ฉันคิดว่าเขาต้องการระบบเข้ารหัสที่ปลอดภัย
Kortuk

2
คุณสามารถให้คำแนะนำเกี่ยวกับแอปพลิเคชันและ / หรือระดับการสุ่มที่คุณต้องการได้หรือไม่? หากเป็นการเข้ารหัสมีข้อควรพิจารณาเพิ่มเติมนอกเหนือจากคุณภาพของเมล็ดพันธุ์ คำแนะนำบางข้อที่ทำไว้แล้ว - เช่นการสุ่มตัวอย่างปัจจัยแวดล้อมด้านสิ่งแวดล้อมประเภทต่างๆอาจหรืออาจไม่เหมาะสมตามความต้องการของคุณ
Windell Oskay

คำตอบ:


6

คุณใช้ XMega นั้นแย่แค่ไหน? หากการเข้ารหัสลับและการสร้างตัวเลขสุ่มเป็นส่วนสำคัญของโครงการของคุณชุดSecureAVRของ Atmel มีหมายเลขฮาร์ดแวร์แบบสุ่มในตัวและออกแบบมาสำหรับแอปพลิเคชันเข้ารหัสลับ

โดยไม่คำนึงถึงฉันสงสัยว่าคุณจะพบแหล่งเมล็ดสุ่มที่มีการกระจายที่ดี คุณจะต้องการเรียกใช้มันผ่านตัวสร้างตัวเลขสุ่มหลอกกี่ครั้งตราบใดที่คุณเริ่มต้นด้วยเมล็ดที่แตกต่างกันทุกครั้งสิ่งนี้จะทำให้คุณมีตัวเลขสุ่มที่ดี LGC เป็นเครื่องกำเนิดไฟฟ้าแบบหลอกเทียมที่ง่ายและรวดเร็ว:

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
นั่นเป็นสิ่งที่ยอดเยี่ยมฉันไม่ทราบว่ามีสาย SecureAVR อยู่ขอบคุณสำหรับตัวชี้!
vicatcu

BTW: หากคุณต้องการความปลอดภัยจริงๆวิธี LCG ที่เรียบง่ายมีประสิทธิภาพและรวดเร็วที่ฉันนำเสนอไม่ใช่สิ่งที่คุณต้องการ: LCG จำนวนมากสามารถถูกทำลายได้ เพียงแค่รับค่า 2-3 ค่าติดต่อกันแล้วเสียบเข้ากับเครื่องกำเนิด LCG พร้อมค่าคงที่ที่รู้จัก - ซึ่งจะรวมทุกอย่างไว้ในหน้า Wikipedia รูปแบบการจับคู่จะช่วยให้ผู้โจมตีทำนายหมายเลขถัดไปได้ เป็นไปได้ (แต่ยากขึ้น) ในการค้นหาว่าค่าคงที่นั้นมาจากอะไรเช่นกัน
Kevin Vermeer

1
@reemrevnivek FYI, Atmel ขายสาย SecureAVR ของพวกเขา ... พวกเขาแนะนำหน่วยประมวลผล 32 บิตแบบ ARM หากคุณต้องการสิ่งที่เข้ารหัสลับซึ่งเป็น ballgame ที่แตกต่างกันทั้งในแง่ของสภาพแวดล้อมการพัฒนาจาก AVR พวกเขามีคู่กับ True RNGs อยู่ด้วยบางทีฉันอาจจะเล่นกับพวกเขาสักวัน
vicatcu

7

เชื่อมต่อ ADC เข้ากับแหล่งกำเนิดเสียงรบกวนของฮาร์ดแวร์และใช้ซอฟต์แวร์เพื่อ "ทำให้ขาว" ตัวเลขสุ่มหากจำเป็น

นี่คือโครงการที่ใช้ AVR ซึ่งทำเช่นนี้: เครื่องสร้างจำนวนสุ่มพกพาขนาดเล็กของ Leon (mPRNG)

คุณสามารถใช้เสียงของอินพุตแบบอะนาล็อกที่มีสายกราวด์หรือ " เซ็นเซอร์อุณหภูมิภายใน " ขึ้นอยู่กับความปลอดภัยของการเข้ารหัสที่ต้องใช้รหัสลับแทนการใช้ฮาร์ดแวร์ภายนอก

ปรับปรุง : ผมเขียนโปรแกรมสำหรับ Arduino ที่ใช้จับเวลาชิปที่เป็นแหล่งเอนโทรปี (ADC หันออกจะไร้ประโยชน์เพราะมีเสียงดังบิตจะถูกตัดทอน) และแรงบันดาลใจในการสร้างห้องสมุดเอนโทรปี

ในทั้งสองกรณีการสุ่มนั้นไม่ได้มาจากค่าอุณหภูมิซึ่งเปลี่ยนแปลงอย่างช้าๆ แต่จากบิตที่สำคัญน้อยที่สุดซึ่งแตกต่างกันแบบสุ่มจากการอ่านหนึ่งไปยังอีก ฉันอ่านค่าหลาย ๆ ครั้งหนึ่งครั้งสำหรับแต่ละบิตของเอาต์พุตบิตการเลื่อนและ XORing ด้วยการอ่านก่อนหน้า XOR บิตสุ่มอย่างแท้จริงด้วยบิต uncorrelated รักษาแบบสุ่มดังนั้นการสุ่มกระจายไปทั่วทุกบิตและกลายเป็นเสียงสีขาวจริง อัตราบิตของคุณจะไม่สูงมากเนื่องจากคุณจะได้รับหนึ่งบิตต่อการได้มาซึ่งเวลาหรือรอบการจับเวลา ด้วยวิธีการจับเวลาฉันได้รับประมาณ 64 บิต / วินาที


5
การตั้งชื่อ (มากหรือน้อยจริง) RNG "-PRNG" เป็นเรื่องที่โชคร้าย
Nick T

+1 สำหรับ ADC ฉันคิดว่าคุณอาจกำลังมองหาบางสิ่งที่เปลี่ยนแปลงด้วยความถี่ที่สูงกว่าเซ็นเซอร์อุณหภูมิ
Octopus

1
@ Octopus คุณไม่ได้ใช้อุณหภูมิเป็นแหล่งพลังงานแบบเอนโทรปีคุณใช้บิตที่มีความสำคัญน้อยที่สุดซึ่งมีเสียงดังจะเปลี่ยนแบบสุ่มทุกครั้งที่คุณอ่าน ADC แม้ว่าอุณหภูมิจะคงที่ก็ตาม เมื่อฉันทดสอบบน Arduino แม้ว่าบิตเหล่านี้จะเป็น 0 เสมอดังนั้นมันจึงไม่เป็นไปได้และฉันต้องใช้รูปแบบตัวจับเวลาแทน ในอีก MCU ที่ฉันใช้วิธีการนั้น LSB ของ ADC นั้นมีเสียงดังและใช้งานได้
endolith

3

เคล็ดลับอีกประการสำหรับการสร้างเมล็ดสุ่มคือการนับจำนวนรอบสัญญาณนาฬิกาจนถึงเหตุการณ์ภายนอก ตัวอย่างเช่นถ้านี่คืออุปกรณ์ที่บุคคลจะใช้ให้นับจำนวนรอบสัญญาณนาฬิกาจนกว่าเขาจะกดปุ่ม 'ไป' และใช้มันเป็นเมล็ดสุ่ม


4
สิ่งนี้อาจไม่ปลอดภัยมากต่อการโจมตีช่องทางด้านข้างเนื่องจากสามารถบุกเข้ามาได้โดยการควบคุมอุปกรณ์เพียงตัวเดียว แต่เช่นเดียวกับการเข้ารหัสทั้งหมดแอปพลิเคชั่นจะพิจารณาความเป็นไปได้
Kortuk

3

เพื่อให้แน่ใจว่าจะไม่รีสตาร์ทด้วยลำดับเดียวกันฉันใช้ somme byte ใน eeprom:

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

u16  EEMEM randinit; 

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

สิ่งนี้ให้การสุ่มค่อนข้างดีและไม่มีค่าใช้จ่ายมากในโปรแกรม / หน่วยความจำ


2
สิ่งนี้อ่าน 0 ไบต์ทุกครั้ง คุณมีหลักฐานอะไรที่บอกว่าไบต์นี้เป็นแบบสุ่ม? ถ้าเป็นเช่นนี้เป็นเทคนิคที่ยอดเยี่ยม!
Kevin Vermeer

คำนี้ (byte 0 & 1 อันที่จริง) จะเป็นแบบสุ่มเพราะทุกครั้งที่เริ่มต้นฉันจะเริ่มต้นตัวสร้างแบบสุ่มด้วยเนื้อหาของมัน จากนั้นฉันอัพโหลดด้วยแรนด์ใหม่ () ดังนั้น init ต่อไปจะดูสุ่มจากอันปัจจุบัน ... และต่อไป ... แต่ถ้าฉันรีเซ็ต randinit เป็น ffff (หรือ 0000?) ฉันจะมีลำดับ randinit เหมือนกัน! ดังนั้นจึงไม่สมบูรณ์ ฉันลืมคำเตือนเกี่ยวกับฟิวส์ที่ลบ eeprom เมื่ออัพโหลด * .hex;)
jojo l'abricot

3

ฉันได้สร้างห้องสมุดที่ในขณะที่ต้นฉบับที่ออกแบบมาสำหรับ Arduino ทำงานได้ดีเช่นเดียวกับคลาสในการนำ C ++ ไปใช้โดยใช้ g ++ บน avr แน่นอนว่าเมื่อเร็ว ๆ นี้เพิ่งได้รับการส่งต่อไปยังสถาปัตยกรรม ARM ด้วยเช่นกัน

มันใช้การกระวนกระวายใจระหว่างตัวจับเวลาจ้องจับผิดและนาฬิการะบบและได้รับการทดสอบบนชิปที่แตกต่างกันจำนวนมาก (บันทึกไว้ในหน้า wiki)

http://code.google.com/p/avr-hardware-random-number-generation/wiki/WikiAVRentropy


2

คุณดูที่ใช้บางสิ่งเช่นrandomSeed ()หรือไม่ - ใช้ใน Arduino IDE

คุณสามารถใช้ฟังก์ชั่นนี้เพื่อสุ่มตัวอย่างอะนาล็อกลอยตัว (ฟรี) บน atmel AVR จากนั้นใช้ค่าเพื่อสร้างจุดเริ่มต้นโดยพลการสำหรับฟังก์ชันตัวเลขสุ่มหลอก - สุ่ม ()

ค่าที่สร้างขึ้นโดย random () อาจเป็นตัวเลขสุ่มหลอก - แต่จุดเริ่มต้นที่สร้างขึ้นโดย randomSeed () ควรเป็นจำนวนสุ่ม / ค่าที่แท้จริงเท่าที่คุณจะได้รับ


2
การสุ่มตัวอย่างเช่นหมุดแบบอะนาล็อกนั้นใกล้เคียงกับการสุ่ม แต่จะไม่มีการแจกแจงแบบสม่ำเสมอ วิ่งเมล็ดผ่านการสุ่มสองสามครั้งและมันจะ
Kevin Vermeer

.... ผ่านตัวสร้างตัวเลขสุ่มหลอกคู่ ... <- มันหายไปได้อย่างไร NTS: เริ่มสมองก่อนจากนั้นจึงใช้นิ้วมือ
Kevin Vermeer

แน่นอน - มันยังไม่ปลอดภัยที่สุดหากใช้สำหรับการเข้ารหัส / ป้องกัน ฯลฯ แต่จะให้หมายเลขสุ่มที่ดีสำหรับเพลงทั่วไปหรือเกมลูกเต๋า เป็นเรื่องที่ดีและง่ายต่อการใช้มากเกินไป :)
จิม

1

มีบทความเกี่ยวกับวิธีการบรรลุสิ่งนี้ด้วยฮาร์ดแวร์ AVR มันเกี่ยวข้องกับการพึ่งพากระวนกระวายใจนาฬิกา โดยพื้นฐานแล้วคุณใช้ตัวจับเวลาอินเทอร์รัปต์ซึ่งอ้างอิงจากแหล่งสัญญาณนาฬิกาหนึ่งแหล่งเพื่อสุ่มตัวอย่างบิตที่ต่ำกว่าของตัวจับเวลาแยกต่างหากซึ่งถูกโอเวอร์คล็อกแหล่งสัญญาณนาฬิกาอิสระแยกต่างหาก นาฬิกาสองเรือนจะมีความกระวนกระวายใจแบบสุ่มบางส่วนที่เกี่ยวข้องกับพวกเขาและการสุ่มตัวอย่างจะไม่เป็นระยะอย่างสมบูรณ์แบบ

ผมหลักฐานเล็ก ๆ ของแนวคิดนี้บนไมโครคอนโทรลเลอร์ STM32 รหัสเป็นบน GitHub ที่นี่ มันได้ผลลัพธ์ที่ดีตามชุดของชุดการทดสอบแบบสุ่ม

ในความคิดของฉันฉันคิดว่านี่เป็นสิ่งที่ดีกว่าการสุ่มตัวอย่างหมุดลอยด้วย ADC ซึ่งง่ายต่อการโจมตี (ผูกขาลงกับพื้นและหมายเลขของคุณจะไม่สุ่มอีกต่อไป!) ฉันแน่ใจว่ามีวิธีจัดการ RNG ที่กระวนกระวายใจตามนาฬิกา แต่มันทำให้ฉันรู้สึกดีขึ้นเล็กน้อยที่ฉันสามารถทำสิ่งนี้ได้อย่างหมดจดโดยอิงจากแหล่งสัญญาณนาฬิกาภายในชิป

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.