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

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

void sranda(long seed)                            //第一个随机函数的种子函数
{
 Seed=seed;
}
int randa(void)                                  //第一个随机函数
{
 Seed=MUL*Seed+INC;
 return((int)(Seed>>24));
}
第二个周期大约10的18次方。
static int s1=1;
static int s2=1;
#define MODMULT(a,b,m,s) s= b*s; if(s<0) s+=m;    //函数用到的宏定义
unsigned int combinedLOG(void);
void initLOG(int InitS1,int InitS2);
unsigned int combinedLOG(void)   //第二个随机函数
{
 unsigned int z;
 MODMULT(40014,12211,2147483563,s1)
 MODMULT(40692,3791,2147483399,s2)
 z = s1 -s2;
 return z;
}

void initLOG(int InitS1,int InitS2)            //第二个随机函数的种子函数
{
 s1=InitS1;
 s2=InitS2;
}
加密程序使用这两个随机函数搭配,用户密码至少12个字节才比较充裕,但实验程序限定至少5个字符即可。
加密软件下载地址是http://c.thec.cn/sjdclw/试验程序.rar。也可以发信到我这里索取。信箱是sjsjsjd@163.com

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值