我正在尝试使用ACM和henon加密图像,加密成功,但是无法解密。问题是(问题解密是在对像素值进行XOR后,无法将其还原到初始位置)。

根据此加密方案:
http://ieeexplore.ieee.org/xpl/articleDetails.jsp?tp=&arnumber=5054653&contentType=Conference+Publications&queryText%3Dimage+encryption+henon

加密步骤为:

  • 阅读图像
  • 像素提取
  • 使用ACM随机播放像素
  • 生成henon伪随机
  • 圆形的henon伪随机
  • 使用henon伪随机XORing混合像素值
  • 写图片
  • 完成密码图像

  • 解密步骤为:
  • 读取密码图像
  • 像素提取
  • 生成henon伪随机
  • 圆形的henon伪随机
  • 使用henon伪随机XORing混合像素值
  • 使用逆ACM还原像素位置
  • 写图片
  • 镜像已还原

  • 谢谢。

    加密代码如下:
      img = ImageIO.read(new File("5x5grayscale.bmp"));
      Raster pixel = img.getData();
      pxl = new int[img.getWidth()][img.getHeight()];
      pxl2 = new int[img.getWidth()][img.getHeight()];
    
      for(int j=0;j<img.getHeight();j++){
        for(int i=0;i<img.getWidth();i++){
          pxl[i][j]= pixel.getSample(i, j, 0);
          pxl2[i][j]= pixel.getSample(i, j, 0);
        }
      }
    
      // shuffe pixel ACM iterration 1
      System.out.println("shuffle iteration  1");
      for(int i=0;i<5;i++){
        for(int j=0;j<5;j++){
          x[xx]=(1*i + c*j)%5;
          y[xx]=(d*i + e*j)%5;
          //System.out.println("-new coordinate ="+i+" , "+j+"="+x[xx]+","+y[xx]);
          xx++;
        }
      }
    
      //shuffle pixel ACM 2 sd 10
      for(int k=0;k<9;k++){
        System.out.println("shuffle iteration "+(k+2));
        xx=0;
        for(int i=0;i<5;i++){
          for(int j=0;j<5;j++){
            xtemp = x[xx];
            ytemp = y[xx];
            x[xx] = (1*xtemp + c*ytemp) % 5;
            y[xx] = (d*xtemp + e*ytemp) % 5;
    
            System.out.println("-new coordinate="+i+" , "+j+"="+x[xx]+","+y[xx]);
            xx++;
          }
        }
      }
    
      xx=0;
      for (int a =0;a<5;a++){
        for(int b=0;b<5;b++){
          pxl[a][b]= pxl2[x[xx]][y[xx]];
          xx++;
          //System.out.println(pxl[a][b]);
        }
      }
    
      System.out.println("===================================henon============================");
      double k[] = new  double[102];
      int inter[] = new int [102];
    
      k[0] = 0.01;
      k[1] = 0.02;
      double a=1.4;
      double b=0.3;
    
    
      System.out.println("generate pseudo random");
      for(int i=0;i<100;i++){
        k[i+2] =1-a*(Math.pow(k[i+1], 2))+b*k[i];
        // System.out.println(k[i]);
      }
    
      System.out.println("after rounded");
      for(int i=0;i<100;i++){
        inter[i]= (int) Math.round((k[i]*65536)%256);
        if(inter[i]<0){
          inter[i]=inter[i]+256;
        }
        //    System.out.println(inter[i]);
      }
    
      System.out.println("setelah xor");
      System.out.println("setelah xor");
      cipher = new int[img.getWidth()][img.getHeight()];
      int z=0;
      for(int ii=0;ii<img.getWidth();ii++){
        for(int jj=0;jj<img.getHeight();jj++){
          cipher[ii][jj]=inter[z]^pxl[ii][jj];
          // System.out.println(cipher[ii][jj]);
          z++;
        }
      }
    
      image = new BufferedImage(img.getWidth(),img.getHeight(),BufferedImage.TYPE_BYTE_GRAY);
      WritableRaster write = image.getRaster();
    
      for(int ii=0;ii<img.getHeight();ii++){
        for(int jj=0;jj<img.getWidth();jj++){
          write.setSample(jj, ii, 0,cipher[jj][ii] );
        }
      }
    
      ImageIO.write(image, "bmp", new File("acmhenonenkrip5x5.bmp"));
      System.out.println("cipher image done");
    }
    

    解密以下代码:
    public static void main (String[] args) throws java.lang.Exception
    {
      int c =2;
      int d = 2;
      int e = c*d+1;
      int x[]= new int[100];
      int y[]= new int[100];
      int xx=0;
      int xtemp;
      int ytemp;
      int sama=1;
      BufferedImage img ;
      BufferedImage image = null;
      int [][]pxl = null ;
      int [][]pxl2 = null ;
      int [][]cipher=null;
    
      img = ImageIO.read(new File("acmhenonenkrip5x5.bmp"));
      Raster pixel = img.getData();
    
      pxl = new int[img.getWidth()][img.getHeight()];
      pxl2 = new int[img.getWidth()][img.getHeight()];
    
    
      for(int j=0;j<img.getHeight();j++){
        for(int i=0;i<img.getWidth();i++){
          pxl[i][j]= pixel.getSample(i, j, 0);
          pxl2[i][j]= pixel.getSample(i, j, 0);
        }
      }
    
      System.out.println("===================================henon============================");
      double k[] = new  double[30];            int inter[] = new int [30];
    
      k[0] = 0.01;
      k[1] = 0.02;
      double a=1.4;
      double b=0.3;
    
    
      System.out.println("generate pseudo random");
      for(int i=0;i<27;i++){
        k[i+2] =1-a*(Math.pow(k[i+1], 2))+b*k[i];
        // System.out.println(k[i]);
      }
    
      System.out.println("after rounded");
      for(int i=0;i<27;i++){
        inter[i]= (int) Math.round((k[i]*65536)%256);
        if(inter[i]<0){
          inter[i]=inter[i]+256;
        }
        // System.out.println(inter[i]);
      }
    
      System.out.println("after  xor");
      cipher = new int[img.getWidth()][img.getHeight()];
      int z=0;
      for(int ii=0;ii<img.getWidth();ii++){
        for(int jj=0;jj<img.getHeight();jj++){
          cipher[ii][jj]=inter[z]^pxl[ii][jj];
          // System.out.println(cipher[ii][jj]);
          z++;
        }
      }
    
      System.out.println("===================================inverseacm============================");
    
      System.out.println("decrypt iteration1");
    
      for(int i=0;i<5;i++){
        for(int j=0;j<5;j++){
          x[xx]=((e*i) + (-c*j))%5;
          if(x[xx]<0){
            x[xx]=x[xx]+5;
          }
          y[xx]=((-d*i) + (1*j))%5;
          if(y[xx]<0){
            y[xx]=y[xx]+5;
          }
          // System.out.println(xx+"-new coordinate ="+i+","+j+"="+x[xx]+","+y[xx]);
          xx++;
        }
      }
    
      for(int iter=0;iter<9;iter++){
        System.out.println("decrypt iteration "+(iter+2));
        xx=0;
        for(int i=0;i<5;i++){
          for(int j=0;j<5;j++){
            xtemp = x[xx];
            ytemp = y[xx];
            x[xx]=((e*xtemp) + (-c*ytemp))%5;
            if(x[xx]<0){
                x[xx]=x[xx]+5;
            }
            y[xx]=((-d*xtemp) + (1*ytemp))%5;
            if(y[xx]<0){
              y[xx]=y[xx]+5;
            }
            // System.out.println(xx+"-new coordinate ="+i+","+j+"="+x[xx]+","+y[xx]);
            xx++;
          }
        }
      }
    
      xx=0;
      for(int ii=0;ii<img.getWidth();ii++){
        for(int jj=0;jj<img.getHeight();jj++){
          System.out.println("cip"+cipher[x[xx]][y[xx]]); //tracing pixel value of cipher
          xx++;
        }
      }
    
      xx=0;
      for(int ii=0;ii<img.getWidth();ii++){
        for(int jj=0;jj<img.getHeight();jj++){
          System.out.println("pxl"+pxl[x[xx]][y[xx]]); //tracing pixel value of pxl
          xx++;
        }
      }
    
      image = new BufferedImage(img.getWidth(),img.getHeight(),BufferedImage.TYPE_BYTE_GRAY);
      WritableRaster write = image.getRaster();
    
      for(int ii=0;ii<img.getHeight();ii++){
        for(int jj=0;jj<img.getWidth();jj++){
          write.setSample(jj, ii, 0,cipher[jj][ii] );
        }
      }
    
      ImageIO.write(image, "bmp", new File("acmhenondekrip5x5.bmp"));
    }
    

    最佳答案

    您应该将每个阶段分为两种方法:一种是执行,另一种是撤消。然后,您应该编写一小组测试,以生成数千个随机输入,并在每个输入上检查input.equals(undoIt(doIt(input)));或类似内容。

    如果任何测试失败,您将知道从哪里开始寻找。

    10-07 13:20