(一)
密钥库标准化的意思是:密钥库作为一种公开的资源为大家所共享。理想的密钥库由真随机数组成,各元素之间没有任何关系,整体上分布均匀。
如果密钥库为大家所共享,它的完整性是个重要问题,如果你利用它做了某些事情,而它的数据发生了变化你再次应用时将给你带来数据灾害。一种简单的方法是对密钥库进行CRC计算并备案,下次检测发现计算的CRC和备案不同则可以确信密钥库是被更改过的。所以密钥库作为一种公开的资源为大家所共享时,同时应提供数据库的验证方式及数据,例如CRC值等。
密钥库作为资源一经公布就是一种已知的东西了,还有实用价值吗?其实不然,它是一种杂乱信息的集合,信息量是巨大的,配合其它方式可以很好的隐藏数据。下面讨论如何利用密钥库,这里只讨论利用密钥库生成密钥数组。
虽然密钥库是由真随机数建造的具有真随机数的特点,但一经公布就不再是真随机数组了。但是我们可以利用密钥库的数据来产生真随机数组。实际借助于随机函数就可以由密钥库生成无穷无尽的随机数组。方法多种多样这里仅以最简单的方式说明用法,例如我们要建造一个长度为N的随机序列R,我们选择一个性能优良周期T长(T>>N的随机函数F,设密钥库K的长度为N1(N1>>N),K(i)表示密钥库的任意元素。任意选择随机函数的种子和密钥库的起点生成有N个元素的新的序列R:
R[i] = K[i] + F[i]
这是最简单的组合形式,由于密钥库K和随机函数F的起始点可以任意选择所以能组合出形形色色的R。我们知道随机函数的生成值是有规律的但由于密钥库K的参与那些规律在R中已经不复存在,想靠分析序列值找出通式是徒劳的。下面看一下若用穷举法复现R需要如何去做:虽然我们的数组长度为N也许不是很大,但涉及到一个较为庞大的数据库,和周期较长的随机函数所以必须无遗漏的查找才可能复现其形成过程,寻找随机函数种子需要做T次尝试,寻找密钥库起点则需要做N1次尝试,总起来需要做4×T×N1次尝试,4是由于密钥库和随机函数的计算方向组合而产生的工作量,可见如果随机函数的周期很大时(例如10的30次方以上)是很不容易尝试成功的。实际上生成的密钥数组是不可能摆在那里让你分析的,往往形成后就参与运算混合到其它数据中去了,这里就是看看难度而已,如果上式K[i]和F[i]都有系数并且还有一个常数项,计算量将增加多个数量级。如果加入多个随机函数(例如n个)将使工作量变为4×T1×...×Tn×N1,追踪复现的难度可想而知,无异于大海捞针。
使用得当这里产生的密钥数组是很安全的,并且重要的是可以控制的。我们知道真随机数组是不可控制的,所以在管理和保存上很不方便。但是这里让密钥库数据和随机函数数据结合起来,产生的密钥数组使用起来可以像随机函数那样容易控制,而且像真随机数组那样元素之间没有关联。
用上述方法生成密钥数据只是简单的线性叠加并不一定是最好的,适当的利用高次项也许效果更好。
(二)
前面举例说明用线性叠加的方法使用密钥库和随机函数生成密钥数组。下面介绍另一种方法,使用随机排序方法生成密钥数组。
此方法仍然需要借助于随机函数。例如我们要建造一个长度为N的随机序列R,我们选择一个性能优良周期T长(T>>N的随机函数F,设密钥库K的长度为N1(N1>>N),K(i)表示密钥库的任意元素。由密钥库任意选择一个起始点,连续取N个元素组成序列K1,任意选择一个随机函数F的种子,利用随机函数对序列K1进行随机排序得到新的序列R。随机排序是在一个循环里完成的,例如对序列K1进行随机排序,这里有N个元素序号为0到N-1,随机函数选择好种子可以待命,从序号0开始取K1[0]和K1[M]进行交换,M等于F[0]的代数运算对N取模的数值(也就是从0到N-1中任选一值),依次向下直到N-1则完成了一遍随机排序。
随机排序使用更加灵活,你可以用不同的随机函数参与排序,也可以使用一个随机函数在不同的种子下进行排序,此种排序运算一般都是不可逆的,随机函数是在侧面影响排序的结果所以生成数组和随机函数没有数值上的关系。空间复杂度和时间复杂度不亚于(一)中的例子。同样都是可以控制的,在使用上极其方便。基本上可以看做是一种可控的真随机数发生方式。
(三)
前面(一)(二)谈到密钥库完整性检测及用密钥库生成密钥的两种方式。
下面谈一下利用密钥库对文件进行流密码加密。基本思路是:利用用户密码生成可用参数,利用随机函数和参数,对密钥库数据进行加工生成应用密钥流,对文件流进行加密。如果是通讯两边要使用同样的密钥库和加密软件。
具体做法,在输入用户密码的同时也输入了密钥库标识,使用用户密码生成若干参数Ki,由被加密文件得到其长度Nw,使用参数Kn和密钥库长度Nk及文件长度Nw,在密钥库中动态选取起点,并截取长度为Nw的一部分数组M,使用随机函数用参数Kx做种子对M进行加工得到密钥流,用密钥流对文件流或密文流加密或解密即可。
密钥库是真随机数的集合,是可以公开共享的,所以一经公开就不再是真随机数了,但经过加工后就可以使用了,这是因为密钥库本身是均匀分布的乱码,公布后为大家所共有,不再拥有真随机数不可预料等的属性,但是如果你用随机函数对其进行随机排序等操作,随机函数的种子不为他人知道,这时又恢复了数组的真随机数属性,而随机函数的种子是由用户密码衍生的,这样整个数组就在你的控制之下了。我们知道根据热力学第二定律,对任何数组的随机排序只能使熵增加,所以能实现数组的这种转换。
[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课