I'm trying to encrypt an image using ACM and henon, encryption is successful, but it can't be decrypted. The problem is (problem decrypt is after XORing pixel value, it can't restore it to initial position).
encryption scheme according to this : http://ieeexplore.ieee.org/xpl/articleDetails.jsp?tp=&arnumber=5054653&contentType=Conference+Publications&queryText%3Dimage+encryption+henon
Encryption step is:
- Read image
- Pixel extraction
- Shuffle pixel using ACM
- Generate henon pseudorandom
- Rounded henon pseudo random
- XORing shufle pixel vaue with henon pseudorandom
- Write image
- Cipher image done
Decryption step is:
- Read cipher image
- Pixel extraction
- Generate henon pseudorandom
- Rounded henon pseudo random
- XORing shufle pixel vaue with henon pseudorandom
- Restore pixel position using inverse ACM
- Write image
- 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"));
}