LSB算法

来自WHY42
imported>Soleverlee2015年11月7日 (六) 07:09的版本 →‎LSB(LeastSignificantBits)算法

隐写术

隐写术是指将数据隐藏到载体文件中的方法,载体文件(cover file)相对隐秘文件的大小(指数据含量,以比特计)越大,隐藏后者就越加容易。

因为这个原因,数字图像(包含有大量的数据)在因特网和其他传媒上被广泛用于隐藏消息。这种方法使用的广泛程度无从查考。例如:一个24位的位图中的每个像素的三个颜色分量(红,绿和蓝)各使用8个比特来表示。如果我们只考虑蓝色的话,就是说有28种不同的数值来表示深浅不同的蓝色。而像11111111和11111110这两个值所表示的蓝色,人眼几乎无法区分。因此,这个最低有效位就可以用来存储颜色之外的信息,而且在某种程度上几乎是检测不到的。如果对红色和绿色进行同样的操作,就可以在差不多三个像素中存储一个字节的信息。

LSB(LeastSignificantBits)算法

LSB即最低有效位算法。假设数据文件有8个字节,我们利用每一个字节的最小位,来存储一个隐藏字节的1bit,这样每8个byte的数据文件就可以隐藏1byte的隐藏数据。例如,假设数据文件的8个字符为:

0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff

我们要隐藏一个'h'字符,假设使用ASCII码,'h'=104=0x68=1101000(2)。我们采取算法:

char arr[] = {0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff };
char s = 'h';
for (int j = 0; j < 8; j++) {
    char t = arr[j];
    t &= 0xFE;                 //FE, to make sure LSB is always zero
    t|= (char)((h >> j) & 1);
    arr[j] = t;
}

则完成后,数据为:

1  2  3  4  5  6  7  8
0  1  1  0  1  0  0  0
fe fe fe ff fe ff ff fe  

解密时:

char ch = 0;
char byte[] = {fe, fe, fe, ff, fe, ff, ff, fe  };
for (int b = 7; b >= 0; b--) {
    ch += (byte[b] & 1);
    if (b != 0)
        ch <<= 1;
}