Bộ tạo số ngẫu nhiên AVR


12

Tôi đã đọc một chú thích từ TI ( slaa338 ) mô tả một kỹ thuật tạo số ngẫu nhiên "thực" (trái ngược với "giả"). Nó khai thác hệ thống con đồng hồ hơi kỳ lạ của MSP430 để đạt được mục tiêu này. Có ai biết về một kỹ thuật có thể được thực hiện trên một AVR (đặc biệt là tôi quan tâm đến XMega) để tạo ra các số ngẫu nhiên "thực" không?


1
psuedo ngẫu nhiên làm việc cho các trò chơi súc sắc. Tôi nghĩ rằng anh ấy muốn bảo mật bằng mật mã.
Kortuk

2
Bạn có thể đưa ra một gợi ý về ứng dụng và / hoặc mức độ ngẫu nhiên mà bạn yêu cầu không? Nếu đó là về mật mã, có những cân nhắc bổ sung bên cạnh chất lượng hạt giống. Một số đề xuất đã được đưa ra - như lấy mẫu đầu vào môi trường thuộc nhiều loại khác nhau có thể hoặc không phù hợp dựa trên yêu cầu của bạn.
Windell Oskay

Câu trả lời:


6

Làm thế nào xấu để bạn sử dụng XMega? Nếu tiền điện tử và tạo số ngẫu nhiên là một phần lớn trong dự án của bạn, chuỗi SecureAVR của Atmel có số ngẫu nhiên phần cứng được tích hợp và được thiết kế cho các ứng dụng mã hóa.

Bất kể, tôi nghi ngờ rằng bạn sẽ tìm thấy một nguồn giống ngẫu nhiên có phân phối tốt. Bạn sẽ muốn chạy nó thông qua một trình tạo số ngẫu nhiên giả vài lần Miễn là bạn bắt đầu với một hạt giống khác nhau mỗi lần, điều này sẽ cung cấp cho bạn một bộ số ngẫu nhiên đẹp. LGC là một trình tạo ngẫu nhiên giả nhanh chóng và dễ dàng:

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
Điều đó thật tuyệt vời, tôi đã không nhận ra dòng SecureAVR tồn tại, cảm ơn vì con trỏ!
Abbeyatcu

BTW: Nếu bạn THỰC SỰ cần bảo mật, phương pháp LCG đơn giản, hiệu quả và nhanh chóng mà tôi đã trình bày không phải là điều bạn muốn: Nhiều LCG có thể bị phá vỡ; chỉ cần nhận 2-3 giá trị liên tiếp và cắm chúng vào trình tạo LCG với một bộ hằng số đã biết - điều này sẽ bao gồm mọi thứ trên trang Wikipedia. Một mô hình phù hợp sẽ cho phép kẻ tấn công dự đoán số tiếp theo sẽ là gì. Cũng có thể (nhưng khó hơn) để tìm ra hằng số là gì từ không.
Kevin Vermeer

1
@reemrevnivek FYI, Atmel đang bán dòng SecureAVR của họ ... họ khuyên dùng bộ xử lý 32 bit dựa trên ARM của họ nếu bạn muốn công cụ mã hóa hoàn toàn khác biệt về môi trường phát triển từ AVR. Họ thực sự có một cặp với RNG thật, có lẽ tôi sẽ chơi với họ một ngày nào đó.
Abbeyatcu

7

Kết nối ADC với nguồn nhiễu phần cứng và sử dụng phần mềm để "làm trắng" các số ngẫu nhiên nếu cần.

Đây là một dự án dựa trên AVR thực hiện điều này: Trình tạo số ngẫu nhiên di động nhỏ của Leon (mPRNG)

Tùy thuộc vào mức độ an toàn của mật mã cần phải có, bạn có thể sử dụng tiếng ồn của đầu vào tương tự có căn cứ hoặc " cảm biến nhiệt độ bên trong " làm hạt giống ngẫu nhiên thay vì phần cứng bên ngoài.

Cập nhật : Sau đó tôi đã viết một chương trình cho Arduino sử dụng bộ định thời của chip làm nguồn entropy (ADC hóa ra là vô dụng vì các bit nhiễu bị cắt bớt) và điều này đã truyền cảm hứng cho việc tạo ra thư viện Entropy .

Trong cả hai trường hợp, tính ngẫu nhiên không phải từ, ví dụ, chính giá trị nhiệt độ, chỉ thay đổi chậm, mà từ các bit có ý nghĩa nhỏ nhất , thay đổi ngẫu nhiên từ lần đọc này sang lần đọc tiếp theo. Tôi đọc giá trị nhiều lần, một lần cho mỗi bit đầu ra, bẻ khóa và XOR với lần đọc trước. XOR một bit thực sự ngẫu nhiên với một bit không tương thích sẽ duy trì tính ngẫu nhiên , do đó tính ngẫu nhiên được lan truyền đến tất cả các bit và nó trở thành nhiễu trắng thực sự. Tuy nhiên, tốc độ bit của bạn sẽ không cao lắm, vì bạn chỉ nhận được một bit đầu ra cho mỗi lần mua hoặc chu kỳ hẹn giờ. Với phương pháp hẹn giờ, tôi đã nhận được khoảng 64 bit / s.


5
Đặt tên RNG (ít nhiều đúng), "-PRNG" là không may.
Nick T

+1 cho ADC, tôi nghĩ có lẽ bạn đang tìm kiếm thứ gì đó thay đổi ở tần số cao hơn cảm biến nhiệt độ.
Bạch tuộc

