LSB算法:修订间差异
imported>Soleverlee 小 Soleverlee移动页面Steganography:隐写术至LSB算法,不留重定向 |
imported>Soleverlee 无编辑摘要 |
||
第1行: | 第1行: | ||
=隐写术= | |||
隐写术是指将数据隐藏到载体文件中的方法,载体文件(cover file)相对隐秘文件的大小(指数据含量,以比特计)越大,隐藏后者就越加容易。 | |||
因为这个原因,数字图像(包含有大量的数据)在因特网和其他传媒上被广泛用于隐藏消息。这种方法使用的广泛程度无从查考。例如:一个24位的位图中的每个像素的三个颜色分量(红,绿和蓝)各使用8个比特来表示。如果我们只考虑蓝色的话,就是说有28种不同的数值来表示深浅不同的蓝色。而像11111111和11111110这两个值所表示的蓝色,人眼几乎无法区分。因此,这个最低有效位就可以用来存储颜色之外的信息,而且在某种程度上几乎是检测不到的。如果对红色和绿色进行同样的操作,就可以在差不多三个像素中存储一个字节的信息。 | 因为这个原因,数字图像(包含有大量的数据)在因特网和其他传媒上被广泛用于隐藏消息。这种方法使用的广泛程度无从查考。例如:一个24位的位图中的每个像素的三个颜色分量(红,绿和蓝)各使用8个比特来表示。如果我们只考虑蓝色的话,就是说有28种不同的数值来表示深浅不同的蓝色。而像11111111和11111110这两个值所表示的蓝色,人眼几乎无法区分。因此,这个最低有效位就可以用来存储颜色之外的信息,而且在某种程度上几乎是检测不到的。如果对红色和绿色进行同样的操作,就可以在差不多三个像素中存储一个字节的信息。 | ||
=LSB(LeastSignificantBits)算法= | |||
LSB即最低有效位算法。假设数据文件有8个字节,我们利用每一个字节的最小位,来存储一个隐藏字节的1bit,这样每8个byte的数据文件就可以隐藏1byte的隐藏数据。例如,假设数据文件的8个字符为: | |||
<source lang="lisp"> | |||
0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff | |||
</source> | |||
我们要隐藏一个'h'字符,假设使用ASCII码,'h'=104=0x68=1101000(2)。我们采取算法: | |||
<source lang="cpp"> | |||
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; | |||
} | |||
</source> | |||
则完成后,数据为: | |||
<pre> | |||
1 2 3 4 5 6 7 8 | |||
0 1 1 0 1 0 0 0 | |||
fe fe fe ff fe ff ff fe | |||
</pre> | |||
[[Category:Programe]] | [[Category:Programe]] |
2015年11月7日 (六) 07:07的版本
隐写术
隐写术是指将数据隐藏到载体文件中的方法,载体文件(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