处理保存期间的图像数据更改

时间:2016-09-06 11:19:02

标签: image encryption processing

我正在尝试创建一个程序来隐藏图像文件中的数据。数据位隐藏在每个像素蓝色值的最后一位。前四个像素包含后续数据字节的长度。

当我将数据加密到图像然后解密而不保存图像时,一切正常。但是,如果我将数据加密为图像,然后保存,然后再次打开文件并尝试解密,则解密失败,因为值似乎已经改变。

我想知道是否有类似于txt文件发生的事情,其中​​有包含字节顺序数据的BOM预先放入文件中?

如果我更改color c = crypted.pixels[pos + i];,代码就有效 到readByteAt函数中的color c = original.pixels[pos + i]; 首先运行加密功能,然后运行解密功能。 这导致代码在仍在程序存储器中的刚加密图像上运行解密功能,而不是从文件中读取它。

欢迎任何有关导致此问题或如何预防此问题的想法!

这是完整的(杂乱的)代码:

 
    PImage original;
PImage crypted;
int imagesize;
boolean ready = false;
void setup() {
  size(100, 100);
  imagesize = width * height;
}

void draw() {
}

void encrypt()
{
  original = loadImage("image.jpg");
  original.loadPixels();
  println("begin encrypt");
  int pos = 0;
  byte b[] = loadBytes("DATA.txt");
  println("encrypting in image...");
  int len = b.length;
  println("len " + len);
  writeByteAt((len >> (3*8)) & 0xFF, 0);
  writeByteAt((len >> (2*8)) & 0xFF, 8);
  writeByteAt((len >> (1*8)) & 0xFF, 16);
  writeByteAt(len & 0xFF, 24);
  pos = 32;
  for (int i = 3; i < b.length; i++) { 
    int a = b[i] & 0xff;
    print(char(a));
    writeByteAt(a, pos);
    pos += 8;
  }

  original.updatePixels();
  println();
  println("done");
  original.save("encrypted.jpg");

}
void writeByteAt(int b, int pos)
{
  println("writing " + b + " at " + pos);
  for (int i = 0; i < 8; i++)
  {
    color c = original.pixels[pos + i];
    int v = int(blue(c));
    if ((b & (1 << i)) > 0)
    {
      v = v | 1;
    } else
    {
      v = v & 0xFE;
    }
    original.pixels[pos+i] = color(red(c), green(c), v);
    //original.pixels[pos+i] = color(255,255,255);
  }
}

int readByteAt(int pos)
{
  int b = 0;
  for (int i = 0; i < 8; i++)
  {
    color c = crypted.pixels[pos + i];
    int v = int(blue(c));

    if ((v & 1) > 0)
    {
      b += (1 << i);
    }
  }
  return b;
}
void decrypt()
{
  crypted = loadImage("encrypted.jpg");
  crypted.loadPixels();
  println("begin decrypt");
  int pos = 0;
  PrintWriter output = createWriter("out.txt"); 
  println("decrypting...");
  int len = 0;
  len += readByteAt(0) << 3*8;
  len += readByteAt(8) << 2*8;
  len += readByteAt(16) << 1*8;
  len += readByteAt(24);
  pos = 32;
  if(len >= imagesize)
  {
    println("ERROR: DATA LENGTH OVER IMAGE SIZE");
    return;
  }
  println(len);

  while (pos < ((len+1)*8)) { 
    output.print(char(readByteAt(pos)));
    print(char(readByteAt(pos)));
    pos += 8;
  }
  output.flush(); // Writes the remaining data to the file
  output.close();
  println("\nDone");
}

void keyPressed()
{
  if(key == 'e')
  {
  encrypt();
  }
  if(key == 'd')
  {
  decrypt();
  }
}

0 个答案:

没有答案