随机函数用于加密——跳变法

来源:百度文库 编辑:神马文学网 时间:2024/04/28 02:50:13
一般的成见是随机函数不能用于信息加密,不能作为密钥来加密文件。在没有好的方法之前这些观念也许是对的。但事实未必如此,如果能够克服随机函数自身的缺陷,用于加密应该是没有问题的,这里将探索几种方法这是其一。下面介绍应用随机函数加密的方法之一“跳变法”。
大家知道调用随机函数可以生成序列值,这些序列值看起来是乱码,实际上是按一定规律变化的,并且是有周期的。所以不能直接作为密钥加密文件,为什么呢?破解者通过分析程序知道你用的随机函数,他就能建造随机函数所对应的序列值,接下来他只要找到序列值加密的起点破解就大功告成了。
“跳变法”是这样工作的,它使用两个毫不相关的随机函数A和B,A函数作为加密文件的密钥,B函数负责A函数值的“跳变”,我们知道随机函数的序列值是连续变化的,后一个值的产生和前一个有关,如果设定了“种子”再生成的数就是确定的,我们用B函数的序列值做代数运算后作为A函数的“种子”,这样A函数的取值就不是按原序列依次到来,而是在原序列中跳来跳去的选择,这也是称为“跳变”的原因 ,A和B函数最初的种子的选择要和用户密码关联起来,这样就可以用于加密文件了。另外也可以让A函数负责B函数值的“跳变”,这样B函数也不是按序列出现了。这样做的好处是用于加密的新序列值和A函数或B函数没有直接的关系,它是一种综合作用的结果。对随机函数的要求是元素分布均匀随机性好,周期要远远大于被加密文件的长度。
一般随机函数的周期大小和其种子的取值范围是一致的,周期越大,取值范围也越大。例如函数的周期是4.29×109,那么种子的取值至少要有4个字节长度才能容纳这个范围,如果周期是1018,种子的取值要有8个字节长度,以此类推。用户密码如果过短将不能满足随机函数的种子取值空间,既不能充分发挥起作用,所以要限定用户密码的最小字节数,但是密码过长不好记忆、输入麻烦,可以这样解决:将密码分为固定成分和临时填入成分,固定成分可以事先设定好放在某处,可以有多种选择,用时拷贝到密码输入框即可,例如“荣盛商贸       势在必行”,中间的空用于充填密码的另一部分。
下面分析一下如何破解这样的加密。首先要知道用的是哪两个随机函数,复现随机序列,找到两个函数的序列起点,找到加密的具体算法,做相反的运算。如果随机函数的周期是1018或者更大,复现随机序列几乎不可能,需要海量的存储空间,即使可以复现,需要的时间也是海量的,找到应用的起点也不容易,因为计算起点和用户密码相关,它是个未知数并不存在于文件或程序里,所以在不知道的情况下只能用穷举法试验,也就是假定A函数或B函数的一个起点然后对所有可能的情况进行扫描搜索,B函数取一个值,需要A函数取所有值,然后B函数再取另外一个值,这种乘积关系将使实验的次数变得非常大。并按照解析出来的算法计算试图破解密文,但这也不好搞,因为算法中可能出现与用户密码相关的参数,而用户密码并不知道,所以很难进行下去。另外分析结果判断是否成功破解也是个问题,如果不知道被破解文件的性质,判断是否破解也是个难题,如果文件本身就是乱码那就无法判断也就是无法破解,要是根据分析上下文关系来判断也是很困难的,很费时间的。由于随机序列很长,穷举所有情况所需要的时间是天文数字,加之判断成功的困难可以说破解时寸步难行。可以说用分析法,此路不通。
再看看靠穷举用户密码的情况,程序运行后显示效验码,首先让用户仿照输入这些效验码,这些效验码以图形方式出现,效验码字符由于采用扭曲变形、杂色、交叉等方式计算机不能有效识别读出这些字符,但用户可以通过联想判断读出效验码,这样就排除了自动运行的穷举攻击,而且效验码也许不止出现在开始,也许出现在其它运算过程中,如果没有人为的干预,是不能进行下去的。勉强输入少量的试解密码,也同样碰到判断解密成功的困难,程序不会为你筛选密码,只要输入格式、密码字节数等规则符合要求就开始解密运算了,密码不对当然不能得出正确的结果,并且密文被破坏掉了。由于密码的取值范围是天文数字,加之各种阻碍在有限的时间里不可能完成计算。并且程序有监测功能,如果发现你总是对某个密文进行解密操作超过一定次数它将退出运行。所以穷举法这条路也走不通的。
方法难免有各方面的漏洞,希望指正。