image encryption, why it can't decrypt
===

i try to encrypt an image using ACM and henon, encryption succesfull but it can't be decrypt. the problem is (problem decrypt is after xoring pixel value cant restore to initial position)

Encryption step is :

 1. Read image   
 2. Pixel extraction
 3. Shuffle pixel using ACM
 4. Generate henon pseudorandom        
 5. Rounded henon pseudo random            
 6. XORing shufle pixel vaue with henon pseudorandom
 7. Write image
 8. Cipher image done

Decryption step is :

 1. Read cipher image   
 2. Pixel extraction
 3. Generate henon pseudorandom        
 4. Rounded henon pseudo random            
 5. XORing shufle pixel vaue with henon pseudorandom
 6. Restore pixel position using inverse ACM
 7. Write image
 8. image restored

thanks..

encryption code below :

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

decrypt code below:



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

