◆羅翔
(北京科技大學數理學院 北京 100083)
Office 2016 是當前主流的具有加密功能的辦公套件,其明文檔采用“Office Open XML”文件格式存儲,加密后的文檔使用復合文檔格式(CFB)存儲。本文以Word 2016 加密后的.docx 文檔為例,分析Office 2016 的文檔格式、加密機制和口令驗證機制,Excel 2016、PowerPoint 2016 加密文檔在數據格式、加解密機制和口令驗證機制等方面均與Word 2016 相同。
通過資料研究[1]、做報分析及軟件逆向分析[2]可知,Office 2016文檔加密使用AES256-CBC 算法,加密機制如圖1 所示。
Office 2016 加密文檔時將整個文件作為明文分塊進行加密,每個分塊大小為4096 字節,然后將密數據作為“EncryptedPackage”對象封裝在CFB 文件中;同時將用于數據加密以及口令驗證的加密算法、Hash 算法、密鑰長度、分組長度以及所使用的隨機數等信息作為“EncryptionⅠnfo”對象也封裝在這個CFB 文件中。文檔加密口令Password、鹽值SaltValue 和作為固定值的BlockKey 通過HMK 算法生成密鑰Key,用于對文檔加密密鑰EncryptionKey 進行加密保護。
HMK(SaltValue,Password,SpinCount,BlockKey)算法如下:
(1)H0=SHA512(SaltValue||Unicode(Password));
(2)Hi+1=SHA512(i||Hi),迭代計算SpinCount 次,i 從0 遞增到SpinCount-1;
(3)Key=SHA512(HSpinCount||BlockKey)。
上述算法中“||”表示串聯,SpinCount 取自“EncryptionⅠnfo”對象。
密鑰Key 通過AES256-CBC 算法對文檔加密密鑰EncryptionKey進行加密保護,得到EncryptedKey,存儲于加密文檔的EncryptionⅠnfo Stream 結構中。EncryptionKey 為32 字節隨機數,由偽隨機數生成器WRNG(Windows Pseudo_Random Number Generator)生成。
Office 2016 加密文檔EncryptionⅠnfo 流中包含口令驗證相關的參數信息,例如encryptedVerifierHashⅠnput、encryptedVerifierHashValue。
經資料解讀[1],Office 2016 口令驗證機制采用與文檔加密機制相同的密鑰導出算法HMK 生成密鑰,區別在于固定值BlockKey 不同。其口令驗證具體流程如下:
(1)從EncryptionⅠnfo 流中讀取加密算法指示、驗證模式及口令 驗 證 相 關 的 SaltValue 、 EncryptedVerifierHashⅠnput 、EncryptedVerifierHashValue 等信息,并對其進行Base64 解碼。
(2)利用SaltValue、Password、SpinCount、BlockKey1、BlockKey2作為參數,通過密鑰導出算法HMK 生成密鑰KEK1 和KEK2。
BlockKey1={0xfe,0xa7,0xd2,0x76,0x3b,0x4b,0x9e,0x79};
BlockKey2={0xd7,0xaa,0x0f,0x6d,0x30,0x61,0x34,0x4e}。
( 3 ) 用 KEK1 對 encryptedVerifierHashⅠnput 解 密 得 到VerifierHashⅠnput;用KEK2 對encryptedVerifierHashValue 解密得到VerifierHashValue。
( 4 ) 對VerifierHashⅠnput 進 行 散 列 計 算, 散 列 值 與VerifierHashValue 相同,則口令正確。
對上述口令驗證流程進行編程驗證(口令為3Q2u!),從加密文檔EncryptionⅠnfo 流中提取以下信息:


對以上參數進行Base64 解碼后,按照上述口令驗證流程得到以下結果:

VerifierHashResult 與VerifierHashValue 相等,口令驗證通過。經多次做報驗證,口令驗證均通過。
通過以上編程驗證,結合加密文檔解析、動態分析可知,Office 2016 采用密鑰導出算法HMK 與AES 算法的組合進行口令驗證,如圖2 所示。

圖2 Office 2016 口令驗證機制
Office2016 文檔加密和口令驗證采用的核心算法是AES256,密鑰生成采用Windows 操作系統的隨機數算法WRNG。AES 算法中,每輪密鑰擴展常數的不同、密鑰擴展的非線性以及加解密使用變換的不同,使得AES 對密鑰的選擇沒有任何限制。AES 的設計者給出了AES 可抵抗差分分析和線性分析的安全性證明[3]。另外,AES 還可很好地抵抗不可能差分分析、積分攻擊、代數攻擊、差值攻擊和相關密鑰攻擊等[4][5]。因此,目前針對AES 最有效的攻擊方法還是窮盡密鑰搜索攻擊。
Office 2016 加密機制在密鑰導出算法中加入了鹽值(SaltValue),且在生成密鑰KEK 時需要進行多達10 萬次散列迭代計算,可有效抵抗暴力破解,極大地降低了口令猜測破解的效率。
從上述分析可知,Office 2016 加密文檔的安全性取決于攻擊者的計算能力以及用戶口令空間大小。攻擊者要獲取Office 2016 加密文檔的明文,要么采用口令破解方法,依次進行SpinCount 次循環迭代計算SHA512 函數,獲得正確的用戶口令;要么采用密鑰搜索方法,不進行密鑰生成計算,直接對報文密鑰Key 進行搜索。除此之外并沒有其他捷徑。為定量分析Office 2016 加密文檔的安全性,利用現有密碼破解工具Office Password Recovery_5.10,對加密文檔進行密碼破譯實驗。
計算機性能參數:Win7 sp1,Core i7-4790 CPU@3.6GHZ,內存4G。
密鑰搜索破解速度:約60000000 個密鑰/秒。
口令猜測破解速度:約60 個口令/秒??诹畈聹y破解時間成本如表1 所示。

表1 普通單機上Office 2016 口令猜測破解時間
分析上述實驗結果可知,Office 2016 采用AES256 算法,使得密鑰搜索方法失效;密鑰導出算法生成密鑰KEK 時需進行10 萬次迭代,使得口令破解速度十分緩慢。通過破解實驗表明,Office 2016文檔加密功能在口令較短時存在安全隱患;當口令字符集合復雜且長度大于8 時,破譯難度極大。
本文研究了Office 2016 的文檔格式、文檔加密機制和口令驗證機制,分析了其加密機制的安全性。算法分析和實驗結果表明:當用戶口令復雜(例如包含大小字母和數字,甚至其他特殊字符)且長度大于8 時,Office 2016 加密機制具有很強的抗破譯性。需要指出的是,雖然Office 2016 加密采用AES256 強算法,但是當用戶選用弱口令(如長度小于8,純數字,常用英文單詞等)時,依然容易被破解。