C++ 编码增强型LSB反向器

C++ 编码增强型LSB反向器,c++,python,image-processing,steganography,C++,Python,Image Processing,Steganography,我无意中发现了一个隐写图像,它的IDAT结构为12个块,最后一个LSB稍微小一点。PNG。在我进入问题的真正要点之前,我会详细阐述一下问题的结构,因为我需要澄清一些事情,所以请不要将其标记为离题,因为它不是。我只需要解释脚本背后的概念,这样我就可以了解问题本身了。它肯定已经将数据嵌入到自身中。通过改变增强的LSB值,消除每个像素的高级位(最后一个最低有效位除外),数据似乎被隐藏。所以所有字节都将是0或1,因为256值范围内的0或1不会给出任何可见颜色。基本上,0保持为0,1成为最大值,即255。

我无意中发现了一个隐写图像,它的IDAT结构为12个块,最后一个LSB稍微小一点。PNG。在我进入问题的真正要点之前,我会详细阐述一下问题的结构,因为我需要澄清一些事情,所以请不要将其标记为离题,因为它不是。我只需要解释脚本背后的概念,这样我就可以了解问题本身了。它肯定已经将数据嵌入到自身中。通过改变增强的LSB值,消除每个像素的高级位(最后一个最低有效位除外),数据似乎被隐藏。所以所有字节都将是0或1,因为256值范围内的0或1不会给出任何可见颜色。基本上,0保持为0,1成为最大值,即255。我一直在用许多不同的方法分析这张图像,但除了三个颜色值RGB中完全缺少一个值和三分之一的颜色值中增加了另一个值之外,我没有看到任何奇怪的事情。然而,研究这些并替换字节并没有给我任何帮助,我甚至不知道这条途径是否值得追求

因此,我正在研究用Python、PHP或C/C++开发一个脚本,该脚本将反转该过程并“恢复”增强的LSB

我将其转换为24位.BMP,并通过卡方隐写分析追踪红色曲线,可以确定文件中存在隐写数据

首先,有8个以上的垂直区域。这意味着隐藏的数据略多于8kB。一个像素可用于在每个RGB色调的LSB中隐藏一个三位。所以我们可以隐藏98x225x3位。为了获得千字节数,我们除以8和1024:98x225x3/8x1024。嗯,应该是8.1千字节左右。但事实并非如此

对文件.JPG扩展名的APPO和APP1标记的分析也给出了一些令人尴尬的输出:

Start Offset: 0x00000000
*** Marker: SOI (xFFD8) ***
  OFFSET: 0x00000000

*** Marker: APP0 (xFFE0) ***
  OFFSET: 0x00000002
  length     = 16
  identifier = [JFIF]
  version    = [1.1]
  density    = 96 x 96 DPI (dots per inch)
  thumbnail  = 0 x 0

*** Marker: APP1 (xFFE1) ***
  OFFSET: 0x00000014
  length          = 58
  Identifier      = [Exif]
  Identifier TIFF = x[4D 4D 00 2A 00 00 00 08 ]
  Endian          = Motorola (big)
  TAG Mark x002A  = x[002A]

  EXIF IFD0 @ Absolute x[00000026]
    Dir Length = x[0003]
    [IFD0.x5110                          ] = 
    [IFD0.x5111                          ] = 0
    [IFD0.x5112                          ] = 0
    Offset to Next IFD = [00000000]

*** Marker: DQT (xFFDB) ***
  Define a Quantization Table.
  OFFSET: 0x00000050
  Table length = 67
  ----
  Precision=8 bits
  Destination ID=0 (Luminance)
    DQT, Row #0:   2   1   1   2   3   5   6   7 
    DQT, Row #1:   1   1   2   2   3   7   7   7 
    DQT, Row #2:   2   2   2   3   5   7   8   7 
    DQT, Row #3:   2   2   3   3   6  10  10   7 
    DQT, Row #4:   2   3   4   7   8  13  12   9 
    DQT, Row #5:   3   4   7   8  10  12  14  11 
    DQT, Row #6:   6   8   9  10  12  15  14  12 
    DQT, Row #7:   9  11  11  12  13  12  12  12 
    Approx quality factor = 94.02 (scaling=11.97 variance=1.37)
我几乎确信没有应用加密算法,因此隐藏后没有密钥实现。我的想法是编写一个脚本,该脚本将移动LSB值并返回原始值。我在几个结构分析、统计攻击、BPC下运行了该文件

图像的直方图显示了一种特定的颜色,带有一个不寻常的尖峰。我已经尽我所能操纵了它,试图查看任何隐藏的数据,但没有效果。这些是RGB值的直方图,如下所示:

