AVR 난수 생성기


12

TI ( slaa338 )에서 "실수"( "의사"가 아닌) 난수를 생성하는 기술을 설명 하는 appnote를 읽었습니다 . 이 목표를 달성하기 위해 MSP430의 다소 이국적인 클럭 서브 시스템을 이용합니다. 누구든지 "실제"난수를 생성하기 위해 AVR (특히 XMega에 관심이 있습니다)에서 구현할 수있는 기술을 알고 있습니까?


1
psuedo는 주사위 게임에 무작위로 작동합니다. 그는 암호로 안전한 것을 원한다고 생각합니다.
Kortuk

2
응용 프로그램 및 / 또는 필요한 임의성 정도에 대한 힌트를 줄 수 있습니까? 암호화의 경우 시드 품질 외에 추가로 고려해야 할 사항이 있습니다. 다양한 유형의 환경 입력 샘플링과 같이 이미 작성된 제안 중 일부는 요구 사항에 따라 적절하지 않을 수 있습니다.
Windell Oskay

답변:


6

XMega를 얼마나 사용하지 않습니까? 암호화 및 난수 생성이 프로젝트의 큰 부분 인 경우 Atmel의 SecureAVR 시리즈에는 하드웨어 난수가 내장되어 있으며 암호화 응용 프로그램을 위해 설계되었습니다.

그럼에도 불구하고, 당신은 좋은 분포를 가진 무작위 시드 소스를 찾을 것입니다. 의사 난수 생성기를 몇 번 실행하고 싶을 때마다 다른 시드로 시작할 때마다 멋진 난수 집합이 제공됩니다. 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 페이지의 모든 항목이 포함됩니다. 일치하는 패턴을 통해 공격자는 다음 숫자를 예측할 수 있습니다. 상수가 무엇인지 알아내는 것이 가능하지만 (더 어렵습니다).
케빈 베르메르

1
@reemrevnivek 참고로 Atmel은 SecureAVR 제품군을 판매하고 있습니다 .AVR의 개발 환경과 완전히 다른 볼 게임 인 암호화를 원할 경우 ARM 기반 32 비트 프로세서를 권장합니다. 그들은 그들에게 True RNGs와 커플을 가지고 있습니다. 어쩌면 나는 그들과 언젠가 함께 놀 것입니다.
vicatcu

7

ADC를 하드웨어 노이즈 소스에 연결하고 소프트웨어를 사용하여 난수를 "미백"합니다.

이를 수행하는 AVR 기반 프로젝트는 다음과 같습니다. Leon의 Mini Portable Random Number Generator (mPRNG)

암호화로 얼마나 안전하게 보호해야하는지에 따라 외부 아날로그 대신 접지 된 아날로그 입력 또는 " 내부 온도 센서 " 노이즈를 랜덤 시드로 사용할 수 있습니다.

업데이트 : 나중에 쓴 칩의 타이머를 사용 아두 이노를위한 프로그램 엔트로피 소스 (ADC가 시끄러운 비트가 잘립니다 때문에 쓸모없는 것으로 판명)로, 그리고이의 창조 영감을 엔트로피 라이브러리를 .

두 경우 모두, 랜덤 성은 예를 들어 온도 값 자체에서 느리게 변하는 것이 아니라 최하위 비트 에서 읽히는 것입니다. 이전 읽기에서 각 비트의 출력, 비트 시프 팅 및 XORing에 대해 값을 여러 번 읽습니다. 상관 관계가없는 비트를 사용하여 진정한 임의의 비트를 XOR 하면 임의성이 유지 되므로 임의성이 모든 비트로 확산되어 진정한 화이트 노이즈가됩니다. 그러나 획득 시간 또는 타이머주기 당 1 비트의 출력 만 얻을 수 있으므로 비트 전송률은 그리 높지 않습니다. 타이머 방법으로 약 64 비트 / s를 얻었습니다.


5
"-PRNG"는 (실제로) RNG를 명명하는 것은 불행합니다.
Nick T

ADC의 경우 +1, 아마도 온도 센서보다 더 높은 주파수에서 변화하는 것을 찾고 있다고 생각합니다.
Octopus

