Implementation
為什麼加密庫容易受到定時攻擊時使用表查找?
來自BouncyCastle的 AESEngine.java 與 OpenSSL 中的aes_x86core.c一樣使用表查找。但是像 OpenSSL 和 BouncyCastle 所做的對 AES 表查找的每個記憶體定時攻擊都容易受到定時攻擊。那麼他們為什麼要使用它們呢?
我認為有兩個原因:
- 基於非表的 AES 實現是可能的,但是(假設你沒有 AES-NI 或類似的東西)比基於表的實現慢得多(也許 $ 10\times $ 至 $ 20\times $ 慢點)
- 對於很多用途,定時攻擊並不是特別相關(因為攻擊者無法獲得開始/停止時間,或者無法使它們達到對 AES 實際執行此類攻擊所需的精度)
請記住,當我們處理邊通道攻擊時,可能有多種攻擊模型:
- 在最簡單的層面上,攻擊者無法獲得有關加密過程的資訊;他可以(可能)送出選擇的明文和密文,但加密操作看起來像一個抽象的 Oracle
- 攻擊者可能會獲得一些關於加密過程需要多長時間的資訊(在一定程度上)
- 攻擊者還可能獲得有關加密程序表的記憶體訪問的一些資訊(基於記憶體的側通道攻擊)
- 攻擊者可能會在加密過程中獲得有關設備電子門狀態的一些資訊(DPA、基於 EM 的側通道攻擊)
- 攻擊者可能會在加密過程中導致計算錯誤(故障密碼分析)
- 攻擊者可能會不受限制地訪問整個加密過程(白盒密碼術)
隨著您向下堆棧所需的對策變得越來越昂貴;一個實現會說“我們會走這麼遠,不會走得更遠”這聽起來很合理