?

基于RISC-V的防御側信道攻擊AES軟件實現方案

2021-11-02 11:48焦芃源殷樹娟李翔宇
微處理機 2021年5期
關鍵詞:掩碼字節密鑰

焦芃源,殷樹娟,李翔宇,李 涵

(1.北京信息科技大學理學院,北京100192;2.清華大學微電子學研究所,北京100084)

1 引言

隨著信息技術的飛速發展,信息的安全傳輸與存儲問題也備受關注。高級加密標準(Advanced Encryption Standard,AES)是美國國家標準技術研究所(NIST)在2001年發布的一種分組加密算法,能夠滿足現代密碼學中對加密算法的計算安全性的要求[1],目前已廣泛應用于信息加密傳輸與存儲。側信道分析攻擊[2]是利用密碼設備在進行加密算法運行期間的能量消耗、時間差異、電磁輻射等信息,根據算法中間值與操作之間的相關性進行密鑰破譯的技術。其中,能量側信道分析是一種成本較低的攻擊技術。未加防護的AES算法在嵌入式處理器中的軟件實現已被證明是可以破解的。焦鉻等人[3]針對未加防護的AES算法設計了能量相關性分析平臺并成功完成了攻擊。諸多防御側信道攻擊的對策也隨之出現。此類防御對策可分為隱藏對策和掩碼對策兩類,均以消除密碼設備的能量消耗與加密算法運行密鑰及敏感操作的相關性為目標[4]。隱藏對策通過對密碼設備進行特殊構建,使得密碼設備在各個時鐘周期的能量消耗隨機化或均等化,以此消除相關性。吳鏡聰[5]研究了基于隱藏對策的雙軌邏輯和混沌觸發器電路的AES算法硬件防護方案。掩碼對策則通過對算法運行中間值添加隨機掩碼的方式使得中間值變得隨機化,從而消除相關性。苑志剛[6]研究了抵抗功耗攻擊的掩碼AES算法在硬件上的實現方案,但其硬件防護方案靈活性較低,可移植性受硬件環境制約。在已有成果基礎上,此處使用掩碼對策,基于RISC-V架構嵌入式處理器,嘗試實現一套全掩碼保護的AES算法的軟件方案。

2 AES算法結構

AES算法的明文分組和密鑰長度為128比特。每個明文分組的加密由10輪操作完成。每輪操作又分為SubBytes(字節替代,也稱為S盒操作)、Shift Rows(行移位)、MixColumns(列混淆)和AddRound Key(輪密鑰加)四類基本操作。在進行每輪操作時,將每個明文分組看作4×4的16字節狀態矩陣參與運算。其中,SubBytes操作可以通過查詢一個16×16的S盒來完成,即將狀態矩陣的每個字節的高4位和低4位看作S盒坐標來完成字節替換;ShiftRows操作通過將狀態矩陣的第i行循環左移i-1個字節來完成;Mixclomuns操作通過將狀態矩陣左乘一個常數矩陣來完成;AddRoundKey操作即狀態矩陣的每個字節與密鑰矩陣相應字節的異或運算。在進行各輪操作之前,還需要進行密鑰的擴展,將128比特的密鑰分為32位的4組初始密鑰參與10輪加密操作前的AddRoundKey操作,由這4組初始密鑰再通過密鑰編排算法生成40組擴展密鑰參與10輪的加密操作。

3 全掩碼AES方案軟件實現

掩碼對策要求算法運行過程中的中間值始終處于被掩碼的狀態。對中間數據加掩碼可以采用布爾掩碼的方式。布爾掩碼即對算法中間值與掩碼進行異或運算。密碼算法中的線性函數使用布爾掩碼很容易實現。AES算法中的ShiftRows、MixClolumns與AddRoundKey均為線性操作,因此均適合使用與掩碼異或的方式來實現防護。SubBytes操作是8位字節輸入輸出的非線性運算,可使用查表的方式實現。但是使用掩碼對查表操作進行防護時需要構造一個形如Sm:Sm(in⊕m)=S(in)⊕m的掩碼型的查找表,即滿足輸入字節in加掩碼m后查Sm表的值等于輸入字節查S表的值再加掩碼。這種查表的方式需要針對每一個掩碼值生成一次“Sm”,運算性能非常低。

