9

ACM と henon を使用して画像を暗号化しようとしています。暗号化は成功しますが、復号化できません。問題は (問題の復号化は、ピクセル値を XOR した後で、初期位置に復元できないことです)。

これによる暗号化スキーム: http://ieeexplore.ieee.org/xpl/articleDetails.jsp?tp=&arnumber=5054653&contentType=Conference+Publications&queryText%3Dimage+encryption+henon

暗号化の手順は次のとおりです。

  1. 画像を読む
  2. ピクセル抽出
  3. ACM を使用してピクセルをシャッフルする
  4. ヘノン疑似乱数を生成する
  5. 丸められた Henon 疑似乱数
  6. Henon疑似乱数を使用したシャッフルピクセル値のXOR
  7. 書き込み画像
  8. 暗号化された画像

復号化の手順は次のとおりです。

  1. 暗号イメージの読み取り
  2. ピクセル抽出
  3. ヘノン疑似乱数を生成する
  4. 丸められた Henon 疑似乱数
  5. Henon疑似乱数を使用したシャッフルピクセル値のXOR
  6. 逆 ACM を使用してピクセル位置を復元する
  7. 書き込み画像
  8. 画像復元

ありがとう。

以下の暗号化コード:

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

1 に答える 1

1

各段階を 2 つの方法に分ける必要があります。1 つは実行する方法で、もう 1 つは元に戻す方法です。次に、何千ものランダムな入力を生成する一連の短いテストを作成し、それぞれについてチェックinput.equals(undoIt(doIt(input)));するか、そのようなものを作成する必要があります。

いずれかのテストが失敗した場合は、どこから調べればよいかがわかります。

于 2012-09-28T01:11:28.183 に答える