【dSPACE dissecto HydraVision 測試精解】
亂數品質測試:以 NIST 統計檢定驗證 ECU 隨機性
從虛無假設與 p 值的統計基礎,到 NIST Statistical Test Suite 的 15 項檢定,完整解析如何使用 HydraCore RandomAnalyzer 評估車用 ECU 亂數產生器的品質,以及如何判讀分析結果。
亂數是車用資安的隱形基石。UDS SecurityAccess 的 Seed、加密金鑰的產生、挑戰—回應認證中的 Challenge、TLS 交握中的隨機值……只要亂數產生器(RNG)出現可預測的模式,再強的加密演算法也可能形同虛設。一個真正隨機的數列不應有任何可預測的規律,數值之間也不應存在相關性。然而,「看起來很亂」並不等於「真的隨機」——要客觀判斷,必須仰賴統計檢定。dSPACE dissecto HydraVision 的 HydraCore 測試框架內建 RandomAnalyzer,整合美國國家標準暨技術研究院(NIST)制定的統計測試套件,讓工程師能以標準化、可比較的方式評估亂數品質。
1. 為什麼車用 ECU 需要測試亂數
在車用電子系統中,亂數品質直接影響多項安全機制:
| 應用場景 | 亂數用途 | 亂數不佳的後果 |
|---|---|---|
| UDS SecurityAccess | 產生 Seed(挑戰值) | Seed 可預測時,金鑰可被預先計算,診斷閘門失效 |
| 金鑰產生 | 產生對稱金鑰、非對稱金鑰對 | 金鑰空間實際上遠小於理論值,可被暴力搜尋 |
| 加密通訊 | TLS 隨機值、Nonce、初始向量(IV) | 重複或可預測的 Nonce / IV 可能導致密文洩漏或重放攻擊 |
| 認證協定 | 挑戰—回應認證的 Challenge | 截獲的回應可在之後重複使用 |
與 SecurityAccess Seed 分析的關係:在本站《UDS SecurityAccess 安全存取測試》一文中介紹的 SeedAnalysis 測試案例,會檢查 Seed 的唯一性、長度與位元組熵值,適合在測試流程中快速篩檢。本文介紹的 NIST 統計檢定則是更深入的第二層分析:以至少一百萬個位元的樣本,從 15 個不同面向檢驗數列是否真正隨機。
2. 統計檢定的基礎概念
2.1 虛無假設(Null Hypothesis)
所有亂數統計檢定都建立在虛無假設之上:假設被測試的數值是獨立且同分布(i.i.d.)的——數列中的每個數值都與其他數值無關,且全部遵循相同的機率分布。在此假設下,若觀察到的行為與預期出現顯著偏差,就會拒絕虛無假設,也就是判定該數列「不隨機」。
2.2 p 值(p-value)
每項統計檢定都會產生一個 p 值。它代表:假設數列是由一個完美的亂數產生器所產生,觀察到與受測數列相似結果的機率。
p 值接近 0
受測數列極不可能由隨機過程產生,可能存在規律或偏差。
p 值介於 0.01~0.99
數列的隨機性在可接受範圍內,與隨機過程的行為一致。
p 值接近 1
與隨機過程一致;但若過度接近 1,可能代表數列「太過均勻」,同樣值得留意。
3. NIST Statistical Test Suite:15 項統計檢定
NIST Statistical Test Suite(STS)是由美國國家標準暨技術研究院發布的完整統計測試集合,專門用於評估亂數產生器(RNG)與偽亂數產生器(PRNG)的隨機性與品質。它的最大優勢在於標準化:不同產品、不同供應商的亂數產生器,都能以同一套方法進行一致且可比較的評估。HydraCore RandomAnalyzer 使用的是 STS 2.1.2 版本,涵蓋以下 15 項檢定:
| # | 檢定名稱 | 檢查重點 |
|---|---|---|
| 1 | Frequency (Monobit) Test 頻率檢定 | 整個數列中 0 與 1 的比例是否接近 1:1。其他所有檢定都以通過此項為前提。 |
| 2 | Frequency Test within a Block 區塊頻率檢定 | 在每個 M 位元區塊中,1 的數量是否約為 M/2 |
| 3 | Runs Test 連串檢定 | 連續相同位元(Run)的總數是否符合預期,判斷 0 與 1 的交替是太快還是太慢 |
| 4 | Longest Run of Ones in a Block 區塊最長連串檢定 | M 位元區塊內最長的連續 1 長度是否符合隨機數列的預期 |
| 5 | Binary Matrix Rank Test 二元矩陣秩檢定 | 將數列切成子矩陣計算秩,檢查固定長度子字串之間是否存在線性相依 |
| 6 | Discrete Fourier Transform (Spectral) Test 頻譜檢定 | 以離散傅立葉轉換偵測週期性特徵;超過 95% 門檻的峰值比例是否明顯偏離 5% |
| 7 | Non-overlapping Template Matching Test 非重疊模板比對檢定 | 特定非週期性位元模式出現次數是否過多;找到模式後視窗跳到模式之後 |
| 8 | Overlapping Template Matching Test 重疊模板比對檢定 | 同上,但找到模式後視窗只滑動一個位元,可偵測重疊出現的模式 |
| 9 | Maurer's Universal Statistical Test 通用統計檢定 | 相同模式之間的位元距離,判斷數列能否被大幅無損壓縮;可明顯壓縮即非隨機 |
| 10 | Linear Complexity Test 線性複雜度檢定 | 產生該數列所需的線性回饋移位暫存器(LFSR)長度;長度過短代表數列不夠複雜 |
| 11 | Serial Test 序列檢定 | 所有 2m 種 m 位元重疊模式的出現頻率是否大致相同 |
| 12 | Approximate Entropy Test 近似熵檢定 | 比較相鄰長度(m 與 m+1)重疊區塊的頻率,是否符合隨機數列的預期 |
| 13 | Cumulative Sums (Cusum) Test 累積和檢定 | 將位元轉為 ±1 後的隨機漫步最大偏離量;隨機數列的偏離應接近零(正向與反向各一個 p 值) |
| 14 | Random Excursions Test 隨機偏移檢定 | 隨機漫步的每個循環中,造訪狀態 ±1~±4 的次數是否符合預期(共 8 項子檢定) |
| 15 | Random Excursions Variant Test 隨機偏移變體檢定 | 隨機漫步中狀態 ±1~±9 被造訪的總次數是否偏離預期(共 18 項子檢定) |
4. 使用 HydraCore RandomAnalyzer
RandomAnalyzer 將 NIST STS 封裝成一個簡單的 Python 介面,可直接在 HydraVision 的測試案例中使用。整體流程分為五個步驟:
匯入模組
從 hydra_core.utils.randomness 匯入 RandomAnalyzer。
收集樣本
取得至少 1,000,000 個位元的亂數資料。
儲存資料
將亂數存成二進位檔案,或保存在 Python 清單(list)中。
執行分析
呼叫 analyze() 執行全部統計檢定。
檢視結果
讀取回傳的摘要清單,或到 result_dir 查看詳細報告。
4.1 範例一:分析二進位檔案
import random from math import ceil from hydra_core.utils.randomness.RandomnessAnalyzer import RandomAnalyzer def test_analyze_binary_file(tmpdir: str) -> None: analyzer = RandomAnalyzer() file_path = tmpdir + '/unittest_random_numbers.bin' # 產生 8000 個 256 位元亂數並寫入檔案(約 2,048,000 位元) with open(file_path, 'wb') as f: numbers = [random.getrandbits(256) for _ in range(8000)] for n in numbers: f.write(n.to_bytes(ceil(len(format(n, 'x')) / 2), byteorder='big')) result_dir, results = analyzer.analyze(str(file_path))
4.2 範例二:直接分析數值清單
import random from hydra_core.utils.randomness.RandomnessAnalyzer import RandomAnalyzer def test_analyze_object() -> None: analyzer = RandomAnalyzer() numbers = [random.getrandbits(256) for _ in range(8000)] result_dir, results = analyzer.analyze(numbers)
提示:以上範例使用 Python 的 random 模組產生測試資料,僅用來示範 API 的使用方式。實際測試時,應將這段替換為從受測 ECU 收集到的亂數,例如 SecurityAccess 的 Seed。
5. 分析結果判讀
analyze() 回傳兩個值:result_dir(詳細結果目錄)與 results(摘要清單,型別為 List[Dict[str, str]])。摘要清單中每一筆對應一項檢定,包含以下欄位:
| 欄位 | 說明 |
|---|---|
directory / test | 檢定的結果目錄名稱與完整名稱 |
description | 檢定目的說明 |
p_value | 檢定的 p 值;部分檢定有多個 p 值,如 Serial 的 p_value1/p_value2、Cusum 的正向/反向、模板比對的 p_values(每個模板一個) |
Evaluation | 自動判定結果:p 值正常,或列出超出參考範圍的 p 值 |
error / warning | 檢定無法執行或不適用時的訊息 |
5.1 範例結果解讀
以官方範例的輸出為例(約 200 萬位元的測試資料),各檢定結果如下:
| 檢定 | p 值 | 判讀 |
|---|---|---|
| Frequency (Monobit) | 0.760835 | 正常 |
| Frequency within a Block | 0.156094 | 正常 |
| Runs | 0.629743 | 正常 |
| Longest Run of Ones | 0.951534 | 正常 |
| Binary Matrix Rank | 0.427107 | 正常 |
| DFT (Spectral) | 0.748868 | 正常 |
| Non-overlapping Template Matching | 多個模板,少數超出範圍 | 需進一步判讀(見下方說明) |
| Overlapping Template Matching | 0.833346 | 正常 |
| Maurer's Universal | — | 錯誤:L IS OUT OF RANGE |
| Linear Complexity | 0.410066 | 正常 |
| Serial | 0.787024 / 0.506430 | 正常 |
| Approximate Entropy | 0.380121 | 正常 |
| Cumulative Sums | 0.924924 / 0.661933 | 正常 |
| Random Excursions(含 Variant) | — | 不適用:循環數不足 |
判讀時有三個常見情況需要特別注意:
- 多重檢定的少數失敗:Non-overlapping Template Matching 會針對上百個模板各算出一個 p 值。即使是完美的亂數產生器,在大量檢定中也會有少數 p 值純粹因機率落在參考範圍之外。範例中 RandomAnalyzer 以
0.1 < p_value < 0.99為參考範圍並列出超出的值,判讀時應看超出範圍的比例是否明顯偏高,而非單一數值。 - 錯誤(error):Maurer's Universal 回報「L IS OUT OF RANGE」,代表檢定參數與資料長度不相容、檢定無法執行,並非數列不隨機。可增加樣本長度後重新分析。
- 不適用(warning):Random Excursions 兩項檢定需要隨機漫步回到原點的循環數達到一定數量才適用。循環數不足時檢定不適用,同樣不代表失敗。
5.2 詳細結果目錄
需要更深入的分析時,可直接查看 result_dir 中由 NIST STS 產生的完整檔案:
# 結果目錄結構 $ ls /<result_dir_path>/sts-2.1.2/ assess copied_random_numbers.bin data experiments include makefile obj results.txt src templates # 各檢定的詳細結果與總結報告 $ ls /<result_dir_path>/sts-2.1.2/experiments/AlgorithmTesting ApproximateEntropy CumulativeSums finalAnalysisReport.txt Frequency LongestRun OverlappingTemplate RandomExcursionsVariant Runs Universal BlockFrequency FFT freq.txt LinearComplexity NonOverlappingTemplate RandomExcursions Rank Serial
其中 finalAnalysisReport.txt 是 NIST STS 的標準總結報告,每項檢定也各有獨立目錄保存統計細節,適合作為測試報告的附件或稽核佐證。
6. 實務應用:分析 ECU 的 SecurityAccess Seed
將 RandomAnalyzer 與 HydraVision 的 SecurityAccess 測試結合,就能對 ECU 的 Seed 產生器做出完整評估:
- 收集 Seed:執行
UdsSecurityAccessSeedAnalysisExtended,每個安全層級最多可收集 20,000 個 Seed,並寫入SeedAnalysis_seed_times.log。 - 確認樣本量:NIST 檢定需要至少 1,000,000 個位元。以 4 位元組(32 位元)的 Seed 計算,需要至少 31,250 個 Seed;Seed 越長,所需數量越少。樣本不足時,部分檢定會出現錯誤或不適用。
- 執行分析:將收集到的 Seed 串接成位元流,交給
analyzer.analyze()。 - 整合到測試流程:可將收集與分析步驟包裝成自訂測試案例,讓分析結果與
finalAnalysisReport.txt成為測試工作的產出檔案,一併納入 HydraVision 的報告中。
| 比較項目 | SeedAnalysis 測試案例 | NIST 統計檢定(RandomAnalyzer) |
|---|---|---|
| 定位 | 快速篩檢 | 深度統計驗證 |
| 樣本量 | 40~20,000 個 Seed | 至少 1,000,000 位元 |
| 檢查內容 | 唯一性、長度一致性、最小長度、位元組熵值、重開機後是否重複 | 15 項統計檢定:分布、連串、週期性、線性相依、可壓縮性等 |
| 可發現的問題 | 固定 Seed、過短 Seed、開機後重複的 Seed | 細微的統計偏差、週期性、弱 PRNG 的線性結構 |
7. 法規與標準對應
| 法規 / 標準 | 關聯 |
|---|---|
| UNECE R155 | 7.3.8 要求密碼模組符合共識標準;附件 5 威脅 26「密碼技術可被破解或應用不足」直接涵蓋弱亂數產生器 |
| GB 44495-2024 | 6.8 要求採用公開、有效的密碼演算法並選擇適當參數;6.9 要求密碼模組符合國際、國家或產業標準 |
| ISO/SAE 21434 | Clause 10 元件層級驗證;亂數品質不足屬於應記錄於弱點報告(WP-10-05)的問題,分析結果可作為驗證報告(WP-10-07)的佐證 |
| NIST STS | 國際通用的亂數統計檢定方法,提供標準化、可比較的評估基準 |
8. 注意事項
-
通過統計檢定 ≠ 密碼學安全:統計檢定只能證明數列「看起來」沒有統計偏差。一個使用固定初始值的 PRNG,其輸出仍可能通過所有檢定,卻在每次開機後產生完全相同的數列。因此應同時搭配
SeedAnalysisReset等重開機測試,並審查亂數產生器的設計與熵來源。 -
樣本量要足夠:至少 1,000,000 位元是基本門檻;樣本不足時,部分檢定會出現錯誤或不適用,降低結論的可信度。
-
看整體而非單點:在大量檢定中出現少數超出範圍的 p 值是正常的統計現象;應關注失敗比例與是否在多次取樣中重複出現。
-
收集樣本的影響:從 ECU 大量收集 Seed 需要長時間、高頻率的請求,可能觸發懲罰時間或鎖定機制,請在台架或授權的測試環境中進行。
9. 捷策動能技術支援
Jotactic 捷策動能提供 dSPACE dissecto HydraVision 相關的全方位技術服務:
測試規劃
依 UNECE R155、GB 44495、ISO/SAE 21434 需求規劃密碼模組與亂數品質驗證。
技術諮詢與結果判讀
協助判讀 NIST 統計檢定結果,釐清發現項目並提出改善建議。
客製化測試開發
開發整合樣本收集與統計分析的客製化 HydraVision 測試案例。
歡迎來電 03-6109669 或來信 info@jotactic.com 洽詢。