2013-02-10 2 views
3

저는 keil microvision IDE에서 STM32F103E arm cortex-m3 MCU로 프로젝트를 진행하고 있습니다.
몇 가지 목적으로 난수를 생성해야하지만 표준 C++ 라이브러리가 생성하는 의사 난수를 사용하고 싶지 않으므로 하드웨어 기능을 사용하여 실제 난수를 생성하는 방법이 필요하지만 그렇지 않습니다. 내가 어떻게 할 수 있는지 알아.
아이디어가 있으십니까? 그래서 유일한 옵션은 의사 불규칙적을 사용하고,STM32 MCU를 사용하여 REAL 난수를 생성하는 방법은 무엇입니까?

+1

이 칩/보드 하드웨어 RNG가 있습니까 : 여기 는이 STM32F03 코드입니다? – Mat

+0

난수가 필요한 것은 무엇입니까? – starblue

+0

RSA 키 생성에 난수가 필요합니다. Jari가 말했듯이 F1 시리즈에는 RNG가없는 것 같지만 다른 하드웨어 기능 (예 : RTC)을 사용하여 하드웨어 RNG를 시뮬레이션 할 수있는 방법이 있습니까? –

답변

4

지적한대로, 칩에는 하드웨어 RNG가 없다.

하지만 자신 만의 롤 수 있습니다. 일반적인 방법은 독립 클럭 간의 지터를 측정하는 것입니다. 독립은 두 클럭이 다른 크리스챤이나 RC- 발진기에 의해 뒷받침되고 동일하게 파생되지 않음을 의미합니다.

내가 사용합니다 :

    시스템 클럭 (MHz의 범위)

는 kHz의에 카운터를 설정 kHz의 범위 RC 오실레이터

  • 하나에서 파생
  • SysTick 타이머/카운터 - 범위 RC 발진기는 당신에게 여러 번 초당 인터럽트를 제공합니다. 인터럽트 처리기에서 SysTick 카운터의 현재 값을 읽습니다. SysTick이 다른 용도 (스케줄링)로 사용되는지 여부에 관계없이 5 비트 이하의 비트는 모두 예측할 수 없습니다.

    정상적인 의사 RNG를 사용하여 임의의 숫자를 가져 오려면 위의 모아진 엔트로피를 사용하여 의사 RNG의 내부 상태를 예기치 않게 변경하십시오. 키 생성을 위해서는 한 번에 모든 비트를 읽지 말고 몇 가지 변이가 일어나도록하십시오.

    공격은 명백합니다. 공격자가 kHz 범위의 RC 오실레이터를 MHz 정밀도까지 측정하거나 제어 할 수 있다면 임의성이 사라집니다. 걱정이된다면 스마트 카드 나 기타 보안 보조 프로세서를 사용하십시오.

  • 4

    F1 시리즈는 RNG (하드웨어 난수 발생기를) 갖고있는 것 같다되지 않습니다 (P 그래서 간단 설명하십시오, 소프트웨어 엔지니어 &하지 전자 전문 해요) 또는 외부 입력 (일부는 인간의 손 움직임을 무작위로 생각)을 요청하십시오. 표준 C++ 라이브러리가 아닌 일부 암호화 라이브러리를 사용하여 더 자주 가상 랜덤을 얻을 수 있습니다.

    8

    이 질문은 제가 방금 가로 뛴 오래된 질문입니다.하지만 다른 대답을 찾지 못해 대답하고 싶습니다.

    "RSA 키 생성에 난수가 필요합니다."

    이것은 PRNG 루틴 (너무 오랫동안 잘못된 애완 동물 인 RNG라고도 함)이 UNACCEPTABLE이며 원하는 보안을 제공하지 않는다는 것을 의미합니다.

    외부 진정한 RNG는 허용되지만 가장 우아한 답변은 내장 된 TRUE 난수 생성기가있는 STM32F2xx 또는 STM32F4xx 마이크로 컨트롤러로 바꾸는 것입니다. 개발을 위해 당신은 F1과 PRNG를 사용할 수 있다고 생각하지만, 진정한 RNG를 사용하기 전에 "그것이 작동합니다."라고 말하면서 유망한 제품을 선적했을 때의 유혹은 분명히 ST F4입니다. 또한 F2 칩은이 질문이 나오기 전부터 사용되어 왔습니다).

    이 답변은 비 기술적 인 이유로는 받아 들여지지 않을 수도 있습니다 (칩은 이미 지정되었으므로 OP에는 필요한 기능에 대한 입력이 없음). 칩을 선택한 사람은 온칩 주변 장치 및 기능 응용 프로그램에 필요합니다.

    2

    내가 발견하여 테스트 한 또 다른 방법이 있습니다. 그것은 진정한 무작위 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); 
    

    가}

    +1

    접근법에 결함이 있습니다. 엔트로피 소스 (ADC)의 품질은 출력 * * 미백 (CRC)을보고 판단 할 수 없습니다. 또한 출력 값의 간단한 히스토그램은 RNG에서 가장 간단한 결함 만 탐지합니다. 첫눈에 무작위로 보이는 무언가를 생성하기 위해 8 라운드가 필요하다는 사실은 ADC 샘플 당 엔트로피가 거의 없다는 것을 나타냅니다. 따라서 더 이상의 분석 없이는 RNG의 엔트로피에 대한 어떠한 가정도 할 수 없으므로 암호화 키 생성에 사용할 수 없습니다. – JimmyB

    관련 문제