然后是多个IDAT块。但是,我通过在每个像素位置定义随机的颜色值来组合一幅类似的图像,我也用其中的几个来结束。到目前为止,我在它们里面也发现了很少的东西。更有趣的是,颜色值在图像中重复的方式。看来,重复使用颜色的频率可以提供一些线索。但是,我还没有完全理解这种关系,如果有的话。此外,只有一列和一行像素在其alpha通道上不具有255的完整值。我甚至将图像中每个像素的X、Y、A、R、G和B值解释为ASCII码,但最后没有任何东西太清晰可辨。即使是LSB平均值的绿色曲线也不能告诉我们任何事情。没有明显的中断。以下是其他几个柱状图,显示RGB蓝色值的奇怪曲线:

但是卡方分析的红色曲线显示出一些差异。它能看到我们看不到的东西。统计检测比我们的眼睛更敏感,我想这是我的最后一点。然而,红色曲线中也有一种延迟。即使没有隐藏数据,它也会以最大值开始,并在一段时间内保持这种状态。几乎是假阳性。它看起来像图像中的LSB,非常接近随机,算法需要大量的像素。记住,在达到阈值之前,分析是在不断增加的像素群上进行的,它可以确定实际上,它们毕竟不是随机的,红色曲线开始下降。隐藏数据也会出现同样的延迟。隐藏1或2 kb,但红色曲线不会在该数据量之后立即下降。它会等待一点,这里分别是大约1.3KB和2.6KB。以下是十六进制编辑器中数据类型的表示:

byte = 166
signed byte = -90
word = 40,358
signed word = -25,178
double word = 3,444,481,446
signed double word = -850,485,850
quad = 3,226,549,723,063,033,254
signed quad = 3,226,549,723,063,033,254
float = -216652384.
double = 5.51490063721e-093
word motorola = 42,653
double word motorola = 2,795,327,181
quad motorola = 12,005,838,827,773,085,484
这是另一个光谱来确认蓝色RGB值的行为


请注意,我需要经历所有这些,以澄清我所追求的情况和编程问题。这本身就让我的问题没有偏离主题,所以如果它没有被标记为这样,我会很高兴。谢谢。

如果图像应用了LSB增强,我想不出办法将其恢复到原始状态,因为没有关于RGB原始值的线索。根据其最低有效值,它们被设置为255或0 一点我在这里看到的另一个选择是,这是否是某种协议,包括量子隐写术

Matlab和一些隐写分析技术可能是解决问题的关键

下面是一个Java卡方类,用于一些统计分析:

private long[] pov = new long[256];
and three methods as

public double[] getExpected() {
        double[] result = new double[pov.length / 2];
        for (int i = 0; i < result.length; i++) {
            double avg = (pov[2 * i] + pov[2 * i + 1]) / 2;
            result[i] = avg;
        }
        return result;
}
public void incPov(int i) {
        pov[i]++;
}
public long[] getPov() {
        long[] result = new long[pov.length / 2];
        for (int i = 0; i < result.length; i++) {
            result[i] = pov[2 * i + 1];
        }
        return result;

那么,你到底在问什么?我已经提过两次了,但我会再提一次。我可能需要将增强的LSB值反转回其原始状态,并且我需要自动执行此过程,因此我需要想一种方法来用Python、C/C++或PHP编写此概念的代码。对,您已经编写了一个问题的详细描述,但我在您的帖子中没有看到直接的问题。我希望这不是请为我写代码,因为在这样的基础上结束这个问题会浪费很多精力。所以,你能不能提出一个真正的问题,这个问题是可以回答的?我需要找到一种方法来执行这个任务——当然不是有人从零开始为我编写代码。我知道这是个好办法。。如果有人能告诉我如何才能做到这一点,我很乐意自己编写代码,但到目前为止我还没有任何想法。所以,你基本上是问编码是如何完成的,我该如何反转它?不。上面的卡方完全来自这个Java源代码,另一个是用python编写的。如果这是量子隐写术,那么这一切都是徒劳的,我注定要失败。关键是你的图像中有大量的噪音,这让我相信这要么是你正确排除的增强LSB值,要么是量子技术。相反,我无法决定它可能是什么。将量子信息隐藏在通过通道的量子纠错码的码字中。这意味着,我不能简单地用监控信道的能力进行窃听,但如果没有密钥,就无法区分消息和信道噪声。换句话说,除此之外,肯定还有其他原因。同样,“噪音”不仅仅指文件的视觉表现。它可能与十六进制转储或诸如此类的东西有关;所有不可读/损坏的数据作为一个整体。
int pRGB = image.getRGB(x, y);
int alpha = (pRGB >> 24) & 0xFF;
int blue = (pRGB >> 16) & 0xFF;
int green = (pRGB >> 8) & 0xFF;
int red = pRGB & 0xFF;