Akram Karam Akram Karam -4 years ago 161
Java Question

Image Encryption Using AES Algorithm

I want to encrypt the content of the image so i can see it encrypted with image viewer .

to this i tried to encrypt image pixel values , the RGB values i mean .

So all what i did is :

1- get all RGB values from image.

2- store all the RGB values into integer array

3- convert integer array into byte array for the AES input encryption.

4- get the output from the encryption and coverte into integer array.

5- set the new RGB Values from the new integer array.

But all this hard work didnt show off , i cant see the output image because the output values from AES Algorithm is too big !!, bigger than 255 and the RGB values must be between 0-255.

public class img {
static String IV = "AAAAAAAAAAAAAAAA";
static String encryptionKey = "0123456789abcdef";

static public void main(String args[]) throws Exception {
try {
BufferedImage image;
int width;
int height;

File input = new File("C:\\Users\\AKRAM\\Desktop\\sample.jpg");
image = ImageIO.read(input);
width = image.getWidth();
height = image.getHeight();

int[] t = new int[width * height * 3];
int k = 0;
int kk = 0;

// fill the table t with RGB values;
for (int i = 0; i < height; i++) {

for (int j = 0; j < width; j++) {

Color c = new Color(image.getRGB(j, i));
int r = c.getRed();
int g = c.getGreen();
int b = c.getBlue();

t[k] = r;
k++;
t[k] = g;
k++;
t[k] = b;
k++;

}
}

// convert table of RGB values into byte Array for the Encryption
byte[] bb = integersToBytes(t);

/* AES Encryption */
byte[] cipher = encrypt(bb, encryptionKey);

t = convertByte2Int(cipher);

// create image with table RGB values;
for (int i = 0; i < height; i++) {

for (int j = 0; j < width; j++) {

int r = t[kk];
kk++;
int g = t[kk];
kk++;
int b = t[kk];
kk++;

Color newColor = new Color(r, g, b);
image.setRGB(j, i, newColor.getRGB());

}
}
//write the output image
File ouptut = new File("C:\\Users\\AKRAM\\Desktop\\output.jpg");
ImageIO.write(image, "jpg", ouptut);

} catch (Exception e) {
}
}// end main

public static byte[] encrypt(byte[] plainText, String encryptionKey) throws Exception {
Cipher cipher = Cipher.getInstance("AES/CBC/NoPadding", "SunJCE");
SecretKeySpec key = new SecretKeySpec(encryptionKey.getBytes("UTF-8"), "AES");
cipher.init(Cipher.ENCRYPT_MODE, key, new IvParameterSpec(IV.getBytes("UTF-8")));
return cipher.doFinal(plainText);
}

public static byte[] integersToBytes(int[] values) throws IOException {
ByteArrayOutputStream baos = new ByteArrayOutputStream();
DataOutputStream dos = new DataOutputStream(baos);
for (int i = 0; i < values.length; ++i) {
dos.writeInt(values[i]);
}

return baos.toByteArray();
}

public static int[] convertByte2Int(byte buf[]) {
int intArr[] = new int[buf.length / 4];
int offset = 0;
for (int i = 0; i < intArr.length; i++) {
intArr[i] = (buf[3 + offset] & 0xFF) | ((buf[2 + offset] & 0xFF) << 8) | ((buf[1 + offset] & 0xFF) << 16)
| ((buf[0 + offset] & 0xFF) << 24);
offset += 4;
}
return intArr;
}


}

Answer Source

This will help you a bit I hope. It does not do the whole thing (we are not here to make your school homeworks) but helps you with the things you were stuck on. Compare it with your original code to understand where you made mistakes (there were more than one).

package kulatamicuda.aesimage.core;

import java.awt.Color;
import java.awt.image.BufferedImage;
import java.io.File;

import javax.imageio.ImageIO;

/**
 * Sample class for Stacko.
 * 
 * @author kulatamicuda
 *
 */
public final class Img {

  /**
   * RGB SIZE IS 3 (RED, GREEN, BLUE).
   */
  private static final int RGB_SIZE = 3;

  /**
   * Byte shifter for SIGNED->UNSIGNED.
   */
  private static final int BSHIFT = 0xFF;

  /**
   * Solution sample in main.
   * 
   * @param args
   *          ignored args
   */
  public static void main(String[] args) {
    try {
      BufferedImage image;
      int width;
      int height;

      File input = new File("sample.jpg");
      image = ImageIO.read(input);
      width = image.getWidth();
      height = image.getHeight();

      byte[] t = new byte[width * height * RGB_SIZE];
      int index = 0;

      // fill the table t with RGB values;
      for (int i = 0; i < height; i++) {

        for (int j = 0; j < width; j++) {

          Color c = new Color(image.getRGB(j, i));

          // As byte is SIGNED in Java overflow will occur for values > 127
          byte r = (byte) c.getRed();
          byte g = (byte) c.getGreen();
          byte b = (byte) c.getBlue();

          t[index++] = r;
          t[index++] = g;
          t[index++] = b;
        }
      }

      // Re-create image with table-encrypted RGB values
      BufferedImage newImage = new BufferedImage(width, height,
          BufferedImage.TYPE_3BYTE_BGR);
      index = 0;
      for (int i = 0; i < height; i++) {

        for (int j = 0; j < width; j++) {

          // Need to deal with values < 0 so binary AND with 0xFF
          // Java 8 provides Byte.toUnsignedInt but I am from the old school ;-)
          int r = t[index++] & BSHIFT;
          int g = t[index++] & BSHIFT;
          int b = t[index++] & BSHIFT;

          Color newColor = new Color(r, g, b);
          newImage.setRGB(j, i, newColor.getRGB());

        }
      }
      // write the output image
      File output = new File("output.jpg");
      ImageIO.write(newImage, "jpg", output);

    } catch (Exception e) {
      e.printStackTrace();
    }
  }

}
Recommended from our users: Dynamic Network Monitoring from WhatsUp Gold from IPSwitch. Free Download