由于棋盘覆盖的特殊性和灵活性,使得将其用于文件加密,可以大大增强信息的安全性。即使将该加密算法公之于众,想通过密文和部分明文得到密匙几乎是一件不可能的事情。

一、棋盘覆盖的工作原理

定义1:在一个2k×2k个方格组成的棋盘中,如果恰有一个方格与其它方格不同,则称该方格为一特殊方格,且称该棋盘为一特殊棋盘,显然,特殊方格在棋盘上出现的位置有4k种情形.因此,对vk≥o,有4k种不同的特殊棋盘。

定义2:所谓棋盘覆盖,是指要用如图1所示的4种不同形态的L型骨牌覆盖—个给定的特殊棋盘上除特殊方格以外的所有方格,且任何两个L型骨牌不得重叠覆盖。

基于棋盘覆盖的文件加密技术

因此,在任何一个2k×2k的棋盘覆盖中,用到的L型骨牌个数恰为(4k-1)/3。

1、用分治法对一个特殊棋盘进行覆盖的原理

(1)设k>0,将2k×2k棋盘分割为4个2k-1×2k-1的子棋盘;

(2)特殊方格必位于4个较小子棋盘之一中,其余3个子棋盘中无特殊方格。为了将这3个无特殊方格的子棋盘转化为特殊棋盘,我们可以用—个L型骨牌覆盖这3个较小子棋盘的会合处,
这3个子棋盘上被L型骨牌覆盖的方格就成为该棋盘上的特殊方格,从而将原问题转化为4个较小规模的棋盘覆盖问题;

(3)递归地使用这种分割,直至棋盘简化为1×1棋盘。

2、棋盘覆盖实例

设棋盘覆盖的递归算法如下:

先将棋盘划分为四个大小相同的子棋盘,为了叙述方便,不妨将这四个子棋盘分别称之为:左上角子棋盘,右上角子棋盘,左下角子棋盘,右下角子棋盘,具体如图2所示。

基于棋盘覆盖的文件加密技术

然后按递归覆盖左上角子棋盘,递归覆盖右上角子棋盘,递归覆盖左下角子棋盘,递归覆盖右下角子棋盘的顺序覆盖整个棋盘。

当k=3,则得到如图3所示的不同特殊棋盘的棋盘覆盖。

基于棋盘覆盖的文件加密技术

从结果可以看出,不同特殊棋盘上相应的格子里有很多内容是相同的。

3、递归算法的改进

上述两种不同特殊方格的棋盘覆盖的内容之所以大同小异,会不会是由于采用相同的递归算法造成的呢?因此,不妨按递归覆盖右上角子棋盘,递归覆盖左上角子棋盘,递归覆盖右下角子棋盘,递归覆盖左下角子棋盘的顺序覆盖整个棋盘,则得到如图4所示的结果。

基于棋盘覆盖的文件加密技术

与图3中特殊方格坐标(1,1)所对应的棋盘覆盖相比较,棋盘中的内容有很大差别,正是因为这种差别,后面所说的加密算法就是充分利用这一点来达到目的的。

二、用棋盘覆盖实现文件加密的原理

1、棋盘大小的选择

所谓棋盘大小的选择,实质上就是k值的合理选择。为了实现文件到棋盘的单射,棋盘格子的个数至少必须等于文件的大小。只有当文件的大小为4k(其中忌k整数),棋盘的大小才与文件的大小相一致.事实上,文件的大小往往不可能为4k,因此,棋盘的大小一般要比文件大,虽然只要棋盘比文件大,都可以实现文件到棋盘的单射,但考虑到大的棋盘所占的内存空间也越大,因此我们一般选择比相应文件要大的较小棋盘。

假设某个待加密的文件的大小为filesize,那么棋盘的大小为4k,其中k= min{n4n≥filesize。n∈z}。

2、根据棋盘对文件进行加密的过程

为了简单起见,我们不妨对文件进行逐个字节加密。具体的文件加密过程:

(1)测量出要加密的文件的大小为filesize;

(2)顺序读出文件的内容;

(3)假设读出文件的第i个字节的内容为ch,则可以通过i计算出棋盘上具体的格子位置,具体方法是:

基于棋盘覆盖的文件加密技术

然后通过ch=ch×board[ row] [col] mod256实现ch的加密,其中×表示加密运算。board[i][j]表示棋盘上第i行和第j列的格子的骨牌号;

(4)将加密后的密文依次写入密文文件中。

3、根据棋盘对文件进行解密的过程

跟上述的文件加密过程相反,我们必须对密文进行逐个字节解密,具体的文件解密过程:

(1)测量出要解密的文件的大小为filesize;

(2)顺序读出文件的内容;

(3)假设读出文件的第i个字节的内容为ch,则可以通过i计算出棋盘上具体的格子位置,具体方法是:

基于棋盘覆盖的文件加密技术
然后通过ch=ch+board[ row][ col] mod256实现ch的解密,其中0表示解密运算,board [i][j]表示棋盘上第i行和第j列的格子的骨牌号;

(4)将解密后的明文依次写入明文文件中。

小知识之递归算法

递归算法是把问题转化为规模缩小了的同类问题的子问题。然后递归调用函数(或过程)来表示问题的解。