随机函数用于加密——多模法

来源:百度文库 编辑:神马文学网 时间:2024/04/28 23:28:00
  随机函数用于加密,以前已经介绍了组合法、跳变法、重排法,这里再介绍一种方法:多模法,这种方法简单实用。
  【模运算基本概念】对于正整数p和整数a,取模运算:a % p (或a mod p),表示a除以p的余数。
  【加密原理】随机函数产生的数据经过多次适当的模运算后作为加密或解密密钥,通过做不同数值的模运算提高解密复杂度。
  我们知道文件一般都是以字节为单位,所以加密文件的最终密钥也是字节随机数。请看下面模运算实例:
  C语言里有个随机函数rand(),我们让它生成随机数并观察取模运算的情况,rand()的取值范围是0到32767,模数可以取在256到32767之间的数,如果大于32767取模运算等于白做,模数小于256则不能取到所有元素使密钥隐藏数据的能力变弱。这里随机函数的种子值设为321以便读着自己能够验证,让接下来的10个数分别以1001和573为模做模运算后的数值分别放到字节数组里,它们是
      85 45  216 254 255 66  142 124 252 139
      1  128 36  239 12  162 100 137 23  242
  可以看到这是两个完全不同的数组,它告诉我们在适当的范围内做模运算可以得到不相同的数组。实际它们是rand()产生的数值n 做n%1001%256 和 n%573%256的结果,装入字节数组相当于%256。通过这个例子我们知道,对随机函数的数值做适当的模运算可以产生不同的结果数组,用于加密也就是得到不同的密钥数组。
  我们知道随机函数都是需要种子的,种子其实是定位随机函数用的,也就是定位随机函数产生随机数组序列的起始位置。我们用到的随机函数值往往只是随机序列(和周期一样长)中的一段。当随机函数用于加密时如果我们使用的种子和用户密码相关,破解者将不知道我们使用的是随机序列的哪一段,因为用户密码并不出现在程序里是用户定义和输入的,但用户密码参与加密或解密运算。假设随机函数的周期为 T破解者想要得到数组的起始位置需要做 T次试验来寻找。
  现在对生成的随机序列做取模运算,模的取值范围可以是:
             256 <= 模的数值 <= 随机函数值域
  可见通过模运算可以大大的提高了密钥数组的多样性,让模的数值也和用户密码关联,也就是通过用户密码的计算得到在模的取值范围内的一个值作为模。这样破解者要跟踪产生数组必须尝试各种可能的取值。前面看到,寻找数组在随机数列的位置需要做周期次试验,对应每个位置,需要做“随机函数值域-256”次试验,所以总的试验数是两者的乘积。
  rand()的周期 T大约16M,函数值范围0到32767,假定做一次模运算我们估算一下要想复现数组需要多少个试验,因为随机函数的种子不知道这就要对应 T种情况,每种情况对应一种数组排列,每种数组排列取模情况有32767-256种,即试验数是16M×(32767-256),大约是5.2乘10的11次方。这个函数周期和取值范围都太小所以所需要的试验数较小。试验次数估算公式是:函数周期T×(数域-256),所以选用随机函数要取周期大的例如周期大于10的20次方,随机数数域也是越大越好例如4.29G(C语言无符号整型范围),这样就比较安全了。函数数域大了可以做多次取模运算那样可以使试验次数再增加多个数量级。这里说的是最简单的情况,在实际应用时你还可以采用多个取模并用它们的值做代数运算得到密钥,如果用多个随机函数参与加密效果将更好,复现密钥数组的试验将达到天文数字,靠复现密钥数组破解是没有希望了。