1
@Octopus 엔트로피 소스로 온도를 사용하지 않고, 잡음이 가장 적은 비트를 사용하고 있습니다. 온도가 일정하더라도 ADC를 읽을 때마다 무작위로 변경됩니다. Arduino에서 테스트 할 때이 비트는 항상 0이므로 실행할 수 없었으며 대신 타이머 변형을 사용해야했습니다. 다른 MCU에서이 방법을 사용했을 때 ADC의 LSB는 잡음이 많고 사용할 수있었습니다.
endolith

3

랜덤 시드를 생성하는 또 다른 트릭은 외부 이벤트까지의 클록주기 수를 계산하는 것입니다. 예를 들어, 이것이 개인이 사용하는 장치 인 경우, 'go'버튼을 누를 때까지 클럭 사이클 수를 세어 무작위 시드로 사용하십시오.


4
이는 하나의 장치를 제어하여 침입 할 수있는 사이드 채널 공격에 대해 안전하지 않을 수 있지만 모든 암호화와 마찬가지로 응용 프로그램은 실행 가능성을 결정합니다.
Kortuk

3

동일한 순서로 다시 시작하지 않으려면 eeprom에서 somme 바이트를 사용하십시오.

#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 1

이 단어 (실제로는 0 및 1 바이트)는 임의의 것입니다. 매번 시작할 때마다 임의의 생성기를 내용으로 초기화하기 때문입니다. 그런 다음 새 rand ()로 업로드합니다. 그래서 다음 init은 현재 것과 무작위로 보일 것입니다 ... 등등 ...하지만 randinit를 ffff (또는 0000?)로 재설정하면 동일한 randinit 시퀀스를 갖게됩니다! 완벽하지 않습니다. * .hex를 업로드 할 때 eeprom을 지우는 퓨즈에 대한 경고를 잊었습니다.)
jojo l' abricot

3

Arduino 용으로 설계된 원래 라이브러리는 avr에서 g ++을 사용하여 C ++ 구현의 클래스로 잘 작동하지만 실제로는 최근 ARM 아키텍처로 포팅 된 라이브러리를 만들었습니다.

워치 독 타이머와 시스템 클럭 사이의 지터를 사용하며 여러 다른 칩에서 테스트되었습니다 (위키 페이지에 설명되어 있음)

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


2

randomSeed () 와 같은 것을 사용하는 것을 보았 습니까? -Arduino IDE에서 사용

이 함수를 사용하여 atmel AVR에서 부동 (자유) 아날로그 핀을 샘플링 한 다음 값을 사용하여 의사 난수 함수-random ()에 대한 임의의 시작점을 만듭니다 .

random ()에 의해 생성 된 값은 의사 난수 일 수 있지만 randomSeed ()에 의해 생성 된 임의의 시작 지점 은 가능한 한 임의의 수 / 값이어야합니다.


2
아날로그 핀과 같은 샘플링은 랜덤에 가깝지만 분포가 고르지 않습니다. 그러나 씨앗을 무작위로 몇 번 실행하면됩니다.
Kevin Vermeer

.... 난수 난수 생성기를 통해 부부 ... <-어떻게 사라 졌습니까? NTS : 먼저 뇌를 관여시킨 다음 손가락을 사용하십시오.
케빈 베르메르

정확히-암호화 / 보호 등에 사용하는 경우 가장 안전하지 않지만 생성 음악이나 주사위 게임과 같은 멋진 난수를 제공합니다. 구현하기도 좋고 쉽다 :)
Jim

1

AVR 하드웨어로이를 달성하는 방법에 대한 논문 이 있습니다. 클럭 지터에 의존합니다. 기본적으로 하나의 클럭 소스를 기반으로하는 타이머 인터럽트를 사용하여 별도의 독립적 인 클럭 소스에서 클럭킹되는 별도의 타이머의 하위 비트를 샘플링합니다. 두 클럭에는 이와 관련된 임의의 지터가 있으며 샘플링은 완전히 주기적이 아닙니다.

나는 STM32 마이크로 컨트롤러에서 이것에 대한 작은 개념 증명을했고 코드는 여기 github에 있습니다 . 무작위 테스트 스위트 세트를 기반으로 좋은 결과를 얻었습니다.

제 생각에 이것은 공격하기 매우 쉬운 ADC로 플로팅 핀을 샘플링하는 것보다 낫다고 생각합니다 (핀을 접지에 연결하면 더 이상 무작위가 아닙니다!). 클럭 지터 기반 RNG를 조작하는 방법이 있다고 확신하지만 온칩 내부 클럭 소스를 기반으로 순전히이 작업을 수행 할 수 있다고 생각합니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.