LSB算法:修订间差异
imported>Soleverlee 无编辑摘要 |
imported>Soleverlee |
||
第25行: | 第25行: | ||
fe fe fe ff fe ff ff fe | fe fe fe ff fe ff ff fe | ||
</pre> | </pre> | ||
解密时: | |||
<source lang="cpp"> | |||
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; | |||
} | |||
</source> | |||
[[Category:Programe]] | [[Category:Programe]] |
2015年11月7日 (六) 07:09的版本
隐写术
隐写术是指将数据隐藏到载体文件中的方法,载体文件(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;
}