【问题标题】:What does this bitwise operation perform?这个按位运算有什么作用?
【发布时间】:2020-11-20 23:51:22
【问题描述】:
我最近一直在做一些项目,我一直想进入隐写术。我查找了几种方法,但其中一种我不太明白。
(image[i][j].red & ~0x3) | ((file[f] & 0x60) >> 5);
(image[i][j].green & ~0x3) | ((file[f] & 0x18) >> 3);
(image[i][j].blue & ~0x7) | ((file[f] & 0x7));
我得到了它的一部分,比如 & ~0x3 和 & ~0x7 分别将红色/绿色的最后 2 位和蓝色的最后 3 位归零,但真正让我感兴趣的是文件 [f] & 0x60、0x18 和 0x7。 file 是从二进制文件中读取的无符号字符数组,image 是 rgb 矩阵,每个组件有 3 个无符号字符,分别代表红色、绿色和蓝色。顺便说一句,这一切都在 C 中。提前致谢
【问题讨论】:
标签:
c
bitwise-operators
bit-shift
steganography
【解决方案1】:
- 它将
red 的最低有效2 位替换为file[f] 的第6 位和第5 位。
- 它将
green 的最低有效2 位替换为file[f] 的第4 位和第3 位。
- 它将
blue 的最低3 位替换为file[f] 的第2、1 和0 位。
例如
+---+---+---+---+---+---+---+---+
file[f] | h | g | f | e | d | c | b | a |
+---+---+---+---+---+---+---+---+
+---+---+---+---+---+---+---+---+
& 0x60 | 0 | g | f | 0 | 0 | 0 | 0 | 0 |
+---+---+---+---+---+---+---+---+
+---+---+---+---+---+---+---+---+
>> 5 | 0 | 0 | 0 | 0 | 0 | 0 | g | f |
+---+---+---+---+---+---+---+---+
+---+---+---+---+---+---+---+---+
red | H | G | F | E | D | C | B | A |
+---+---+---+---+---+---+---+---+
+---+---+---+---+---+---+---+---+
& ~0x3 | H | G | F | E | D | C | 0 | 0 |
+---+---+---+---+---+---+---+---+
+---+---+---+---+---+---+---+---+
| | H | G | F | E | D | C | g | f |
+---+---+---+---+---+---+---+---+
想象每种颜色都是 0 到 255 之间的三个值的组合。白色是 255,255,255;黑色是 0,0,0;鲜红色为 255,0,0;亮黄色为255,255,0;等等
现在假设我们更改了替换这些数字的最低有效数字,因此我们最终使用 252,3,5 而不是 255,0,0。你会注意到其中的不同吗?也许不会。
【解决方案2】:
如果我们看一下这些幻数的二进制表示:
0x60 1100000
0x18 0011000
0x7 0000111
我们会看到它们是互斥的并且加起来等于0x7f,即1111111。所以我们可以使用它们来屏蔽输入文件的不同位,并以不同的颜色存储这些部分。例如。 file[f] & 0x60 >> 5 将给出第 6 位和第 7 位。我们丢失了第 8 位,但显然这是故意的。
【解决方案3】:
... | (file[f] & 0x60) >> 5) 之类的三个操作从file[f] 中屏蔽掉位,将它们移位并将它们存储在颜色通道中。在第一行中,第 5 位和第 6 位(第 0 位将是最低有效位)向右移动 (... >> 5) 并存储在红色通道的两个低位中。
对于第 3 位和第 4 位(存储在绿色通道的两个低位中)也是如此。 file[f] 的三个最低有效位(位号 0、1 和 2)直接存储在蓝色通道的相同位中。
通过像这样拆分 file 的字节(同时忽略第 8 位/最高有效位),信息隐藏在图像的颜色通道中,而仅稍微修改颜色值。