本帖最后由 zhanzr21 于 2017-1-14 21:50 编辑
STM32F769上面有个随机数生成器, 主要是用于加解密的应用. 刚刚对其性能测试了一下,以下是实验结果.
这是数据手册中的基本参数:
The RNG processor is a random number generator, based on a continuous analog noise,
that provides a random 32-bit value to the host when read.
The RNG passed the FIPS PUB 140-2 (2001 October 10) tests with a success ratio of 99%.
40 periods of the RNG_CLK clock signal between two consecutive random numbers
可以看出这个随机数生成器使用模拟噪音做种子, 符合的规格很高, 基本能过FIPS PUB 140-2的规范. 可以说用在安全方面是很可靠的, 但是速度性能稍差一点, 要40个RNG时钟周期, RNG时钟最高是48MHz. 所以如果只是需要一般噪音性质的随机数,应该选择使用C Lib的软件实现.
CPU时钟216M, RNG使用48M. 生成1000000个随机数:
主要测试代码:
srand(0);
printf("CLib Rand Function Start\n");
tmpTick = HAL_GetTick();
for(i=0; i<RANDOM_TEST_NUM; ++i)
{
ResRand = rand();
// printf("%u\t", ResRand);
}
deltalTick = HAL_GetTick()-tmpTick;
printf("\nCLib Rand Function generated %u with %u ms\n", RANDOM_TEST_NUM, deltalTick);
printf("Hardware Rand Function Start\n");
tmpTick = HAL_GetTick();
for(i=0; i<RANDOM_TEST_NUM; ++i)
{
ResRand = HAL_RNG_GetRandomNumber(&RngHandle);
// printf("%u\t", ResRand);
}
deltalTick = HAL_GetTick()-tmpTick;
printf("\nHardware Rand Function generated %u with %u ms\n", RANDOM_TEST_NUM, deltalTick);
需要指出C Lib的rand实现有两个版本, 通过宏来控制使用哪个
这是默认的32bit版本rand()结果:
Start @216 MHz
CLib Rand Function Start
CLib Rand Function generated 1000000 with 83 ms
Hardware Rand Function Start
Hardware Rand Function generated 1000000 with 875 ms
这是16bit的rand()的结果:
CLib Rand Function Start
CLib Rand Function generated 1000000 with 84 ms
Hardware Rand Function Start
Hardware Rand Function generated 1000000 with 875 ms
可能是优化的原因, 这个CPU上16bit与32bit的实现性能类似, 实际使用中当然应该倾向于32bit版本.
可以看出来,硬件生成器需要的时间是软件rand函数实现的10倍以上, 这应该是软件实现使用了很多优化, 而且CPU的时钟比RNG模块快的缘故.
随机数的标准符合测试需要很大量的数据来测试, 这个我暂时无能为力, 但是相信ST官方的描述是可信的. 关于随机数生成器的性能分析至此为止, 下次准备研究一下硬件加密(CRYPT与HASH模块)的性能, 届时再来发贴.
|