
前言 很多标准都规定了构造要求和参考、随机数发生器 (RNG) 的验证和使用,以便检验其生成的输出是否是真正的随机数。 本应用笔记中包含的指南用于检验所选 STM32 微控制器中嵌入的随机数发生器外设生成的数字的随机性。本次验证是基于美国国家标准技术局 (NIST) 统计测试套件 (STS) SP 800-22rev1a (2010 年 4 月)进行的。 本文档结构如下:) ]" ]6 k" D9 s0 F! G* J • STM32 微控制器随机数发生器概述 (请参见第 1 节 ) • NIST SP800-22b 测试套件 (请参见第 2 节) • 运行 NIST SP800-22b 测试和分析需要执行的步骤 (请参见第 3 节)% A" G* U; f3 k8 v) z, s ![]() 3 E: _, }& i$ A 1 STM32 微控制器随机数发生器 1.1 前言- M/ p, c% M% U( d/ p4 p6 D; q 为加密应用程序使用的随机数发生器 (RNG) 通常会生成由随机的 0 或 1 位组成的序列。 随机数发生器基本上分为两类,分别是:$ w' R4 n: [& V. r) ~9 v 1. 确定性随机数发生器或伪随机数发生器 (PRNG):+ ]; B4 P5 M" ]2 H( }; d# T 确定性 RNG 包含的算法会通过名为种子的初始值生成位序列。为确保向前不可预测性,获取种子时必须多加留意。如果已知种子和生成算法, PRNG 生成的数值是完全可预测的。由于很多情况下生成算法是公开可用的,因此种子必须保密,并通过 TRNG来生成。 2. 非确定性随机数发生器或真随机数发生器 (TRNG): 非确定性 RNG 生成的随机性取决于一些不受人为控制的不可预测物理源 (即熵源)。 在 STM32 微控制器上采用的 RNG 硬件外设以及在第 1.2.1 节中介绍的 RNG 硬件外设属于真随机数发生器。* @2 F7 T [9 Z# k 1.2 STM32 微控制器实施说明 1.2.1 真随机数发生器9 H5 K: o' t/ S 下表列出的是嵌入了 RNG 硬件外设的 STM32 微控制器线列: ![]() 2 [, `, f- ^( B+ O, A" [: \; ? 2 [7 c; t* r/ q' t6 j STM32 微控制器上使用的真随机数发生器外设基于模拟电路。该电路生成的连续模拟噪声将用于 RNG 处理,以生成 32 位随机数。- M& k7 u. V0 a. b. M5 e 该模拟电路由几个环形振荡器组成,振荡器的输出进行异或运算。( y8 B6 ~1 i/ u( L0 L RNG 处理由采用恒定频率的专用时钟计时,对于微控制器的子设备,还可以使用频率值不同的时钟来计时。 有关 RNG 外设的详细信息,请参见 STM32 微控制器参考手册。 图 1 给出了 STM32 微控制器的 TRNG 框图。# [0 Q( |# g$ U. \: @ . {5 d: V' z+ Q% j5 [$ F + T3 ~1 } {6 q0 ? ![]() 6 q) G, J n8 N) t 4 v1 _4 E, f6 {, r; W- l 2 NIST SP800-22b 测试套件 p$ d3 E5 u' `* O 2.1 前言% t( w8 m* p: a7 U NIST SP800-22b 统计测试套件已使用由国家标准技术局 (NIST) 开发的统计数据测量套件(sts) 实现,可检验用于加密应用的随机数发生器的质量。标题为 “A Statistical Test Suite for he Validation of Random Number Generators and Pseudo Random Number Generators for Cryptographic Applications”” 的文章对该套件进行了全面介绍。9 f! r3 J$ F' G* b1 w0 D 2.2 NIST SP800-22b 测试套件说明+ R. g3 g0 \) M6 v! A NIST SP800-22b 统计测试套件 “sts-2.1.1” 是由国家标准技术局开发的软件包。 a9 E# P" J0 _3 b- I& Q 源代码使用 ANSI C 编写。 NIST 统计测试套件由 15 种测试组成,用于测试二进制序列的随机性。这些测试主要针对序列中可能存在的各类非随机性问题。从这一角度,可将测试套件分为以下几类:; \, ^& i3 m2 h) p7 q5 Z5 x y 频率测试 • 频率 (单比特)测试: ( r# v' |3 {* Y [+ `) z1 a 衡量 0 和 1 在序列中的分布情况,并检查结果是否与真随机数序列的预期结果相似。- `3 Y* w1 {) H, G9 r; \, c* ?! q4 A • 块中的频率测试: 5 b2 v9 e1 I3 y 检查 M 位块中 1 的频率是否近似为预期通过随机性原理得到 M/2。 • 运行测试: * p$ _" L; T8 {- l9 ?0 [2 s 评估不同长度的 1 和 0 的预期运行总数是否是随机序列的预期结果。 • 测试块中运行最长的 “1”: 检查序列中的长运行 “1”: + t% y+ C! q$ x. L( m3 \) K 线性测试 • 二进制矩阵秩测试: 评估 32x32 二进制矩阵秩的分布。& Q& E0 Y# x0 Y1 R7 k5 T1 W; ?- @ • 线性复杂度测试: 确定有限序列的线性复杂度。 相关性测试 (通过傅里叶变换) • 离散傅里叶变换 (频谱)测试: # k* U, P8 P. W8 { Z 通过基于离散傅里叶变换的频谱测试评估位串的谱频率。此测试易受序列中的周期性影响。 0 e% u0 H' `' l 查找特殊字符串测试8 S' C% _4 H6 Q: M7 D • 非重叠模板匹配测试: 评估 m 位非周期性组合的频率。 • 重叠模板匹配测试: 0 R% ~+ |( u9 B5 W0 F# `) C 评估 m 位周期性模板的频率。 熵测试 • Maurer“ 通用统计 ” 测试:* Z8 J9 _6 \; l; _* x% N" Y |9 ` 评估 L 位块二进制序列的压缩率。; L8 W$ B- I5 ?" g+ H! A • 连续测试: - v! B6 B2 }8 A* g 评估所有 2m m 位块的分布。 注: 对于 m = 1 的情况,连续测试相当于第 2.2 节的频率测试。 • 近似熵测试: 评估位串的熵,将所有 m 位组合的频率与所有 (m+1) 位组合的频率进行对比。/ @! ]7 `+ s' z& @ 随机游走测试; B7 b/ @/ M: ?3 L • 累积和测试: 7 E+ A9 o0 a# P( i& H5 ^1 K( i 评估部分序列的和是否过大或过小;用于指示过多的 0 或 1。 $ a( c: |) d7 ?# E* ~! F/ }4 f • 随机偏移测试: / _+ y% `. h! p- a 评估随机游走周期内的状态分布。 z0 I: r, N; H6 F) E: }8 p0 [6 [ • 随机偏移变化测试: ! Z$ ~7 Y8 Z8 P4 H+ R 检测与达到不同随机游走状态的预期次数的偏差。2 @# @- L9 }; u# J; v8 F 上述测试中,每项测试都基于计算出的测试统计值,而测试统计值是测试序列的函数。测试统计值用于计算 Pvalue,其中: Pvalue 是完美随机数发生器生成的序列随机性小于受测试序列的概率。; s( y6 @: {- B 有关 NIST 统计测试套件的更多详细信息,请参见 NIST 网站上提供的以下 NIST 文档: 特别出版物 “A Statistical Test Suite for Random and Pseudorandom Number Generators for # |; x# U$ M' R8 i3 ?( k* H% g Cryptographic Applications”, 800-22 版本 1a。5 m0 C X( e$ f4 \, h 完整版请查看:附件# k5 ~9 V" u; W' ?; r: k P |
DM00073853_ZHV2.pdf
下载453.27 KB, 下载次数: 5
STM32 GUI LTDC 最大像素时钟评估方法
【2025·STM32峰会】GUI解决方案实训分享1-对LVGL咖啡机例程的牛刀小试以及问题排查
OpenBLT移植到STM32F405开发板
为什么要先开启STM32外设时钟?
【STM32MP157】从ST官方例程中分析RPMsg-TTY/SDB核间通信的使用方法
【经验分享】STM32实例-RTC实时时钟实验④-获取RTC时间函数与中断服务函数
STM32 以太网 MAC Loopback 的实现
刘氓兔的64位入门挑战【1】——MP257芯片下单和硬件准备
刘氓兔的64位入门挑战【0】——MP257选型
STM32功能安全设计包,助力产品功能安全认证