图像加密,为什么它无法解密?

时间:2012-07-31 14:08:28

标签: java image encryption

我正在尝试使用ACM和henon加密图像,加密成功,但无法解密。问题是(问题解密是在XORing像素值之后,它无法将其恢复到初始位置)。

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

加密步骤是:

  1. 阅读图片
  2. 像素提取
  3. 使用ACM随机播放像素
  4. 生成henon伪随机
  5. 圆形的henon伪随机
  6. XORing shufle pixel vaue with henon pseudorandom
  7. 写图片
  8. 密码图像完成
  9. 解密步骤是:

    1. 读取密码图片
    2. 像素提取
    3. 生成henon伪随机
    4. 圆形的henon伪随机
    5. XORing shufle pixel vaue with henon pseudorandom
    6. 使用反ACM恢复像素位置
    7. 写图片
    8. 图片已恢复
    9. 感谢。

      以下加密代码:

        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"));  
      }
      

1 个答案:

答案 0 :(得分:1)

您应该将每个阶段分为两个方法:一个要做,另一个要撤消。然后你应该编写一组简短的测试来生成数千个随机输入,并在每个测试中检查input.equals(undoIt(doIt(input)));或类似的东西。

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