【问题标题】: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 位/最高有效位),信息隐藏在图像的颜色通道中,而仅稍微修改颜色值。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2011-05-30
          • 2014-07-23
          • 1970-01-01
          • 2013-01-21
          • 1970-01-01
          • 1970-01-01
          • 2014-08-06
          相关资源
          最近更新 更多