1
@Octopus Chà, bạn không sử dụng nhiệt độ làm nguồn entropy, bạn đang sử dụng các bit ít nhiễu nhất, sẽ thay đổi ngẫu nhiên mỗi khi bạn đọc ADC ngay cả khi nhiệt độ không đổi. Tuy nhiên, khi tôi thử nghiệm trên Arduino, các bit này luôn là 0, vì vậy nó không khả thi và tôi phải sử dụng biến thể hẹn giờ thay thế. Trên một MCU khác tôi đã sử dụng phương pháp đó, các LSB của ADC rất ồn và có thể sử dụng được.
endolith

3

Một mẹo khác để tạo một hạt giống ngẫu nhiên, là đếm số chu kỳ đồng hồ cho đến khi có một sự kiện bên ngoài. Ví dụ: nếu đây là thiết bị được sử dụng bởi một người, hãy đếm số chu kỳ đồng hồ cho đến khi anh ta nhấn nút 'go' và sử dụng nó làm hạt giống ngẫu nhiên.


4
Điều này có thể không an toàn trước các cuộc tấn công kênh bên vì chúng có thể đột nhập bằng cách đảm bảo kiểm soát một thiết bị, nhưng như với tất cả mật mã, ứng dụng xác định tính khả thi.
Kortuk

3

Để chắc chắn không khởi động lại với cùng một chuỗi, tôi sử dụng somme byte trong 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());
        [...]
 }

Điều này mang lại sự ngẫu nhiên khá tốt và không tốn nhiều chi phí trong chương trình / bộ nhớ.


2
Điều này đọc byte 0 mỗi lần. Bằng chứng nào bạn có rằng byte này là ngẫu nhiên? Nếu có, đây là một kỹ thuật tuyệt vời!
Kevin Vermeer

Từ này (thực tế là byte 0 & 1) sẽ là ngẫu nhiên, vì mỗi lần khởi động tôi đều khởi tạo trình tạo ngẫu nhiên với nội dung của nó. THÌ tôi tải nó lên với một rand mới (). Vì vậy, init tiếp theo sẽ trông ngẫu nhiên từ phiên bản hiện tại ... và cứ thế ... Nhưng nếu tôi đặt lại randinit thành ffff (hoặc 0000?), Tôi sẽ có trình tự randinit tương tự! Vì vậy, nó không hoàn hảo. Tôi đã quên một cảnh báo về cầu chì đã xóa eeprom khi tải lên * .hex;)
jojo l'ovenot

3

Tôi đã tạo một thư viện mà mặc dù thiết kế ban đầu cho Arduino hoạt động tốt như một lớp trong triển khai C ++ bằng g ++ trên avr, nhưng thực sự gần đây nó cũng đã được chuyển sang kiến ​​trúc ARM.

Nó sử dụng jitter giữa bộ đếm thời gian theo dõi và đồng hồ hệ thống và đã được thử nghiệm trên một số chip khác nhau (tài liệu trên trang wiki)

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


2

Bạn đã xem xét việc sử dụng cái gì đó như RandomSeed () chưa? - được sử dụng trong Arduino IDE

Bạn có thể sử dụng chức năng này để lấy mẫu pin tương tự trôi nổi (miễn phí) trên atmel AVR, sau đó sử dụng giá trị để tạo điểm bắt đầu tùy ý cho giả số ngẫu nhiên - ngẫu nhiên ().

Giá trị được tạo bởi Random () có thể là số ngẫu nhiên giả - nhưng điểm bắt đầu tùy ý được tạo bởi RandomSeed () phải là số thực / giá trị ngẫu nhiên như bạn có thể nhận được.


2
Lấy mẫu những thứ như các chân tương tự gần với ngẫu nhiên, nhưng sẽ không có phân phối đồng đều. Chạy hạt giống ngẫu nhiên một vài lần, tuy nhiên, và nó sẽ.
Kevin Vermeer

.... thông qua một trình tạo số ngẫu nhiên giả một cặp ... <- Làm thế nào mà mất tích? NTS: Tham gia não trước, sau đó là ngón tay.
Kevin Vermeer

Chính xác - Nó cũng không an toàn nhất nếu sử dụng nó để mã hóa / bảo vệ, v.v., nhưng nó sẽ cung cấp cho bạn một số ngẫu nhiên tốt đẹp cho những thứ như âm nhạc hào phóng hoặc trò chơi súc sắc. Thật tốt và dễ thực hiện quá :)
Jim

1

Có một tờ giấy về cách đạt được điều này với phần cứng AVR. Nó liên quan đến việc dựa vào jitter đồng hồ. Về cơ bản, bạn sử dụng ngắt hẹn giờ dựa trên một nguồn đồng hồ để lấy mẫu các bit thấp hơn của bộ định thời riêng biệt được tắt nguồn nguồn đồng hồ độc lập riêng biệt. Hai đồng hồ sẽ có một số jitter ngẫu nhiên liên quan đến chúng và việc lấy mẫu sẽ không hoàn toàn định kỳ.

Tôi đã làm một bằng chứng nhỏ về khái niệm này trên một vi điều khiển STM32, mã trên github ở đây . Nó nhận được một số kết quả tốt dựa trên một bộ các bộ thử nghiệm ngẫu nhiên.

Theo ý kiến ​​của tôi, tôi nghĩ rằng điều này tốt hơn so với việc lấy mẫu pin nổi bằng ADC cực kỳ dễ tấn công (buộc pin xuống đất và số của bạn không còn quá ngẫu nhiên nữa!). Tôi chắc chắn có một cách để điều khiển RNG dựa trên jitter đồng hồ, nhưng nó giúp tôi cảm thấy tốt hơn một chút rằng tôi có thể làm điều này hoàn toàn dựa trên các nguồn đồng hồ bên trong chip.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.