控制路徑拒絕錯誤輸出,不等於密碼實作沒有資訊洩漏。DFA 利用正確與故障輸出的差異;SIFA 以故障已注入但輸出仍正確的 ineffective fault 樣本為條件,分析中間值的統計偏差。兩者都要先說清楚攻擊者能做什麼、能觀察什麼。
學習目標與課堂安排
完成本課後,你應能:
- 用可逆 S-box 的差分方程逐一排除金鑰候選。
- 用 Bayes 與熵算出無效故障篩選的偏差。
- 手算訓練平均與留出分類,分開解讀控制安全及資訊洩漏。
建議 50 分鐘的教師安排:攻擊假設 10 分鐘、DFA 演算 15 分鐘、條件分布 10 分鐘、含雜訊手算與互動 15 分鐘。時間含學生手算、互動與討論;這是教學規劃,尚未做學生課堂時間量測。
兩種不同的安全問題
食品工廠的金屬探測器能攔下異物,卻不保證生產紀錄不會透露哪條配方線啟用。第一個是控制安全,第二個是資訊洩漏。密碼電路也可能把錯誤結果擋住,仍透過「錯誤/有效」旗標、完成時間、重試次數或功耗差異洩漏資訊。類比只分開問題,不映射密碼攻擊的統計能力。
DFA 通常比較正確與故障密文,利用特定 round/byte 差異推回密鑰候選;故障位置、時間、輪次與可觀察輸出決定攻擊是否成立。SIFA 則以 ineffective fault 樣本為條件:故障已注入,但輸出仍正確。攻擊者分析這些樣本中間值的條件分布偏差,以區分密鑰候選;不必取得錯誤密文。本文的 effective/ineffective 指注入故障後,運算或輸出是否改變;不是 DUT 的 out_valid 訊號。SIFA 原始論文。
先定義 oracle:攻擊者能選 plaintext 嗎?能重複注入嗎?能分辨 valid、timeout、alert、retry 嗎?是否能量測功耗或電磁?fault model 是 transient、permanent、skip 或資料破壞?再定義每種輸出與 secret 的關聯測試;固定時間本身不是充分證明,統計樣本、噪聲與多重比較也會改變結論。
RTL 層可檢查錯誤狀態不會在 valid、ready、retry 或 key-release 控制上形成未授權分支;但 SVA 對「功耗無關密鑰」不夠。使用 gate-level/netlist 和實體測量做 side-channel 評估,分開記錄控制 property 與資訊洩漏 evidence。
讀結果而不混淆指標
若進行實測,應為每組樣本記錄 fault class、運算是否改變、錯誤旗標、延遲,以及觀察是否能區分不同結果類別。分類器若只在同一批訓練資料看起來好,不算泛化;必須留出未見樣本與明確 confidence。沒有觀察到差異,只代表在該實驗條件下未檢出。
實作案例:密文關掉了,觀察通道還在嗎?
同一顆教學晶片完成啟動後,密碼引擎開始運算。設計已加入「發現錯誤就抑制密文」的控制。工程師準備把這件事寫成防故障攻擊結論;審查者卻問:攻擊者還能看完成時間、拒絕標籤或重試次數嗎?在回答之前,不能把一個輸出閘控推廣成所有資訊通道都被封住。
本課互動模型用 A、B 代表兩種教學類別,沒有替它們設定 AES 密鑰。可分離設定的四個常數碼是 A = [0, 1, 2, 3]、B = [3, 2, 1, 0];介面只選前三個通道:密文碼、一般結果標籤、延遲碼。重疊設定則令兩類都為 [0, 0, 1, 1]。這些數字是任意教學碼,既不是密文內容,也不是量測到的時間單位。
| 通道 | 可分離設定 A / B | 啟用錯誤輸出抑制後 |
|---|---|---|
| 密文碼(channel 0) | 0 / 3 | 模型遮蔽此通道 |
| 一般結果標籤(channel 1) | 1 / 2 | 差異仍可觀察 |
| 延遲碼(channel 2) | 2 / 1 | 差異仍可觀察 |
因此,抑制密文可以改變 channel 0 的觀察,不會自動改變 channel 1、2。請切換通道驗證這個區別。若結果標籤仍分成 1 與 2,讀者看見的是一般結果分類差異;若延遲碼仍分成 2 與 1,讀者看見的是教學 timing 差異。兩者都不能直接稱為 SIFA,更不能據此宣稱已恢復金鑰。
SIFA 的條件篩選,多了一個什麼問題?
SIFA 原始研究指出,攻擊者施加故障後,仍輸出正確密文的樣本也可能提供可利用的偏差。分析對象是以 ineffective fault 為條件保留下來的樣本,而不是單純把 valid 與 invalid 當成兩類。原始論文。本課沒有實作其攻擊演算法;下述例子只解釋條件篩選如何改變分布。
假設一個人工構造的中間位元 X,原先 100 筆樣本中,X = 0 與 X = 1 各有 50 筆。再假設故障施加後,X = 0 的樣本全部保持正確,而 X = 1 只有 10 筆保持正確。只保留輸出正確的 60 筆後,X = 0 占 50/60,X = 1 占 10/60,分別約為 83.3% 與 16.7%。這個條件集合已經偏離原來的各半分布。
此例的 100、50、10 是合成計數,沒有測量設備或 AES 運算。它也沒有讓攻擊者直接讀取 X;真正攻擊還需要把可觀察樣本、密鑰候選與中間值關係連起來。這段推導只用來反駁「輸出仍正確就完全不提供資訊」的直覺。它不能用來估計實際 SIFA 成功率,也不能把互動模型的結果標籤誤當成 ineffective fault 的判定。
訓練準確度與新樣本,是兩份結果
互動實驗另外提供含雜訊的分類練習。預設每類 8 筆、保留 25%,因此每類有 6 筆訓練、2 筆測試;合計 12 筆訓練與 4 筆未見測試。分類器以兩類訓練平均值為中心,將測試點指派給較近的類別,距離相同時指派 A。模型使用固定 seed 13,因此重新執行相同設定是重播同一組合成資料,不是取得另一份獨立量測。
先把雜訊設為 0,便可手算兩個基準。可分離設定的中心不同,四筆測試皆分類正確,為 4/4。重疊設定的中心相同,四筆都遇到平手而被指派 A;A 的兩筆正確、B 的兩筆錯誤,為 2/4。這個 50% 來自固定平手規則與平衡樣本,不是證明所有可能攻擊只能猜中一半。增加雜訊後應讀取實際生成的值與測試結果,不能沿用零雜訊答案。
重複的常數碼即使每類列出四次,也沒有四份獨立的 noisy evidence。相反地,樣本多、設定多也不保證分析可靠:若先試許多觀察通道,再只報最佳的一個,結論會受選擇過程影響。驗證計畫應事先記錄通道、類別定義、樣本分割與判準;本課四筆測試只能協助讀者理解流程,不能提供有力的產品安全界限。
延伸練習:控制安全與資訊洩漏分開作答
練習 A:看似矛盾的兩個結果。 選可分離設定,先在通道 0(密文)開啟錯誤輸出抑制,記錄「已抑制」;再保持勾選,切到通道 2(延遲),記錄兩類代碼。抑制控制只作用於密文通道,所以延遲頁不會再次顯示「已抑制」。這兩次合成觀察如何分別報告?
解答與推導: 分別記錄資料控制與延遲觀察:模型遮蔽密文碼,合成延遲碼仍不同。不能寫成抑制無效,也不能寫成完全安全;它做到了指定的控制功能,尚未處理另一通道。實體 timing 差異仍需要真正量測。
練習 B:改寫過大的結論。 報告寫「分類器在重疊設定只有 2/4,所以沒有 side channel」。請保留實際結果,改成範圍正確的句子。
解答與推導: 可寫:「在此固定種子、零雜訊、兩類各兩筆測試的重疊設定下,這個最近平均值分類器正確 2/4;其他通道、分類方法、樣本條件與實體量測尚未評估。」句子保留觀察,也讓下一位工程師知道哪些結論仍未成立。
練習 C:找出 vacuous pass。 error_seen |-> !out_valid 通過,卻沒有任何 error_seen 記錄。先列出這份結果缺少什麼,再說明要如何補證據。
解答與推導: 缺少前件確實發生的證據。先以 cover 或 trace 確認指定故障類別與 error_seen 在模型中出現,再查錯誤期間的 out_valid。Ready、retry、key-release 與延遲各需自己的分析;這條 assertion 不會一起檢查它們。即使控制性質通過,也未完成功耗、電磁或 SIFA 的評估。
課堂推導:用兩對輸出刪掉錯誤金鑰猜測
先備知識是 XOR 與可逆替代表。XOR 同一個值兩次會回到原值;S-box 將輸入替換成另一個值,若一對一,便可建立逆表 S⁻¹。AES 的最後一輪包含 SubBytes、ShiftRows 與 AddRoundKey,略去 MixColumns;實際 AES DFA 還需處理位元組位置、故障傳播與輪金鑰關係。FIPS 197 的 CIPHER 定義。本節先用較小的自訂四位元教具,把候選篩選完整算一次。
教具定義 C = S(X) ⊕ K,故障輸出 C′ = S(X ⊕ e) ⊕ K。X 是攻擊者看不到的內部值,K 是四位元秘密,已知故障 e = 1,施加位置在 S-box 前。攻擊者可觀察同次正常/故障輸出配對,且假設兩次使用相同 X、K,只有指定的 e 改變。這些條件很強,故障位置或配對若不符合,下面的候選規則就不適用。
| 輸入 x(hex) | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | A | B | C | D | E | F |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 自訂 S(x) | 6 | D | 0 | B | 7 | 2 | F | 8 | 5 | A | 4 | 1 | C | 9 | 3 | E |
| S⁻¹(x) | 2 | B | 5 | E | A | 8 | 0 | 4 | 7 | D | 9 | 3 | C | 1 | F | 6 |
對每個猜測 k,先用 C ⊕ k 移除猜測的輸出金鑰,再查逆表,得到猜測的故障前值。同樣處理 C′。保留滿足 S⁻¹(C ⊕ k) ⊕ S⁻¹(C′ ⊕ k) = e 的 k。第一對輸出 C = 1、C′ = A:k = A 時,1 ⊕ A = B、A ⊕ A = 0;逆表給出 S⁻¹(B) = 3、S⁻¹(0) = 2,3 ⊕ 2 = 1,故保留。k = 0 時得到 B ⊕ 9 = 2,與 e 不符,故刪除。
| 第一對的 k | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | A | B | C | D | E | F |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 逆推 XOR 差分 | 2 | 1 | 9 | 8 | 7 | C | 8 | 1 | 8 | 9 | 1 | 2 | 1 | 8 | C | 7 |
| 保留? | 否 | 是 | 否 | 否 | 否 | 否 | 否 | 是 | 否 | 否 | 是 | 否 | 是 | 否 | 否 | 否 |
第一對留下 {1, 7, A, C}。第二對輸出 C = 5、C′ = 2,依相同規則留下 {A, D}。兩個候選集合交集只有 {A},所以在這個自訂教具及指定故障假設下,兩對輸出把十六個猜測縮成一個。重算程式還列出第三對 0/F,其候選 {5, A} 與交集仍為 {A}。教師產生資料的內部 X 分別為 3、6、9、K = A;它們用於核對答案,不是額外提供給攻擊者的觀測。
這個算例揭示 DFA 如何利用錯誤輸出的約束。它使用四位元自訂替代表與單次替換,沒有實作 AES 或標準密碼。若設計確實不釋出 C′,攻擊者就缺這條教具所需的方程;但延遲、標籤或無效故障條件集合仍須各自分析。這正是上方通道模型與下方 SIFA 推導要分開的原因。
給條件分布一個明確的故障模型
上方 50/50→50/10 的合成計數可由以下抽象模型產生:X = 0 時,故障操作仍保持 0;X = 1 時,操作有 80% 改成 0、20% 保持 1。再假設 X 改變就造成可辨認的錯誤輸出,X 不變就輸出正確。80/20 是教具指定的機率,沒有來自量測;它也有別於「確定性 stuck-at-0」會把所有 1 改成 0 的情況。
令 I 表示已施加故障操作後仍輸出正確。P(X=0)=P(X=1)=0.5,P(I|X=0)=1、P(I|X=1)=0.2,所以 P(I)=0.5×1+0.5×0.2=0.6。Bayes 公式給出 P(X=0|I)=0.5/0.6=5/6,P(X=1|I)=0.1/0.6=1/6。這才是 83.3%/16.7% 的來源。
用二元熵 H(X) = −Σ p log₂p 表示這個位元的分布不確定性,原先為 1 bit;條件集合中為 −(5/6)log₂(5/6)−(1/6)log₂(1/6) ≈ 0.650 bit。這是 X 在指定條件下的熵,不是密鑰恢復了 0.350 bit 的結論。還需建立密鑰候選與可觀察資料的關係,才能討論攻擊。若偵測器在這個理想教具中完全抑制錯誤結果,攻擊者可取得的正常結果集合就受到上述篩選;錯誤密文消失,偏斜卻可能留下。
含雜訊的平均值,請自己重算一次
選 channel 0、可分離設定、seed 13、noise 1、每類 8 筆、留出 25%。A 的六筆訓練值約為 −0.517788、0.441483、−0.903723、0.894415、−0.757850、0.390318;B 為 2.915432、2.298159、2.684098、3.100048、2.657256、3.280248。使用未四捨五入原值,平均為 −0.075524 與 2.822540。
| 未見樣本 | 值(約) | 到 A 平均的距離 | 到 B 平均的距離 | 預測 |
|---|---|---|---|---|
| A1 | −0.373950 | 0.298426 | 3.196490 | A |
| A2 | 0.949992 | 1.025516 | 1.872548 | A |
| B1 | 2.517490 | 2.593015 | 0.305050 | B |
| B2 | 3.147977 | 3.223502 | 0.325437 | B |
四筆都正確,4/4。這次結果由固定程式與參數生成,不延伸成其他雜訊、通道或 seed 的保證。下載 JSON 保留完整精度;用表中的六位小數重算會有微小捨入差。
計算練習: 只取第一對 DFA 的 C/C′,有幾個候選?再加第二對後還剩幾個?若只報「第三對吻合」,卻省略前兩對的交集,讀者缺了什麼?
完整解答: 先剩四個,再剩一個 A。第三對只是讓目前候選再通過一條約束,不能替代前兩次刪除過程。學生要能從公開 S-box、輸出配對、e 與候選規則重建集合;JSON 列出第一對全部十六個猜測及逆推值。
偵測也要沿完整交易查驗。例如 fault 在 edge 2、未授權 out_valid 在 edge 4、error_seen 在 edge 5,且 edge 5 的 out_valid 已低;同拍 error_seen |-> !out_valid 會通過,卻漏掉 edge 4。應另由 harness 為該交易記錄期望授權、首個輸出、錯誤可觀察窗口及結束條件,再檢查每個輸出接受。窗口長度與 reset/取消規則由設計契約給出,本課不虛構一條適用所有引擎的 window SVA。
JSON 與 Python 使用十進位;本文表格使用十六進位。例如 A=10、C=12、D=13。核對候選集合前,先把進位表示轉成同一種。
重算與核對
下載程式與結果 JSON 到同一資料夾,以 Python 3.8 以上執行:
python rtl-university-workbook-v1.py --output replay.json
比對 replay.json 與提供的結果檔,先核對本課的 lesson13 欄位。sourceSha256 記錄程式檔案的位元組身分,與算例正確性分開檢查;若編輯內容或把 LF 另存成 CRLF,這個值也會改變。保留原下載檔再做練習,並將學生改版另存,才能分辨方法改變與檔案改變。
離線互動實驗
實驗以固定種子的合成資料展示樣本數、觀測雜訊與保留樣本如何影響分類結果。「常數比較可區分」只描述重複的常數代碼;含雜訊練習的泛化表現則由另一列留出測試準確度呈現。這是教學模型,不是實測洩漏、RTL 結果或攻擊成果。
RTL/SVA 審查方向
以下為性質草案:先定義 harness 的 transaction、reset 與 oracle,並確認取樣邊界,再接入設計;尚未編譯或證明。
assert property (@(posedge clk) disable iff (!rst_n)
error_seen |-> !out_valid);
cover property (@(posedge clk) disable iff (!rst_n)
fault_class_applied && error_seen);
這條 assertion 只在 error_seen 時檢查 out_valid 為低;它沒有檢查 ready、retry 或 key-release,這些控制各自需要 property。若 error_seen 從未成立,assertion 仍可能 vacuous pass。fault_class_applied 是 harness 記錄本次模型測試已施加指定故障類別的旗標。cover 確認該旗標與 error_seen 都發生;它不證明故障已成功注入實體晶片,也不能取代 DFA、SIFA 或延遲觀察的個別分析。此片段不證明 CDC、timing、side-channel 或實體注入;需由各自工具與測量提供證據。
檢核問題
- 辨認:DFA 主要觀察什麼?SIFA 又可能觀察什麼? 推理: DFA 利用正確與錯誤輸出的差異。SIFA 以 ineffective fault 樣本為條件,分析其中間值的統計偏差;effective/ineffective 指運算或輸出是否改變,不是 DUT 的 output-valid 腳位。
- 比較:拒絕錯誤輸出為什麼不能證明密碼模組沒有資訊洩漏? 推理: 拒絕屬於控制安全。Error flag、validity、retry、latency 或 power 仍可能隨秘密相關狀態變化。
- 情境:faulty ciphertext 已抑制,但兩種秘密相關類別的完成延遲不同。還有什麼暴露? 推理: Timing channel 仍可觀察。抑制資料輸出只遮蔽錯誤密文通道,不能證明實作具 constant-time 行為。
- 故障診斷:訓練樣本中的 fault-outcome code 可分開兩類,還缺哪些證據? 推理: 先定義結果類別,再檢查樣本數、雜訊、重複試驗與保留測試資料。小型合成樣本的規律不是校準後的攻擊結果。
- 設計風險/轉移:加入隨機延遲或改用新樣本後,oracle 哪些部分改變?若這次樣本沒有顯示差異,可以下什麼結論? 推理: 記錄延遲與樣本條件的改變。只能說這組樣本與觀測沒有區分類別;其他通道、條件與實體量測仍未排除。
延伸閱讀
DFA of AES (IACR ePrint 2011/178) · SIFA 原始論文 (IACR ePrint 2018/071) · SIFA on masked AES (IACR ePrint 2018/357) · SIFA 防護方法 (IACR ePrint 2019/536)
MY ACADEMY · LESSON FILM
教學影片
影片依序說明本課的資料路徑。看完一段,可以回到下面的互動練習,改變輸入或故障條件。動畫呈現教學模型;它沒有替代 RTL 模擬。
左右滑動影片,或用方向鍵查看圖卡。
圖卡的範圍說明
教學模型 · 非 RTL 模擬或晶片實測
概念圖與合成教學範圍;不是 SIFA 攻擊、金鑰恢復或晶片測量
旁白使用合成聲音。互動教學與動畫均有模型邊界;請以本課的來源與驗證範圍解讀結果。
Wrap-up|把這一課帶回設計審查
- 威脅模型與成立條件
攻擊者可能重複故障並觀察密文、有效旗標、延遲或功耗;資產是密鑰/中間值。
- 失效原因
DFA 利用正確/故障輸出差異;SIFA 以 ineffective fault 樣本為條件,分析其中間值的統計偏差。
- 防護方法
限制故障與oracle能力、驗證輸出遮蔽/錯誤流程,並對物理側通道做獨立統計評估。
- 驗證方式與待做檢查
故障類別與可觀察結果分開記錄;effective/ineffective 描述運算或輸出是否改變,不等於 DUT 的 out_valid。控制 assertions 不能取代攻擊成功率/資訊量分析。
- 防護界線與未驗證項目
合成樣本非密碼實測;無模型的未檢出不能證明零洩漏,也不涵蓋所有功耗/電磁攻擊。
換個情境再想一次
加入隨機延遲與重新取樣,討論它改變哪種 oracle,哪種攻擊仍然可行。
以上整理對照本課的教學案例、參考資料與實驗範圍;未列為已完成的驗證,都是後續工作。