首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用AES算法的图像加密

使用AES算法的图像加密
EN

Stack Overflow用户
提问于 2017-01-07 04:56:09
回答 1查看 4.9K关注 0票数 0

我想要加密图像的内容,以便我可以看到它与图像查看器加密。

为此,我尝试加密图像的像素值,我的意思是RGB值。

所以我所做的就是:

1-从图像中获取所有RGB值。

2-将所有RGB值存储到整数数组中

3-将整数数组转换为字节数组,用于AES输入加密。

4-获取加密的输出并转换为整数数组。

5-从新的整数数组设置新的RGB值。

但是所有这些努力并没有显示出来,我看不到输出图像,因为AES算法的输出值太大了!!,大于255,RGB值必须在0-255之间。

代码语言:javascript
复制
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;
  }

}

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-01-07 06:42:05

我希望这会对你有所帮助。它不会做所有的事情(我们不是来让你的学校做作业的),但它会帮助你做你一直坚持的事情。将它与您的原始代码进行比较,以了解您在哪里犯了错误(不止一个)。

代码语言:javascript
复制
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();
    }
  }

}
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/41514199

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档