馬文亭
(哈爾濱華德學(xué)院,哈爾濱 150025)
信息的安全性已逐漸引起人們的重視。在密碼學(xué)分析中存在一種Rubber-hose攻擊[1],在這種攻擊中,如果受害者不給出密鑰,分析者將會(huì)折磨、威脅、恐嚇、勒索受害者。這些攻擊毫無技術(shù)性,但卻是非常有效的攻擊方法,也是破譯算法最便捷的途徑。
分析了現(xiàn)有的誤導(dǎo)低冗余加密方法,在保證算法功能的前提下提出了新的加密方案,提高了算法的安全性,降低了冗余度。通過實(shí)驗(yàn)測試結(jié)果顯示,該改進(jìn)方案可以使具有誤導(dǎo)功能的低冗余加密算法的安全性得到了很大的提升。
由于其他密碼分析方法的條件難于獲得,現(xiàn)實(shí)中軟磨硬泡攻擊經(jīng)常是破解算法的最好途徑,所以其價(jià)值具有現(xiàn)實(shí)意義。它可以對抗無限計(jì)算能力或在很強(qiáng)的計(jì)算能力下的各種密碼分析,甚至是唯密文分析。在密鑰可能被盜取的情況下,可以用偽密鑰作為誘餌誤導(dǎo)對方,它可以主動(dòng)誤導(dǎo)對方,錯(cuò)誤密鑰可以得到有意義的明文再誤導(dǎo)對方,并用偽密鑰得到各種相近、相反的明文,相較于原始明文,具有一定的抵消作用,令密碼分析者無所適從[1]。
該算法采用內(nèi)外兩層加密。內(nèi)層加密是該算法的核心,類似于選擇題,外層加密方法則采用對稱加密。將同一類的關(guān)鍵詞放在一組中,每一個(gè)關(guān)鍵詞在對應(yīng)的組號中都有唯一的編號。在設(shè)計(jì)關(guān)鍵詞數(shù)據(jù)庫時(shí),必須保證關(guān)鍵詞組不相同,將明文與數(shù)據(jù)庫進(jìn)行字符匹配,若有關(guān)鍵詞則用擴(kuò)充項(xiàng)替換關(guān)鍵詞。為了方便解密操作,選擇3個(gè)保留編碼或在文本中不出現(xiàn)的符號分別作為擴(kuò)充項(xiàng)的起始標(biāo)記S、分隔標(biāo)記D和結(jié)束標(biāo)記F。假設(shè)明文中關(guān)鍵詞在數(shù)據(jù)庫中對應(yīng)的一組的編號是H,在這一組中的獨(dú)立編號是a,這一組中關(guān)鍵詞的數(shù)目為n,Ks是內(nèi)層加密的子密鑰,Ext為擴(kuò)充項(xiàng):
T=Ks+amod(n)
Ext=S+H+D+T+F
通過以上操作,將明文中的關(guān)鍵詞替換為擴(kuò)充項(xiàng)生成過渡密文,再利用AES算法對過渡密文進(jìn)行加密,生成密文。
1.3.1 算法的安全性低
理論上該算法是安全可行的,但是理論上可行的算法不代表在實(shí)際操作中可行,密碼學(xué)研究者發(fā)現(xiàn)了AES算法的弱點(diǎn),令破解密鑰的速度更快。攻擊者可以通過某種方式破解外層加密,獲得過渡密文。假如攻擊者得到過渡密文中的擴(kuò)充項(xiàng),因?yàn)閿U(kuò)充項(xiàng)中的組號是H和代號T都是以原有的形態(tài)保留,故而,攻擊者就得到了關(guān)鍵詞的組號和編號。
1.3.2 密鑰的安全性低
密鑰是一個(gè)算法的重要保障,密鑰的安全性等同于算法的安全性。誤導(dǎo)的低冗余的算法會(huì)根據(jù)密鑰的改變來得到不同的偽明文。一旦密鑰被密碼分析者攻擊,得到真實(shí)的密鑰就可以得到真實(shí)的明文,所以密鑰的安全性是至關(guān)重要的。但是該原有的誤導(dǎo)的加密算法并沒有對密鑰進(jìn)行任何保護(hù)。
在原有的算法中,因?yàn)閿U(kuò)充項(xiàng)的原因,使得算法的安全性低,所以提高擴(kuò)充項(xiàng)的安全性也是提高算法的安全性。擴(kuò)充項(xiàng)=起始標(biāo)記S+組號H+分隔標(biāo)記D+代號T+結(jié)束標(biāo)記F,其中,H和T是以數(shù)字的形式存儲(chǔ)在擴(kuò)充項(xiàng)中[1]?;贖ash函數(shù)抗軟磨硬泡攻擊算法采用了Base64編碼對H和T進(jìn)行編碼,Base64編碼[2]具有不可讀行,因此,編碼的數(shù)據(jù)無法通過觀察得到。原有的算法不僅要具有誤導(dǎo)性,還需要具有低冗余,所以Base64編碼比其他的加密方法更為適合。一般情況下,H和T都不會(huì)過大,而字符串進(jìn)行Base64編碼后,至少比原來長1/3。其中,組號H和代號T都是數(shù)值,所以利用Base64編碼不會(huì)大幅度地增加冗余。
算法步驟如下:假設(shè)Key是算法的密鑰,對H進(jìn)行Base64編碼,再對T進(jìn)行Base64編碼,但是這里的T已經(jīng)不是原有算法的T了,雖然也是關(guān)鍵詞的代號,但是這個(gè)T是對子密鑰KS進(jìn)行函數(shù)運(yùn)算,再將代號T和組號H進(jìn)行Base64編碼,和S、D和F共同組成擴(kuò)充項(xiàng)EXT:
T=Hash(K.substring(16))+a mod n
Ks=K.substring(16)
EXT=S+encodeBase64(H)+
+encodeBase64(T)+F
Hash()函數(shù)是根據(jù)關(guān)鍵詞在組內(nèi)的編號,對Ks進(jìn)行哈希運(yùn)算,例如:關(guān)鍵詞在組內(nèi)變化是4,則對Ks進(jìn)行4次哈希運(yùn)算,具體算法如下:
Public int Hash (String st) throws Exception {
String ha = st;
for (int j = 0; j <= n; j++)
{
ha =String.valueOf(ha.hashCode());
}
return Integer.parseInt(ha);
}
對Ks進(jìn)行以上的函數(shù)運(yùn)算,使得Ks的安全性更高,代號T在擴(kuò)充項(xiàng)是以亂碼的形式出現(xiàn),令關(guān)鍵詞的子密鑰得到保護(hù)。對于原來擴(kuò)充項(xiàng)中的H和T,都進(jìn)行了Base64編碼,形成了新的擴(kuò)充項(xiàng)EXT。
在本算法中,由于有內(nèi)外雙層密鑰且密鑰的位數(shù)要大于256 bit,日常生活中將密鑰完全牢記的可能性低,所以算法的密鑰就要進(jìn)行存儲(chǔ)。涉及存儲(chǔ)就可能危害到密鑰的安全性,一旦密鑰被密碼分析者發(fā)現(xiàn),就存在密鑰被修改或被竊取的情況。保證密鑰的安全性也是保證算法的安全性,對密鑰的安全性保護(hù)具體如下:
要用一個(gè)具有特殊意義或容易記住的字符串作為密鑰保護(hù)的口令。利用MD5算法對口令進(jìn)行運(yùn)算得到256bit的哈希值。利用哈希值作為新的密鑰,采用AES加密算法對算法密鑰進(jìn)行加密,對加密的密文進(jìn)行存儲(chǔ)。解密時(shí),要輸入密鑰保護(hù)的口令進(jìn)行解密操作。
實(shí)驗(yàn)數(shù)據(jù)采用含有多個(gè)關(guān)鍵詞的文本文檔,分別對原有的誤導(dǎo)加密算法和改進(jìn)的誤導(dǎo)加密算法的安全性進(jìn)行實(shí)驗(yàn)驗(yàn)證。關(guān)鍵詞數(shù)據(jù)庫可以根據(jù)用戶的需求進(jìn)行自定義,建立需要保護(hù)的關(guān)鍵詞表格。測試數(shù)據(jù)是從網(wǎng)絡(luò)上隨機(jī)截取的字符串,如下:星期五我放假,我們看電影吧,下午三點(diǎn)鐘我在教學(xué)樓等你。
根據(jù)測試數(shù)據(jù)的內(nèi)容,可以建立3個(gè)關(guān)鍵詞數(shù)據(jù)表用于實(shí)驗(yàn)驗(yàn)證(表格可以根據(jù)用戶想要保護(hù)的內(nèi)容建立)。分別是時(shí)間、地點(diǎn)和事件的關(guān)鍵詞數(shù)據(jù)表格,如表1所示。
假如想保護(hù)的數(shù)據(jù)是準(zhǔn)確的時(shí)間“三點(diǎn)鐘”,就可以建立新的關(guān)鍵詞數(shù)據(jù)表格。例如:一、二、三分別對應(yīng)數(shù)值0、1、2。
表1 時(shí)間關(guān)鍵詞表格Tab.1 Time keywords
根據(jù)原有的具有誤導(dǎo)功能的加密算法編寫的代碼,對測試數(shù)據(jù)經(jīng)行誤導(dǎo)的加解密測試,密鑰是929117xingfanafdga123,加密成功。過渡密文如圖1所示,其中關(guān)鍵詞已經(jīng)被擴(kuò)充項(xiàng)替換,非關(guān)鍵詞不進(jìn)行任何操作,直接輸出形成過渡密文。
圖1 原算法的過渡密文Fig.1 Transition ciphertext of original algorithm
保持密鑰前256bit不變,更改其余的字符串,例如:解密密鑰為929117xingfanafdga12q,解密仍然可以成功,且此時(shí)的關(guān)鍵詞已經(jīng)被同組的其他關(guān)鍵詞替換且語義通順。
圖2 偽明文Fig.2 False proclaimed writing
為了確保驗(yàn)證的準(zhǔn)確性,關(guān)鍵詞數(shù)據(jù)表格、測試數(shù)據(jù)和加密密鑰都保持不變。使用改進(jìn)的算法對測試數(shù)據(jù)進(jìn)行誤導(dǎo)加解密,得到的過渡密文如圖3所示:
圖3 改進(jìn)算法的過渡密文Fig.3 Transition ciphertext of improved algorithm
解密時(shí)修改密鑰為929117xingfanafdga12q。解密成功得到的偽明文如圖4所示:
圖4 改進(jìn)算法的偽明文Fig.4 False proclaimed writing of improved algorithm
進(jìn)行加解密操作之后,需要對密鑰進(jìn)行保護(hù),對密鑰的密文進(jìn)行存儲(chǔ)。需要密鑰進(jìn)行誤導(dǎo)解密時(shí),輸入事先定義好的口令就可以得到密鑰。
圖5 誤導(dǎo)密鑰的保護(hù)Fig.5 Misleading key protection
圖6 誤導(dǎo)密鑰的獲取Fig.6 Misleading key acquisition
在原算法中,測試數(shù)據(jù)中關(guān)鍵詞“星期五”被替換為“#1$98061084&”。根據(jù)加密的原理可知,“#”為起始標(biāo)記,“$”為分隔標(biāo)記,“&”為結(jié)束標(biāo)記。易得關(guān)鍵詞組號:H=1(第一個(gè)表單),關(guān)鍵詞代號:T=98061084。根據(jù)以下公式:
a=(T-Ks)mod n
Ks=Integer.parseInt(key.Substring(16).hashCode())
Ks=98061080
a=(98061084-98061080)mod 7=4
由公式推導(dǎo)可知,關(guān)鍵詞“星期五”是第一組關(guān)鍵詞,編號是4。
在改進(jìn)后的算法中,在過渡密文中,關(guān)鍵詞“星期五”被替換為“#MQ==$OTgwNjEwODQ=&”。與原有算法的擴(kuò)充項(xiàng)相比,該擴(kuò)充項(xiàng)中沒有出現(xiàn)確切的數(shù)字,且每個(gè)擴(kuò)充項(xiàng)都有很大的差別。改進(jìn)后的算法無法在得到擴(kuò)充項(xiàng)的前提下得到關(guān)鍵詞所在的組號和編號。
根據(jù)以上對誤導(dǎo)加密算法和基于Hash函數(shù)抗軟磨硬泡攻擊算法的分別測試,可以得到2個(gè)不同的過渡密文。對于原有的具有誤導(dǎo)功能的加密算法,關(guān)鍵詞被字符和數(shù)字組成的字符串代替,如果密碼分析者得到了加密的算法原理,就可以根據(jù)數(shù)學(xué)推導(dǎo)得到關(guān)鍵詞的組號和編號。綜上所述,基于Hash函數(shù)抗軟磨硬泡攻擊算法很大程度上提高了算法本身的安全性和抗攻擊性。
研究了具有誤導(dǎo)功能的低冗余加密算法的安全性問題并進(jìn)行了算法的改進(jìn),通過對擴(kuò)充項(xiàng)和密鑰的處理,在不增加算法冗余的情況下增加算法的安全性。通過實(shí)驗(yàn)驗(yàn)證和結(jié)果分析,改進(jìn)后的算法可以大幅度提高原有算法的安全性,通過對密鑰進(jìn)行保護(hù)處理,使得密鑰的存儲(chǔ)更加安全可靠。