TECH ARTICLE

【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 項檢定:

# 檢定名稱 檢查重點
1Frequency (Monobit) Test
頻率檢定
整個數列中 0 與 1 的比例是否接近 1:1。其他所有檢定都以通過此項為前提。
2Frequency Test within a Block
區塊頻率檢定
在每個 M 位元區塊中,1 的數量是否約為 M/2
3Runs Test
連串檢定
連續相同位元(Run)的總數是否符合預期,判斷 0 與 1 的交替是太快還是太慢
4Longest Run of Ones in a Block
區塊最長連串檢定
M 位元區塊內最長的連續 1 長度是否符合隨機數列的預期
5Binary Matrix Rank Test
二元矩陣秩檢定
將數列切成子矩陣計算秩,檢查固定長度子字串之間是否存在線性相依
6Discrete Fourier Transform (Spectral) Test
頻譜檢定
以離散傅立葉轉換偵測週期性特徵;超過 95% 門檻的峰值比例是否明顯偏離 5%
7Non-overlapping Template Matching Test
非重疊模板比對檢定
特定非週期性位元模式出現次數是否過多;找到模式後視窗跳到模式之後
8Overlapping Template Matching Test
重疊模板比對檢定
同上,但找到模式後視窗只滑動一個位元,可偵測重疊出現的模式
9Maurer's Universal Statistical Test
通用統計檢定
相同模式之間的位元距離,判斷數列能否被大幅無損壓縮;可明顯壓縮即非隨機
10Linear Complexity Test
線性複雜度檢定
產生該數列所需的線性回饋移位暫存器(LFSR)長度;長度過短代表數列不夠複雜
11Serial Test
序列檢定
所有 2m 種 m 位元重疊模式的出現頻率是否大致相同
12Approximate Entropy Test
近似熵檢定
比較相鄰長度(m 與 m+1)重疊區塊的頻率,是否符合隨機數列的預期
13Cumulative Sums (Cusum) Test
累積和檢定
將位元轉為 ±1 後的隨機漫步最大偏離量;隨機數列的偏離應接近零(正向與反向各一個 p 值)
14Random Excursions Test
隨機偏移檢定
隨機漫步的每個循環中,造訪狀態 ±1~±4 的次數是否符合預期(共 8 項子檢定)
15Random Excursions Variant Test
隨機偏移變體檢定
隨機漫步中狀態 ±1~±9 被造訪的總次數是否偏離預期(共 18 項子檢定)

4. 使用 HydraCore RandomAnalyzer

RandomAnalyzer 將 NIST STS 封裝成一個簡單的 Python 介面,可直接在 HydraVision 的測試案例中使用。整體流程分為五個步驟:

01

匯入模組

從 hydra_core.utils.randomness 匯入 RandomAnalyzer。

02

收集樣本

取得至少 1,000,000 個位元的亂數資料。

03

儲存資料

將亂數存成二進位檔案,或保存在 Python 清單(list)中。

04

執行分析

呼叫 analyze() 執行全部統計檢定。

05

檢視結果

讀取回傳的摘要清單,或到 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 Block0.156094正常
Runs0.629743正常
Longest Run of Ones0.951534正常
Binary Matrix Rank0.427107正常
DFT (Spectral)0.748868正常
Non-overlapping Template Matching多個模板,少數超出範圍需進一步判讀(見下方說明)
Overlapping Template Matching0.833346正常
Maurer's Universal—錯誤:L IS OUT OF RANGE
Linear Complexity0.410066正常
Serial0.787024 / 0.506430正常
Approximate Entropy0.380121正常
Cumulative Sums0.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 R1557.3.8 要求密碼模組符合共識標準;附件 5 威脅 26「密碼技術可被破解或應用不足」直接涵蓋弱亂數產生器
GB 44495-20246.8 要求採用公開、有效的密碼演算法並選擇適當參數;6.9 要求密碼模組符合國際、國家或產業標準
ISO/SAE 21434Clause 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 洽詢。