另一種實現SubBytes運算的方式是使用有限域分解。AES算法中的每一個8位字節均可以看作為有限域GF(28)中的元素[7],SubBytes操作在有限域上的實現可以看作是一個兩步的變換:對輸入GF(28)元素求乘法逆元和對逆元進行仿射變換。

一個GF(28)元素的求逆運算可以分解為GF(24)元素的加法、求逆、乘法以及平方倍乘運算。GF(24)元素的平方倍乘運算可以分解為GF(22)元素的加法、平方和倍乘運算。GF(22)元素的乘法分解為GF(2)元素的加法、乘法和倍乘運算。通過這樣的變換,GF(28)元素的求逆這一非線性運算即可被轉換為一系列的線性運算,以此可以使用布爾掩碼完成對SubBytes運算的防護。

設SubBytes運算的輸入字節A是輪加密過程中的一個中間值,掩碼為M,經M掩碼后的A記作A。對A求乘法逆元得到A-1;仿射變換后輸出字節的掩碼為M'。根據文獻[8]中的有限域分解法,有:

式中,M=M1Y16+M0Y,M1=m11X4+m10X。

此外,被掩碼后的中間值會參與到子域中乘法等非線性運算中,運算后的結果將不是均勻分布的,從而使得防護失效。因此在求逆過程中需要在一些非線性運算的結果加上獨立的掩碼。在本方案中,對GF(28)元素求逆結果的掩碼M進行同樣的變換得到校正掩碼M'。

整體掩碼防護方案流程如圖1所示。在C語言下AES輸入128比特的明文和初始密鑰,使用兩個unsigned char數組來存放。首先進行密鑰編排生成子密鑰。為加快加密過程的速度,程序采用預先離線生成子密鑰的方法。定義KeyExpansion()函數實現密鑰的編排。44組子密鑰均為32位寬,且10輪加密中每輪使用到的4組子密鑰均由前一輪加密使用的4組密鑰派生得到,故可采用一個循環次數共10次的for循環來實現密鑰的派生。循環開始前定義一個有44個unsigned int變量的數組keyA來存放子密鑰,并使用掩碼mk對各組子密鑰進行異或加掩碼。密鑰編排完成后執行10輪加密前的初始密鑰加操作。因為加密輪函數中有字節操作,所以使用unsigned char數組作為AES狀態的數據結構。

圖1 系統總體方案

初始密鑰加操作前先將含有16字節的狀態矩陣進行操作,將含有16個unsigned char變量的一維明文數組和存放4組初始密鑰的一維數組分別放入二維數組state和k中,然后逐字節執行異或操作。該異或操作被封裝在AddRoundkey()函數中,函數的參數為初始密鑰、二維數組形式的明文和初始值為0的前一操作輸出掩碼。因為由于密鑰本身是帶有掩碼的,這使得異或后的狀態矩陣也處于被掩碼保護的狀態。初始密鑰加操作的輸出掩碼為mk。

在后續10輪的輪密鑰加操作也使用AddRoundKey函數實現,與初始密鑰加操作不同的是,第1~9輪輪密鑰加函數參數中前一操作輸出掩碼的值為列混淆輸出掩碼mc1'、mc2'、mc3'、mc4'。第10輪輪密鑰加操作后需要還原出真實的密文,由于第10輪加密不包含列混淆操作,因此將第10輪輪子密鑰掩碼與前一操作輸出掩碼異或后的之傳入函數從而消除最終加密密文的掩碼。

初始密鑰加操作后執行9輪的四個基本加密操作。SubBytes操作使得狀態字節的掩碼由mk變為mk'。在C實現中,定義函數SubByte()來實現該功能。SubBytes()函數的參數為存放狀態矩陣的二維數組state、輸入掩碼mk,Q和輸出掩碼mk'。SubBytes函數內使用for循環完成對狀態矩陣的每一個字節進行GF(28)求逆和仿射變換的遍歷。其中GF(28)求逆過程中使用到對8位字節中1位、2位和4位的數據的運算。故使用三種包含兩個位域成員的結構體表示GF(28)、GF(24)、GF(22)元素。

