◆羅翔
(北京科技大學(xué)數(shù)理學(xué)院 北京 100083)
Office 2016 是當(dāng)前主流的具有加密功能的辦公套件,其明文檔采用“Office Open XML”文件格式存儲,加密后的文檔使用復(fù)合文檔格式(CFB)存儲。本文以Word 2016 加密后的.docx 文檔為例,分析Office 2016 的文檔格式、加密機(jī)制和口令驗(yàn)證機(jī)制,Excel 2016、PowerPoint 2016 加密文檔在數(shù)據(jù)格式、加解密機(jī)制和口令驗(yàn)證機(jī)制等方面均與Word 2016 相同。
通過資料研究[1]、做報分析及軟件逆向分析[2]可知,Office 2016文檔加密使用AES256-CBC 算法,加密機(jī)制如圖1 所示。
Office 2016 加密文檔時將整個文件作為明文分塊進(jìn)行加密,每個分塊大小為4096 字節(jié),然后將密數(shù)據(jù)作為“EncryptedPackage”對象封裝在CFB 文件中;同時將用于數(shù)據(jù)加密以及口令驗(yàn)證的加密算法、Hash 算法、密鑰長度、分組長度以及所使用的隨機(jī)數(shù)等信息作為“EncryptionⅠnfo”對象也封裝在這個CFB 文件中。文檔加密口令Password、鹽值SaltValue 和作為固定值的BlockKey 通過HMK 算法生成密鑰Key,用于對文檔加密密鑰EncryptionKey 進(jìn)行加密保護(hù)。
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)。
上述算法中“||”表示串聯(lián),SpinCount 取自“EncryptionⅠnfo”對象。
密鑰Key 通過AES256-CBC 算法對文檔加密密鑰EncryptionKey進(jìn)行加密保護(hù),得到EncryptedKey,存儲于加密文檔的EncryptionⅠnfo Stream 結(jié)構(gòu)中。EncryptionKey 為32 字節(jié)隨機(jī)數(shù),由偽隨機(jī)數(shù)生成器WRNG(Windows Pseudo_Random Number Generator)生成。
Office 2016 加密文檔EncryptionⅠnfo 流中包含口令驗(yàn)證相關(guān)的參數(shù)信息,例如encryptedVerifierHashⅠnput、encryptedVerifierHashValue。
經(jīng)資料解讀[1],Office 2016 口令驗(yàn)證機(jī)制采用與文檔加密機(jī)制相同的密鑰導(dǎo)出算法HMK 生成密鑰,區(qū)別在于固定值BlockKey 不同。其口令驗(yàn)證具體流程如下:
(1)從EncryptionⅠnfo 流中讀取加密算法指示、驗(yàn)證模式及口令 驗(yàn) 證 相 關(guān) 的 SaltValue 、 EncryptedVerifierHashⅠnput 、EncryptedVerifierHashValue 等信息,并對其進(jìn)行Base64 解碼。
(2)利用SaltValue、Password、SpinCount、BlockKey1、BlockKey2作為參數(shù),通過密鑰導(dǎo)出算法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 進(jìn) 行 散 列 計 算, 散 列 值 與VerifierHashValue 相同,則口令正確。
對上述口令驗(yàn)證流程進(jìn)行編程驗(yàn)證(口令為3Q2u?。?,從加密文檔EncryptionⅠnfo 流中提取以下信息:
對以上參數(shù)進(jìn)行Base64 解碼后,按照上述口令驗(yàn)證流程得到以下結(jié)果:
VerifierHashResult 與VerifierHashValue 相等,口令驗(yàn)證通過。經(jīng)多次做報驗(yàn)證,口令驗(yàn)證均通過。
通過以上編程驗(yàn)證,結(jié)合加密文檔解析、動態(tài)分析可知,Office 2016 采用密鑰導(dǎo)出算法HMK 與AES 算法的組合進(jìn)行口令驗(yàn)證,如圖2 所示。
圖2 Office 2016 口令驗(yàn)證機(jī)制
Office2016 文檔加密和口令驗(yàn)證采用的核心算法是AES256,密鑰生成采用Windows 操作系統(tǒng)的隨機(jī)數(shù)算法WRNG。AES 算法中,每輪密鑰擴(kuò)展常數(shù)的不同、密鑰擴(kuò)展的非線性以及加解密使用變換的不同,使得AES 對密鑰的選擇沒有任何限制。AES 的設(shè)計者給出了AES 可抵抗差分分析和線性分析的安全性證明[3]。另外,AES 還可很好地抵抗不可能差分分析、積分攻擊、代數(shù)攻擊、差值攻擊和相關(guān)密鑰攻擊等[4][5]。因此,目前針對AES 最有效的攻擊方法還是窮盡密鑰搜索攻擊。
Office 2016 加密機(jī)制在密鑰導(dǎo)出算法中加入了鹽值(SaltValue),且在生成密鑰KEK 時需要進(jìn)行多達(dá)10 萬次散列迭代計算,可有效抵抗暴力破解,極大地降低了口令猜測破解的效率。
從上述分析可知,Office 2016 加密文檔的安全性取決于攻擊者的計算能力以及用戶口令空間大小。攻擊者要獲取Office 2016 加密文檔的明文,要么采用口令破解方法,依次進(jìn)行SpinCount 次循環(huán)迭代計算SHA512 函數(shù),獲得正確的用戶口令;要么采用密鑰搜索方法,不進(jìn)行密鑰生成計算,直接對報文密鑰Key 進(jìn)行搜索。除此之外并沒有其他捷徑。為定量分析Office 2016 加密文檔的安全性,利用現(xiàn)有密碼破解工具Office Password Recovery_5.10,對加密文檔進(jìn)行密碼破譯實(shí)驗(yàn)。
計算機(jī)性能參數(shù):Win7 sp1,Core i7-4790 CPU@3.6GHZ,內(nèi)存4G。
密鑰搜索破解速度:約60000000 個密鑰/秒。
口令猜測破解速度:約60 個口令/秒??诹畈聹y破解時間成本如表1 所示。
表1 普通單機(jī)上Office 2016 口令猜測破解時間
分析上述實(shí)驗(yàn)結(jié)果可知,Office 2016 采用AES256 算法,使得密鑰搜索方法失效;密鑰導(dǎo)出算法生成密鑰KEK 時需進(jìn)行10 萬次迭代,使得口令破解速度十分緩慢。通過破解實(shí)驗(yàn)表明,Office 2016文檔加密功能在口令較短時存在安全隱患;當(dāng)口令字符集合復(fù)雜且長度大于8 時,破譯難度極大。
本文研究了Office 2016 的文檔格式、文檔加密機(jī)制和口令驗(yàn)證機(jī)制,分析了其加密機(jī)制的安全性。算法分析和實(shí)驗(yàn)結(jié)果表明:當(dāng)用戶口令復(fù)雜(例如包含大小字母和數(shù)字,甚至其他特殊字符)且長度大于8 時,Office 2016 加密機(jī)制具有很強(qiáng)的抗破譯性。需要指出的是,雖然Office 2016 加密采用AES256 強(qiáng)算法,但是當(dāng)用戶選用弱口令(如長度小于8,純數(shù)字,常用英文單詞等)時,依然容易被破解。