-3

到目前为止,我已经在十六进制编辑器中打开了图像并查看了字节。但是,对于我的生活,我无法识别声音。我为此花了几天时间。我什至尝试在 Audacity 中打开文件(作为“原始数据”)并播放它。无非是“噪音”。试图创建直方图/频率分析,但没有。

任何帮助,将不胜感激。

4

1 回答 1

5

隐写术通常通过将第二张图像或一些数据隐藏在另一张图像的低位中来工作。这些值总体上变得非常微不足道,并且对图像的视觉外观几乎没有影响。

要显示第二个数据,您需要屏蔽最高位,然后通常按比例放大剩余值。

但是,您需要提前知道:

  • 使用了多少低位(两个对于次要图像非常常见)
  • 剩余数据如何组织(如果不是图像):
    • 是否(位)缩放,多少
    • 什么顺序(水平,垂直扫描线......)。
    • 是否所有颜色组件都在使用中?哪一个以及如何将数据拆分为组件...
    • 是音频文件还是音频数据
    • 生成的数据是否经过压缩、加密、...
    • 音频需要有符号的值,数据中的值是有符号的,它们是否移位了……(这会窃取一位,这意味着字节可能必须被打包以产生可听的东西)

等等

没有这些信息,它就毫无用处(你可以尝试可能的猜测,但它们将是猜测,你可以这样做很长时间)。

无论如何,我在下面提供了一个显示该过程的基础,但是如果不知道原始数据是如何组织的,那么剩下的内容以及是否正确提取几乎是“不可能”确定的:

这是使用预先知道的图像在低 2 位中隐藏另一个图像(猫)的过程的结果:

var img = new Image;
img.onload = unstegano;
img.crossOrigin = "";
img.src = "//i.imgur.com/DkCZMJN.png";  // contains a hidden image

document.body.appendChild(img);

function unstegano() {
  var canvas = document.createElement("canvas"),
      ctx = canvas.getContext("2d");
  
  canvas.width = this.naturalWidth;
  canvas.height = this.naturalHeight;
  ctx.drawImage(this, 0, 0);
  
  // get pixels
  var idata = ctx.getImageData(0, 0, canvas.width, canvas.height),
      data = idata.data, i = 0, len = data.length;
  
  while(i < len) {
      data[i] = (data[i++] & 3)<<6;  // masks two first bits, shifts it to scale it
      data[i] = (data[i++] & 3)<<6;
      data[i] = (data[i++] & 3)<<6;
      i++
  }
  ctx.putImageData(idata, 0 ,0);
  document.body.appendChild(canvas);
}

使用提供的图像,您会得到看起来像噪音的东西,但这并不重要,因为音频数据在任何情况下都会产生噪音图像 - 您现在的挑战是利用这种噪音(或“噪音”)制作任何东西:

var img = new Image;
img.onload = unstegano;
img.crossOrigin = "";
img.src = "//i.imgur.com/IpaDzB4.png";
document.body.appendChild(img);

function unstegano() {
  var canvas = document.createElement("canvas"),
      ctx = canvas.getContext("2d");
  
  canvas.width = this.naturalWidth;
  canvas.height = this.naturalHeight;
  ctx.drawImage(this, 0, 0);
  
  // get pixels
  var idata = ctx.getImageData(0, 0, canvas.width, canvas.height),
      data = idata.data, i = 0, len = data.length;
  
  while(i < len) {
      data[i] = (data[i++] & 1)<<7;  // masks first bit, shifts it to scale it
      data[i] = (data[i++] & 1)<<7;
      data[i] = (data[i++] & 1)<<7;
      i++
  }
  ctx.putImageData(idata, 0 ,0);
  document.body.appendChild(canvas);
}

于 2015-03-29T01:08:33.320 回答