LSB算法:修订间差异

来自WHY42
imported>Soleverlee
Soleverlee移动页面Steganography:隐写术LSB算法,不留重定向
imported>Soleverlee
无编辑摘要
第1行: 第1行:
载体文件(cover file)相对隐秘文件的大小(指数据含量,以比特计)越大,隐藏后者就越加容易。
=隐写术=
隐写术是指将数据隐藏到载体文件中的方法,载体文件(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