處理過程中涉及到GF(24)元素的求逆、異或、平方倍乘和GF(22)元素的求逆(平方)、異或、乘法、倍乘運算。因此將這些操作封裝為7個函數供調用。各運算流程由圖2給出。

圖2 各算法計算流程

在此定義函數ShiftRows()。函數的參數只有表示狀態矩陣的二維數組state。函數體內使用一個for循環遍歷數組的每一行,并將每一行的4個unsigned char類型元素左移24、16、8、0位。將移位后的數據的進行按位或運算拼接,轉換為一個unsigned int類型的元素,接著對該元素進行循環左移位,再分別右移24,16,8,0位并轉換為unsigned char類型的4個元素完成ShiftRows操作。在第1~9輪加密中,由于列混合會導致不同行的混合,使可能具有相同掩碼的行的防護失效,故在ShiftRows操作之后對狀態矩陣執行重掩碼的操作。

定義函數Remasking()。函數參數為表示狀態矩陣的二維數組state、狀態矩陣各行需要加的掩碼mc1、mc2、mc3和mc4以及SubByte操作的輸出掩碼mk'。在Remasking()函數體中使用for循環遍歷數組每一行,對各行元素分別通過異或相互獨立的掩碼mc1、mc2、mc3和mc4,再通過異或消去mk',以保證在整個過程中不出現未加掩碼的中間值。執行重掩碼之后可以進行MixCloumns操作,即對狀態矩陣左乘一個4×4常量矩陣。

定義MixColumns()函數。函數參數為表示狀態矩陣的二維數組state、狀態矩陣各行掩碼mc1、mc2、mc3、mc4和MixColumns操作輸出掩碼mc1'、mc2'、mc3'、mc4'。函數體使用一個二維數組來表示該常量矩陣。因為經過MixColumns運算的狀態矩陣與相同變換的掩碼異或后才能得出正確的運算結果,因此,將各行掩碼mc1、mc2、mc3、mc4組成一個4×4矩陣也左乘常量矩陣得出MixColumns操作的輸出掩碼mc1'、mc2'、mc3'、mc4'。

4 方案測試結果分析

設計方案使用嵌入式C語言完成S盒的有限域分解和整體AES算法掩碼防護的程序設計,并使用一款嵌入式開發板運行該軟件實現。該嵌入式開發板具有一個32位的RISC-V架構的處理器,并使用RISC-V交叉編譯工具鏈進行程序的編譯運行。AES軟件實現代碼采用AES-128標準文檔中提供的明文和密鑰樣例作為測試數據,并根據標準文檔中提供的密文為加密結果的正確性做驗證。

程序運行使用的明文、密鑰和加密后的密文如表1所示。測試給出的加密結果與AES標準文檔樣例的結果相同。

表1 AES-128測試結果(16進制表示)

5 結束語

針對能量側信道攻擊對未加防護的AES算法帶來的威脅,采用防御能量側信道攻擊的布爾掩碼作為對策。對算法中的線性操作進行布爾掩碼防護,且針對非線性運算使用布爾掩碼過于復雜的問題,將非線性S盒運算進行有限域分解為線性運算并利用掩碼保護。通過在一個嵌入式RISC-V處理器上運行了該掩碼方案的軟件實現,驗證了方案的正確性與可行性。

猜你喜歡
掩碼字節密鑰
幻中邂逅之金色密鑰
No.8 字節跳動將推出獨立出口電商APP
密碼系統中密鑰的狀態與保護*
No.10 “字節跳動手機”要來了?
低面積復雜度AES低熵掩碼方案的研究
基于MSP430的四旋翼飛行器的S-BUS通信協議的設計與實現
TPM 2.0密鑰遷移協議研究
基于布爾異或掩碼轉算術加法掩碼的安全設計*
解析網絡掩碼
一種對稱密鑰的密鑰管理方法及系統
91香蕉高清国产线观看免费-97夜夜澡人人爽人人喊a-99久久久无码国产精品9-国产亚洲日韩欧美综合