📜  用于图像加密和解密的java代码 - Java(1)

📅  最后修改于: 2023-12-03 15:27:10.608000             🧑  作者: Mango

用于图像加密和解密的Java代码

本文介绍了一种基于Java语言的图像加密和解密方法,并提供了代码片段以供使用和参考。

加密方法

图像加密的方法是将原始图片中的像素值加上一个随机生成的密钥值,从而得到加密后的图像。具体实现方法如下:

import java.awt.image.BufferedImage;
import java.util.Random;

public class ImageEncryptor {
    private int key;

    public ImageEncryptor(int key) {
        this.key = key;
    }

    public BufferedImage encrypt(BufferedImage image) {
        Random random = new Random(key);
        BufferedImage encrypted = new BufferedImage(image.getWidth(), image.getHeight(), image.getType());

        for(int x = 0; x < image.getWidth(); x++) {
            for(int y = 0; y < image.getHeight(); y++) {
                int pixel = image.getRGB(x, y);
                int red = (pixel & 0x00ff0000) >> 16;
                int green = (pixel & 0x0000ff00) >> 8;
                int blue = pixel & 0x000000ff;

                red = Math.min(255, (red + random.nextInt(256)) / 2);
                green = Math.min(255, (green + random.nextInt(256)) / 2);
                blue = Math.min(255, (blue + random.nextInt(256)) / 2);

                encrypted.setRGB(x, y, (red << 16) | (green << 8) | blue);
            }
        }

        return encrypted;
    }
}

该类的构造函数需要传入一个整数类型的密钥值,用于初始化随机种子。encrypt方法接受一个BufferedImage类型的图片作为加密原始图片,返回一个新的加密后的BufferedImage

加密方法首先创建一个新的BufferedImage用于存放加密后的图片。然后利用随机数生成器每个像素随机生成一个加密值,然后将原像素值加上这个加密值并取平均值,得到新的像素值,最后将新的像素值设置到加密后的图片对象中。

解密方法

解密一个加密过的图像就是将图像中加上的密钥值减去,从而得到原始图像。下面是解密方法的实现代码。

import java.awt.image.BufferedImage;

public class ImageDecryptor {
    private int key;

    public ImageDecryptor(int key) {
        this.key = key;
    }

    public BufferedImage decrypt(BufferedImage image) {
        ImageEncryptor encryptor = new ImageEncryptor(key);
        BufferedImage decrypted = encryptor.encrypt(image);

        for(int x = 0; x < image.getWidth(); x++) {
            for(int y = 0; y < image.getHeight(); y++) {
                int pixel1 = image.getRGB(x, y);
                int red1 = (pixel1 & 0x00ff0000) >> 16;
                int green1 = (pixel1 & 0x0000ff00) >> 8;
                int blue1 = pixel1 & 0x000000ff;

                int pixel2 = decrypted.getRGB(x, y);
                int red2 = (pixel2 & 0x00ff0000) >> 16;
                int green2 = (pixel2 & 0x0000ff00) >> 8;
                int blue2 = pixel2 & 0x000000ff;

                int red = Math.max(0, Math.min(255, (red2 - red1)));
                int green = Math.max(0, Math.min(255, (green2 - green1)));
                int blue = Math.max(0, Math.min(255, (blue2 - blue1)));

                image.setRGB(x, y, (red << 16) | (green << 8) | blue);
            }
        }

        return image;
    }
}

该类的构造函数也需要传入一个整数类型的密钥值,用于初始化随机种子。decrypt方法接受一个加密后的BufferedImage类型的图片作为加密原始图片,返回一个新的解密后的BufferedImage

解密方法首先利用加密器对加密后的图片进行一次加密操作,然后计算出加密前后的像素值差值,得到原始像素值,最后将解密后的像素值设置到新的图片对象中。

使用示例

下面是一个简单的使用示例:

import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import javax.imageio.ImageIO;

public class ImageEncryptionExample {
    public static void main(String[] args) throws IOException {
        int key = 123456;
        BufferedImage image = ImageIO.read(new File("original.png"));

        // 加密图片
        ImageEncryptor encryptor = new ImageEncryptor(key);
        BufferedImage encrypted = encryptor.encrypt(image);
        ImageIO.write(encrypted, "png", new File("encrypted.png"));

        // 解密图片
        ImageDecryptor decryptor = new ImageDecryptor(key);
        BufferedImage decrypted = decryptor.decrypt(encrypted);
        ImageIO.write(decrypted, "png", new File("decrypted.png"));
    }
}

该示例首先读取一张名为original.png的图片,接着使用加密器将原始图片加密后保存到文件encrypted.png中。然后使用解密器将密钥值传入,对encrypted.png进行解密后保存到文件decrypted.png中。