图像中的隐写术

lea*_*erX -3 audio steganography image hex-editors

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

任何帮助,将不胜感激。

小智 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);
}
Run Code Online (Sandbox Code Playgroud)

使用所提供的图像,您会得到看起来像噪音的东西,但这无关紧要,因为音频数据在任何情况下都会产生噪音图像-您现在的挑战是要从噪音中制造出任何东西(或“噪音”) :

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);
}
Run Code Online (Sandbox Code Playgroud)