저는 keil microvision IDE에서 STM32F103E arm cortex-m3 MCU로 프로젝트를 진행하고 있습니다.
몇 가지 목적으로 난수를 생성해야하지만 표준 C++ 라이브러리가 생성하는 의사 난수를 사용하고 싶지 않으므로 하드웨어 기능을 사용하여 실제 난수를 생성하는 방법이 필요하지만 그렇지 않습니다. 내가 어떻게 할 수 있는지 알아.
아이디어가 있으십니까? 그래서 유일한 옵션은 의사 불규칙적을 사용하고,STM32 MCU를 사용하여 REAL 난수를 생성하는 방법은 무엇입니까?
답변
지적한대로, 칩에는 하드웨어 RNG가 없다.
하지만 자신 만의 롤 수 있습니다. 일반적인 방법은 독립 클럭 간의 지터를 측정하는 것입니다. 독립은 두 클럭이 다른 크리스챤이나 RC- 발진기에 의해 뒷받침되고 동일하게 파생되지 않음을 의미합니다.
내가 사용합니다 :
-
시스템 클럭 (MHz의 범위)
는 kHz의에 카운터를 설정 kHz의 범위 RC 오실레이터
정상적인 의사 RNG를 사용하여 임의의 숫자를 가져 오려면 위의 모아진 엔트로피를 사용하여 의사 RNG의 내부 상태를 예기치 않게 변경하십시오. 키 생성을 위해서는 한 번에 모든 비트를 읽지 말고 몇 가지 변이가 일어나도록하십시오.
공격은 명백합니다. 공격자가 kHz 범위의 RC 오실레이터를 MHz 정밀도까지 측정하거나 제어 할 수 있다면 임의성이 사라집니다. 걱정이된다면 스마트 카드 나 기타 보안 보조 프로세서를 사용하십시오.
F1 시리즈는 RNG (하드웨어 난수 발생기를) 갖고있는 것 같다되지 않습니다 (P 그래서 간단 설명하십시오, 소프트웨어 엔지니어 &하지 전자 전문 해요) 또는 외부 입력 (일부는 인간의 손 움직임을 무작위로 생각)을 요청하십시오. 표준 C++ 라이브러리가 아닌 일부 암호화 라이브러리를 사용하여 더 자주 가상 랜덤을 얻을 수 있습니다.
이 질문은 제가 방금 가로 뛴 오래된 질문입니다.하지만 다른 대답을 찾지 못해 대답하고 싶습니다.
"RSA 키 생성에 난수가 필요합니다."
이것은 PRNG 루틴 (너무 오랫동안 잘못된 애완 동물 인 RNG라고도 함)이 UNACCEPTABLE이며 원하는 보안을 제공하지 않는다는 것을 의미합니다.
외부 진정한 RNG는 허용되지만 가장 우아한 답변은 내장 된 TRUE 난수 생성기가있는 STM32F2xx 또는 STM32F4xx 마이크로 컨트롤러로 바꾸는 것입니다. 개발을 위해 당신은 F1과 PRNG를 사용할 수 있다고 생각하지만, 진정한 RNG를 사용하기 전에 "그것이 작동합니다."라고 말하면서 유망한 제품을 선적했을 때의 유혹은 분명히 ST F4입니다. 또한 F2 칩은이 질문이 나오기 전부터 사용되어 왔습니다).
이 답변은 비 기술적 인 이유로는 받아 들여지지 않을 수도 있습니다 (칩은 이미 지정되었으므로 OP에는 필요한 기능에 대한 입력이 없음). 칩을 선택한 사람은 온칩 주변 장치 및 기능 응용 프로그램에 필요합니다.
내가 발견하여 테스트 한 또 다른 방법이 있습니다. 그것은 진정한 무작위 32 비트 숫자를 생성 할 수 있습니다. 나는 그것이 얼마나 빠 른지 결코 확인하지 못했고, 숫자 당 몇 밀리 초가 소요될 수 있습니다. 여기가는 방법입니다
이- 가장 ADC 잡음
- 실행을 생성 할 수있는 가장 빠른 속도로 시끄러운 내부 온도를 읽고 가장 (? 모든) STM32 칩 을에서 사용할 수있는 하드웨어 CRC 생성기를 통해 값,
몇 번 반복하면 8 번 발견하면 꽤 좋은 임의성을 얻을 수 있습니다. 출력 값을 오름차 순으로 정렬하여 임의성을 확인하고 좋은 난수를 사용하여 Excel에서 그려 보면 직선, 불규칙한 임의성 또는 특정 숫자의 '덩어리'가 즉시 생성됩니다.
uint32_t getTrueRandomNumber(void) {
ADC_InitTypeDef ADC_InitStructure;
//enable ADC1 clock
RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, ENABLE);
// Initialize ADC 14MHz RC
RCC_ADCCLKConfig(RCC_ADCCLK_HSI14);
RCC_HSI14Cmd(ENABLE);
while (!RCC_GetFlagStatus(RCC_FLAG_HSI14RDY))
;
ADC_DeInit(ADC1);
ADC_InitStructure.ADC_ContinuousConvMode = DISABLE;
ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;
ADC_InitStructure.ADC_Resolution = ADC_Resolution_12b;
ADC_InitStructure.ADC_ScanDirection = ADC_ScanDirection_Backward;
ADC_InitStructure.ADC_ExternalTrigConvEdge = ADC_ExternalTrigConvEdge_None;
ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_T1_TRGO; //default
ADC_Init(ADC1, &ADC_InitStructure);
//enable internal channel
ADC_TempSensorCmd(ENABLE);
// Enable ADCperipheral
ADC_Cmd(ADC1, ENABLE);
while (ADC_GetFlagStatus(ADC1, ADC_FLAG_ADEN) == RESET)
;
ADC1->CHSELR = 0; //no channel selected
//Convert the ADC1 temperature sensor, user shortest sample time to generate most noise
ADC_ChannelConfig(ADC1, ADC_Channel_TempSensor, ADC_SampleTime_1_5Cycles);
// Enable CRC clock
RCC_AHBPeriphClockCmd(RCC_AHBPeriph_CRC, ENABLE);
uint8_t i;
for (i = 0; i < 8; i++) {
//Start ADC1 Software Conversion
ADC_StartOfConversion(ADC1);
//wait for conversion complete
while (!ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC)) {
}
CRC_CalcCRC(ADC_GetConversionValue(ADC1));
//clear EOC flag
ADC_ClearFlag(ADC1, ADC_FLAG_EOC);
}
//disable ADC1 to save power
ADC_Cmd(ADC1, DISABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, DISABLE);
return CRC_CalcCRC(0xBADA55E5);
가}
접근법에 결함이 있습니다. 엔트로피 소스 (ADC)의 품질은 출력 * * 미백 (CRC)을보고 판단 할 수 없습니다. 또한 출력 값의 간단한 히스토그램은 RNG에서 가장 간단한 결함 만 탐지합니다. 첫눈에 무작위로 보이는 무언가를 생성하기 위해 8 라운드가 필요하다는 사실은 ADC 샘플 당 엔트로피가 거의 없다는 것을 나타냅니다. 따라서 더 이상의 분석 없이는 RNG의 엔트로피에 대한 어떠한 가정도 할 수 없으므로 암호화 키 생성에 사용할 수 없습니다. – JimmyB
- 1. 엘릭서에서 난수를 생성하는 방법은 무엇입니까?
- 2. GUI에서 난수를 생성하는 방법은 무엇입니까?
- 3. 동시에 여러 프로세스에서 난수를 생성하는 방법은 무엇입니까?
- 4. 주어진 값 집합에서 난수를 생성하는 방법은 무엇입니까?
- 5. MATLAB에서 데이터에 따라 난수를 생성하는 방법은 무엇입니까?
- 6. C에서 12 자리 난수를 생성하는 방법은 무엇입니까?
- 7. 파이썬에서 "큰"난수를 생성하는 방법은 무엇입니까?
- 8. 난수를 생성하는 코드를 호출하는 방법은 무엇입니까?
- 9. pthread를 사용하여 C에서 난수를 생성하는 가장 올바른 방법은 무엇입니까
- 10. R에서 지정된 로그 정규 분포를 사용하여 난수를 생성하는 방법은 무엇입니까?
- 11. 자바 - 씨앗을 사용하여 특정 범위의 난수를 생성하는 방법은 무엇입니까?
- 12. 데이터베이스에 나열되지 않은 C#을 사용하여 난수를 생성하는 방법은 무엇입니까?
- 13. 난수를 생성하는 메서드가 난수를 생성하는지 테스트하는 방법
- 14. 현재 시간을 사용하여 난수를 생성하는 방법
- 15. 지정된 평균으로 난수를 생성하는 방법
- 16. R에서 난수를 생성하는 사용자 정의 함수에서 샘플링하는 방법은 무엇입니까?
- 17. C에서 time.h없이 rand()를 사용하여 난수를 생성하는 방법
- 18. C++에서 난수를 생성하는 코드
- 19. 병렬로 반복 호출에서 상관없는 난수를 생성하는 방법은 무엇입니까?
- 20. * 반복되지 않는 * 안전한 난수를 생성하는 가장 좋은 방법은 무엇입니까?
- 21. 8 비트 MCU로 의사 난수를 생성하는 가장 빠른 방법은 무엇입니까?
- 22. C에서 정규 분포 난수를 생성하는 가장 좋은 방법은 무엇입니까?
- 23. .NET에서 고유 한 스레드마다 고유 한 난수를 생성하는 방법은 무엇입니까?
- 24. 다른 한계 분포를 갖는 다 변수 난수를 생성하는 방법은 무엇입니까?
- 25. 암호화 목적으로 C에서 의사 난수를 생성하는 가장 쉬운 방법은 무엇입니까?
- 26. 특정 확률 밀도 함수로 난수를 생성하는 방법은 무엇입니까?
- 27. PHP : 편향된 난수를 생성하는 방법
- 28. 동일한 난수를 생성하는 Normrnd 함수
- 29. .NET에서 암호화 키의 난수를 생성하는 가장 좋은 라이브러리는 무엇입니까?
- 30. 다른 난수를 얻는 방법은 무엇입니까?
이 칩/보드 하드웨어 RNG가 있습니까 : 여기 는이 STM32F03 코드입니다? – Mat
난수가 필요한 것은 무엇입니까? – starblue
RSA 키 생성에 난수가 필요합니다. Jari가 말했듯이 F1 시리즈에는 RNG가없는 것 같지만 다른 하드웨어 기능 (예 : RTC)을 사용하여 하드웨어 RNG를 시뮬레이션 할 수있는 방법이 있습니까? –