马文亭
(哈尔滨华德学院,哈尔滨 150025)
信息的安全性已逐渐引起人们的重视。在密码学分析中存在一种Rubber-hose攻击[1],在这种攻击中,如果受害者不给出密钥,分析者将会折磨、威胁、恐吓、勒索受害者。这些攻击毫无技术性,但却是非常有效的攻击方法,也是破译算法最便捷的途径。
分析了现有的误导低冗余加密方法,在保证算法功能的前提下提出了新的加密方案,提高了算法的安全性,降低了冗余度。通过实验测试结果显示,该改进方案可以使具有误导功能的低冗余加密算法的安全性得到了很大的提升。
由于其他密码分析方法的条件难于获得,现实中软磨硬泡攻击经常是破解算法的最好途径,所以其价值具有现实意义。它可以对抗无限计算能力或在很强的计算能力下的各种密码分析,甚至是唯密文分析。在密钥可能被盗取的情况下,可以用伪密钥作为诱饵误导对方,它可以主动误导对方,错误密钥可以得到有意义的明文再误导对方,并用伪密钥得到各种相近、相反的明文,相较于原始明文,具有一定的抵消作用,令密码分析者无所适从[1]。
该算法采用内外两层加密。内层加密是该算法的核心,类似于选择题,外层加密方法则采用对称加密。将同一类的关键词放在一组中,每一个关键词在对应的组号中都有唯一的编号。在设计关键词数据库时,必须保证关键词组不相同,将明文与数据库进行字符匹配,若有关键词则用扩充项替换关键词。为了方便解密操作,选择3个保留编码或在文本中不出现的符号分别作为扩充项的起始标记S、分隔标记D和结束标记F。假设明文中关键词在数据库中对应的一组的编号是H,在这一组中的独立编号是a,这一组中关键词的数目为n,Ks是内层加密的子密钥,Ext为扩充项:
T=Ks+amod(n)
Ext=S+H+D+T+F
通过以上操作,将明文中的关键词替换为扩充项生成过渡密文,再利用AES算法对过渡密文进行加密,生成密文。
1.3.1 算法的安全性低
理论上该算法是安全可行的,但是理论上可行的算法不代表在实际操作中可行,密码学研究者发现了AES算法的弱点,令破解密钥的速度更快。攻击者可以通过某种方式破解外层加密,获得过渡密文。假如攻击者得到过渡密文中的扩充项,因为扩充项中的组号是H和代号T都是以原有的形态保留,故而,攻击者就得到了关键词的组号和编号。
1.3.2 密钥的安全性低
密钥是一个算法的重要保障,密钥的安全性等同于算法的安全性。误导的低冗余的算法会根据密钥的改变来得到不同的伪明文。一旦密钥被密码分析者攻击,得到真实的密钥就可以得到真实的明文,所以密钥的安全性是至关重要的。但是该原有的误导的加密算法并没有对密钥进行任何保护。
在原有的算法中,因为扩充项的原因,使得算法的安全性低,所以提高扩充项的安全性也是提高算法的安全性。扩充项=起始标记S+组号H+分隔标记D+代号T+结束标记F,其中,H和T是以数字的形式存储在扩充项中[1]。基于Hash函数抗软磨硬泡攻击算法采用了Base64编码对H和T进行编码,Base64编码[2]具有不可读行,因此,编码的数据无法通过观察得到。原有的算法不仅要具有误导性,还需要具有低冗余,所以Base64编码比其他的加密方法更为适合。一般情况下,H和T都不会过大,而字符串进行Base64编码后,至少比原来长1/3。其中,组号H和代号T都是数值,所以利用Base64编码不会大幅度地增加冗余。
算法步骤如下:假设Key是算法的密钥,对H进行Base64编码,再对T进行Base64编码,但是这里的T已经不是原有算法的T了,虽然也是关键词的代号,但是这个T是对子密钥KS进行函数运算,再将代号T和组号H进行Base64编码,和S、D和F共同组成扩充项EXT:
T=Hash(K.substring(16))+a mod n
Ks=K.substring(16)
EXT=S+encodeBase64(H)+
+encodeBase64(T)+F
Hash()函数是根据关键词在组内的编号,对Ks进行哈希运算,例如:关键词在组内变化是4,则对Ks进行4次哈希运算,具体算法如下:
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进行以上的函数运算,使得Ks的安全性更高,代号T在扩充项是以乱码的形式出现,令关键词的子密钥得到保护。对于原来扩充项中的H和T,都进行了Base64编码,形成了新的扩充项EXT。
在本算法中,由于有内外双层密钥且密钥的位数要大于256 bit,日常生活中将密钥完全牢记的可能性低,所以算法的密钥就要进行存储。涉及存储就可能危害到密钥的安全性,一旦密钥被密码分析者发现,就存在密钥被修改或被窃取的情况。保证密钥的安全性也是保证算法的安全性,对密钥的安全性保护具体如下:
要用一个具有特殊意义或容易记住的字符串作为密钥保护的口令。利用MD5算法对口令进行运算得到256bit的哈希值。利用哈希值作为新的密钥,采用AES加密算法对算法密钥进行加密,对加密的密文进行存储。解密时,要输入密钥保护的口令进行解密操作。
实验数据采用含有多个关键词的文本文档,分别对原有的误导加密算法和改进的误导加密算法的安全性进行实验验证。关键词数据库可以根据用户的需求进行自定义,建立需要保护的关键词表格。测试数据是从网络上随机截取的字符串,如下:星期五我放假,我们看电影吧,下午三点钟我在教学楼等你。
根据测试数据的内容,可以建立3个关键词数据表用于实验验证(表格可以根据用户想要保护的内容建立)。分别是时间、地点和事件的关键词数据表格,如表1所示。
假如想保护的数据是准确的时间“三点钟”,就可以建立新的关键词数据表格。例如:一、二、三分别对应数值0、1、2。
表1 时间关键词表格Tab.1 Time keywords
根据原有的具有误导功能的加密算法编写的代码,对测试数据经行误导的加解密测试,密钥是929117xingfanafdga123,加密成功。过渡密文如图1所示,其中关键词已经被扩充项替换,非关键词不进行任何操作,直接输出形成过渡密文。
图1 原算法的过渡密文Fig.1 Transition ciphertext of original algorithm
保持密钥前256bit不变,更改其余的字符串,例如:解密密钥为929117xingfanafdga12q,解密仍然可以成功,且此时的关键词已经被同组的其他关键词替换且语义通顺。
图2 伪明文Fig.2 False proclaimed writing
为了确保验证的准确性,关键词数据表格、测试数据和加密密钥都保持不变。使用改进的算法对测试数据进行误导加解密,得到的过渡密文如图3所示:
图3 改进算法的过渡密文Fig.3 Transition ciphertext of improved algorithm
解密时修改密钥为929117xingfanafdga12q。解密成功得到的伪明文如图4所示:
图4 改进算法的伪明文Fig.4 False proclaimed writing of improved algorithm
进行加解密操作之后,需要对密钥进行保护,对密钥的密文进行存储。需要密钥进行误导解密时,输入事先定义好的口令就可以得到密钥。
图5 误导密钥的保护Fig.5 Misleading key protection
图6 误导密钥的获取Fig.6 Misleading key acquisition
在原算法中,测试数据中关键词“星期五”被替换为“#1$98061084&”。根据加密的原理可知,“#”为起始标记,“$”为分隔标记,“&”为结束标记。易得关键词组号:H=1(第一个表单),关键词代号:T=98061084。根据以下公式:
a=(T-Ks)mod n
Ks=Integer.parseInt(key.Substring(16).hashCode())
Ks=98061080
a=(98061084-98061080)mod 7=4
由公式推导可知,关键词“星期五”是第一组关键词,编号是4。
在改进后的算法中,在过渡密文中,关键词“星期五”被替换为“#MQ==$OTgwNjEwODQ=&”。与原有算法的扩充项相比,该扩充项中没有出现确切的数字,且每个扩充项都有很大的差别。改进后的算法无法在得到扩充项的前提下得到关键词所在的组号和编号。
根据以上对误导加密算法和基于Hash函数抗软磨硬泡攻击算法的分别测试,可以得到2个不同的过渡密文。对于原有的具有误导功能的加密算法,关键词被字符和数字组成的字符串代替,如果密码分析者得到了加密的算法原理,就可以根据数学推导得到关键词的组号和编号。综上所述,基于Hash函数抗软磨硬泡攻击算法很大程度上提高了算法本身的安全性和抗攻击性。
研究了具有误导功能的低冗余加密算法的安全性问题并进行了算法的改进,通过对扩充项和密钥的处理,在不增加算法冗余的情况下增加算法的安全性。通过实验验证和结果分析,改进后的算法可以大幅度提高原有算法的安全性,通过对密钥进行保护处理,使得密钥的存储更加安全可靠。