本帖最后由 muyichuan2012 于 2023-8-7 14:31 编辑
AT32的随机数的产生
这篇应用笔记为设计者使用AT32芯片时,产生符合应用需求的随机数,提供设计建议。
在最后附上基于NIST(国家技术标准委员会)的统计测试集,检验生成的数字的随机性。
April 27, 2010: NIST SP 800-22rev1a (dated April 2010), A Statistical Test Suite for the Validation of Random
Number Generators and Pseudo Random Number Generators for Cryptographic Applications, that describes the
test suite.
November 21, 2014: NIST requests comments on the latest revision of NIST SP 800-90A, Recommendation for
Random Number Generation Using Deterministic Random Bit Generators, which is dated November 2014.
支持型号列表:
AT32 全系列
目录
1 概述 ........................................................................ 5
2 利用ADC 的误差来源产生随机数的方法 ................. 6
3 利用上电时SRAM 的内容来计算随机数的方式。 ....... 8
4 随机数生成应用指南 ........................................... 9
5 范例运行和分析 ................................................ 10
5.1 硬件资源 ......................................................... 10
5.2 软件资源 ........................................................ 10
5.3 NIST SP800-22b 统计测试集 ............................. 11
5.4 NIST SP800-90b 统计测试集 ............................. 16
6 版本历史 ........................................................... 19
1 概述
产品和生态系统安全性的需求比以往任何时候都更加重要。真随机数是所有安全系统的核心,其质量
会影响设计的安全性。
因此在没有内置硬件TRNG的AT32的微控制器系列中,如何提高随机数的有效,来符合应用的需
求。底下提供两种方法:
提高乱度的方法之一,使用ADC的误差。AT32的微控制器内置最多三个高级12位片上SAR模拟数字
转换器(ADC)并提供自校准功能,保证12位ADC静态准确度(accuracy)可达10位以上。这误差
可以拿来计算随机数的来源。
提高乱度的方法之二,使用上电时SRAM内容的不确定性。SRAM不保证上电时的内容值,每次上电
后,内容也是不容易预测的。我们可以利用这个特性,拿来增加随机数的乱度。
2 利用ADC 的误差来源产生随机数的方法
本章介绍了使用软件触发方式触发ADC,配置普通信道和DMA。根据随机数需要的位数来配置信道
数,一次转换最多到16信道,将16信道转换的数值可组合计算成一个32位的随机数。底下是DMA和
ADC的配置代码。
DMA 配置函数代码
static void dma_config(void)
{
dma_init_type dma_init_struct;
crm_periph_clock_enable(CRM_DMA1_PERIPH_CLOCK, TRUE);
dma_reset(DMA1_CHANNEL1);
dma_default_para_init(&dma_init_struct);
dma_init_struct.buffer_size = 16;
dma_init_struct.direction = DMA_DIR_PERIPHERAL_TO_MEMORY;
dma_init_struct.memory_base_addr = (uint32_t)adc1_ordinary_valuetab;
dma_init_struct.memory_data_width = DMA_MEMORY_DATA_WIDTH_HALFWORD;
dma_init_struct.memory_inc_enable = TRUE;
dma_init_struct.peripheral_base_addr = (uint32_t)&(ADC1->odt);
dma_init_struct.peripheral_data_width = DMA_PERIPHERAL_DATA_WIDTH_HALFWORD;
dma_init_struct.peripheral_inc_enable = FALSE;
dma_init_struct.priority = DMA_PRIORITY_HIGH;
dma_init_struct.loop_mode_enable = FALSE;
dma_init(DMA1_CHANNEL1, &dma_init_struct);
dma_channel_enable(DMA1_CHANNEL1, TRUE);
ADC 配置函数代码
static void adc_config(void)
{
adc_base_config_type adc_base_struct;
crm_periph_clock_enable(CRM_ADC1_PERIPH_CLOCK, TRUE);
crm_adc_clock_div_set(CRM_ADC_DIV_6);
/* select combine mode */
adc_combine_mode_select(ADC_INDEPENDENT_MODE);
adc_base_default_para_init(&adc_base_struct);
adc_base_struct.sequence_mode = TRUE;
adc_base_struct.repeat_mode = TRUE;
adc_base_struct.data_align = ADC_RIGHT_ALIGNMENT;
adc_base_struct.ordinary_channel_length = 16;
adc_base_config(ADC1, &adc_base_struct);
adc_ordinary_channel_set(ADC1, ADC_CHANNEL_0, 1, ADC_SAMPLETIME_1_5);
adc_ordinary_channel_set(ADC1, ADC_CHANNEL_1, 2, ADC_SAMPLETIME_1_5);
…
adc_ordinary_channel_set(ADC1, ADC_CHANNEL_15, 16, ADC_SAMPLETIME_1_5);
adc_ordinary_conversion_trigger_set(ADC1, ADC12_ORDINARY_TRIG_SOFTWARE, TRUE);
adc_dma_mode_enable(ADC1, TRUE);
adc_enable(ADC1, TRUE);
可以看到,代码中并没有对ADC做自校准,转换时间也使用最短的,这种情况下,ADC的准确度会
是最差的,有助于乱度的提升。
ADC 随机数取得代码
uint32_t adc_random(void)
{
Int i
uint32_t seed2;
while(1){
if(dma_flag_get(DMA1_FDT1_FLAG) != RESET)
{
dma_flag_clear(DMA1_FDT1_FLAG);
for(i=0; i<16; ++i){
seed2 += adc1_ordinary_valuetab[i]<<2*i;
}
return seed2;
}
}
}
3 利用上电时SRAM 的内容来计算随机数的方式。
这范例只是简单的利用累加来获得一个随机数
SRAM 配置函数代码
uint32_t sram_random(uint32_t size)
{
uint32_t* ptr = (uint32_t*)0x20000000;
uint32_t seed;
while(size--){
seed += *ptr++;
}
return seed;
}
4 随机数生成应用指南
以上两种方式建议应用在上电后执行,因为SRAM内容在运行后会初始化,ADC也会有其他应用上的
需求,上电后执行并获得一个随机数,将这个随机数当成Seed,之后可以利用标准C函式库中提供
的随机数生成器,产生后续的随机数。
SRAM的方式限定在POR后使用。如果只是一般的reset,SRAM会维持内容,造成产生的随机数都
是相同。
ADC的方式则没有限制,但是因为使用ADC外设的资源,推荐放在开机时执行,不会影响后续的
ADC应用。
5 范例运行和分析
本篇应用笔记适用于AT32各系列MCU,只要有ADC外设皆可适用。
范例固件AN0175_SourceCode_V2.0.0运行在AT32403A AT-START版上,透过 PuTTY(免费开源
终端仿真器)等终端仿真应用程序,将数据存储在工作站上。
在工作站上编译NIST统计测试集程序包,以生成可执行程序。接下来运行NIST统计测试集程序分析
数据以及统计测试。
以下是使用范例固件AN0175_SourceCode_V2.0.0在上电后会产生的一个随机数,在收集约319万笔
随机数后,进行NIST统计测试。
图1. 环境配置
5.1 硬件资源
1. AT32403A AT-START 版
1) 串口(PA9)
2. 具有串口的计算机,运行Linux 系统
5.2 软件资源
1. 下载到AT32403A AT-START 版运行
1) AN0175_SourceCode_V2.0.0
2. 计算机端运行
1) 终端仿真器如PuTTY
2) 统计测试集源程序
https://csrc.nist.gov/CSRC/media ... ments/sts-2_1_2.zip
https://github.com/usnistgov/SP800-90B_EntropyAssessment
5.3 NIST SP800-22b 统计测试集
基于NIST统计测试集:April 27, 2010: NIST SP 800-22rev1a (dated April 2010), A Statistical Test Suite for the
Validation of Random Number Generators and Pseudo Random Number Generators for Cryptographic
Applications, that describes the test suite.
统计测试集源程序下载:
https://csrc.nist.gov/CSRC/media ... ments/sts-2_1_2.zip
统计测试集结果:
------------------------------------------------------------------------------
RESULTS FOR THE UNIFORMITY OF P-VALUES AND THE PROPORTION OF PASSING SEQUENCES
------------------------------------------------------------------------------
generator is <0421.bin>
------------------------------------------------------------------------------
C1 C2 C3 C4 C5 C6 C7 C8 C9 C10 P-VALUE PROPORTION STATISTICAL TEST
------------------------------------------------------------------------------
24 22 17 24 13 20 22 27 9 20 0.108116 197/198 Frequency
16 25 13 17 18 29 17 25 22 16 0.169882 197/198 BlockFrequency
24 24 18 23 23 17 16 19 19 15 0.750406 196/198 CumulativeSums
21 21 23 19 23 22 19 16 20 14 0.881583 197/198 CumulativeSums
16 12 15 21 20 25 24 18 27 20 0.286687 195/198 Runs
26 27 21 18 19 23 23 8 13 20 0.062613 193/198 LongestRun
20 22 17 14 17 22 21 25 20 20 0.838872 197/198 Rank
26 24 22 21 12 20 20 24 17 12 0.251298 197/198 FFT
26 22 22 16 17 15 15 22 20 23 0.609742 197/198 NonOverlappingTemplate
22 26 17 20 18 15 22 20 16 22 0.771060 197/198 NonOverlappingTemplate
20 17 19 14 18 29 24 21 17 19 0.471954 194/198 NonOverlappingTemplate
18 16 24 23 21 20 15 18 25 18 0.760790 197/198 NonOverlappingTemplate
12 23 23 23 20 16 19 18 22 22 0.675416 196/198 NonOverlappingTemplate
23 27 20 21 20 18 21 22 15 11 0.394746 197/198 NonOverlappingTemplate
22 17 18 21 17 21 16 29 23 14 0.413346 197/198 NonOverlappingTemplate
18 21 17 19 19 18 22 23 21 20 0.989691 196/198 NonOverlappingTemplate
14 19 23 18 14 24 28 17 20 21 0.385634 197/198 NonOverlappingTemplate
22 20 21 18 21 22 15 16 18 25 0.856619 196/198 NonOverlappingTemplate
18 18 15 22 19 19 19 18 18 32 0.317486 195/198 NonOverlappingTemplate
22 19 18 11 26 18 21 27 15 21 0.265041 197/198 NonOverlappingTemplate
25 16 24 18 18 26 22 19 16 14 0.471954 196/198 NonOverlappingTemplate
...
5.4 NIST SP800-90b 统计测试集
基于NIST统计测试集:November 21, 2014: NIST requests comments on the latest revision of NIST SP 800-
90A, Recommendation for Random Number Generation Using Deterministic Random Bit Generators, which is dated
November 2014.
统计测试集源程序下载:
https://github.com/usnistgov/SP800-90B_EntropyAssessment
统计测试集结果:需先转换成符合2-bit-wide symbols数据输入格式。
./ea_non_iid 0421_2.bin 2 -i -a -v
Opening file: '0421_2.bin'
Loaded 50888144 samples of 4 distinct 2-bit-wide symbols
Number of Binary Symbols: 101776288
Running non-IID tests...
Running Most Common Value Estimate...
Bitstring MCV Estimate: mode = 50891714, p-hat = 0.50003507693265448, p_u = 0.50016273956095891
Most Common Value Estimate (bit string) = 0.999531 / 1 bit(s)
Literal MCV Estimate: mode = 12725005, p-hat = 0.25005834364876817, p_u = 0.25021470996034195
Most Common Value Estimate = 1.998761 / 2 bit(s)
Running Entropic Statistic Estimates (bit strings only)...
Bitstring Collision Estimate: X-bar = 2.5000060058338387, sigma-hat = 0.50000000610486417, p =
0.50989562404154842
Collision Test Estimate (bit string) = 0.971726 / 1 bit(s)
Bitstring Markov Estimate: P_0 = 0.49996492306734552, P_1 = 0.50003507693265448, P_0,0 =
0.4999425562646943, P_0,1 = 0.5000574437353057, P_1,0 = 0.49998729655651403, P_1,1 =
0.50001270344348603, p_max = 2.9554800761609014e-39
Markov Test Estimate (bit string) = 0.999936 / 1 bit(s)
Bitstring Compression Estimate: X-bar = 5.2176714331187366, sigma-hat = 1.0152961906603262, p =
0.019654761320726077
Compression Test Estimate (bit string) = 0.944830 / 1 bit(s)
Running Tuple Estimates...
Bitstring t-Tuple Estimate: t = 23, p-hat_max = 0.52357011476148263, p_u = 0.52369763546518522
Bitstring LRS Estimate: u = 24, v = 50, p-hat = 0.50053161737274598, p_u = 0.50065927992920534
T-Tuple Test Estimate (bit string) = 0.933194 / 1 bit(s)
Literal t-Tuple Estimate: t = 11, p-hat_max = 0.27527598152543398, p_u = 0.27543726106146299
Literal LRS Estimate: u = 12, v = 24, p-hat = 0.25086994374062016, p_u = 0.25102647882990431
|
共1人点赞
|