TI ( slaa338 )에서 "실수"( "의사"가 아닌) 난수를 생성하는 기술을 설명 하는 appnote를 읽었습니다 . 이 목표를 달성하기 위해 MSP430의 다소 이국적인 클럭 서브 시스템을 이용합니다. 누구든지 "실제"난수를 생성하기 위해 AVR (특히 XMega에 관심이 있습니다)에서 구현할 수있는 기술을 알고 있습니까?
TI ( slaa338 )에서 "실수"( "의사"가 아닌) 난수를 생성하는 기술을 설명 하는 appnote를 읽었습니다 . 이 목표를 달성하기 위해 MSP430의 다소 이국적인 클럭 서브 시스템을 이용합니다. 누구든지 "실제"난수를 생성하기 위해 AVR (특히 XMega에 관심이 있습니다)에서 구현할 수있는 기술을 알고 있습니까?
답변:
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;
}
ADC를 하드웨어 노이즈 소스에 연결하고 소프트웨어를 사용하여 난수를 "미백"합니다.
이를 수행하는 AVR 기반 프로젝트는 다음과 같습니다. Leon의 Mini Portable Random Number Generator (mPRNG)
암호화로 얼마나 안전하게 보호해야하는지에 따라 외부 아날로그 대신 접지 된 아날로그 입력 또는 " 내부 온도 센서 " 노이즈를 랜덤 시드로 사용할 수 있습니다.
업데이트 : 나중에 쓴 칩의 타이머를 사용 아두 이노를위한 프로그램 엔트로피 소스 (ADC가 시끄러운 비트가 잘립니다 때문에 쓸모없는 것으로 판명)로, 그리고이의 창조 영감을 엔트로피 라이브러리를 .
두 경우 모두, 랜덤 성은 예를 들어 온도 값 자체에서 느리게 변하는 것이 아니라 최하위 비트 에서 읽히는 것입니다. 이전 읽기에서 각 비트의 출력, 비트 시프 팅 및 XORing에 대해 값을 여러 번 읽습니다. 상관 관계가없는 비트를 사용하여 진정한 임의의 비트를 XOR 하면 임의성이 유지 되므로 임의성이 모든 비트로 확산되어 진정한 화이트 노이즈가됩니다. 그러나 획득 시간 또는 타이머주기 당 1 비트의 출력 만 얻을 수 있으므로 비트 전송률은 그리 높지 않습니다. 타이머 방법으로 약 64 비트 / s를 얻었습니다.
동일한 순서로 다시 시작하지 않으려면 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());
[...]
}
이것은 꽤 좋은 랜덤을 제공하며 프로그램 / 메모리에 많은 비용이 들지 않습니다.
Arduino 용으로 설계된 원래 라이브러리는 avr에서 g ++을 사용하여 C ++ 구현의 클래스로 잘 작동하지만 실제로는 최근 ARM 아키텍처로 포팅 된 라이브러리를 만들었습니다.
워치 독 타이머와 시스템 클럭 사이의 지터를 사용하며 여러 다른 칩에서 테스트되었습니다 (위키 페이지에 설명되어 있음)
http://code.google.com/p/avr-hardware-random-number-generation/wiki/WikiAVRentropy
randomSeed () 와 같은 것을 사용하는 것을 보았 습니까? -Arduino IDE에서 사용
이 함수를 사용하여 atmel AVR에서 부동 (자유) 아날로그 핀을 샘플링 한 다음 값을 사용하여 의사 난수 함수-random ()에 대한 임의의 시작점을 만듭니다 .
random ()에 의해 생성 된 값은 의사 난수 일 수 있지만 randomSeed ()에 의해 생성 된 임의의 시작 지점 은 가능한 한 임의의 수 / 값이어야합니다.
AVR 하드웨어로이를 달성하는 방법에 대한 논문 이 있습니다. 클럭 지터에 의존합니다. 기본적으로 하나의 클럭 소스를 기반으로하는 타이머 인터럽트를 사용하여 별도의 독립적 인 클럭 소스에서 클럭킹되는 별도의 타이머의 하위 비트를 샘플링합니다. 두 클럭에는 이와 관련된 임의의 지터가 있으며 샘플링은 완전히 주기적이 아닙니다.
나는 STM32 마이크로 컨트롤러에서 이것에 대한 작은 개념 증명을했고 코드는 여기 github에 있습니다 . 무작위 테스트 스위트 세트를 기반으로 좋은 결과를 얻었습니다.
제 생각에 이것은 공격하기 매우 쉬운 ADC로 플로팅 핀을 샘플링하는 것보다 낫다고 생각합니다 (핀을 접지에 연결하면 더 이상 무작위가 아닙니다!). 클럭 지터 기반 RNG를 조작하는 방법이 있다고 확신하지만 온칩 내부 클럭 소스를 기반으로 순전히이 작업을 수행 할 수 있다고 생각합니다.