📜  使用Java加密和解密图像

📅  最后修改于: 2022-05-13 01:54:43.212000             🧑  作者: Mango

使用Java加密和解密图像

加密是将信息或数据转换为密码的过程,特别是为了防止未经授权的访问。在这些情况下,我们也会这样做,对于加密,我们将图像转换为字节数组,转换后我们将对字节数组的每个值应用 XOR 操作,并对字节的每个值执行 XOR 操作之后数组将被更改。现在执行操作后,我们将在 Image 中写入新数据,因此我们无法打开加密的 Image。这里的密钥将作为加密和解密图像的密码。

异或运算

正如我们现在知道如何执行 XOR 操作一样,我们将在这里看到 XOR 操作将如何工作。让我们考虑一个样本输入和输出的例子。

输入:

int key = 8 
int byte_val = 5

手术:

// Performing XOR operation between key and byte_val 
key ^ byte_val         

输出:

// Output of XOR operation 
13              

手术:

// Performing XOR operation between output and key
13 ^ key                

输出:

//  byte_val
5                

示例 1:

这是上面例子的截图。我们来看一下。

在上面的例子中,我们已经清楚地观察到我们的 key = 8 和 byte_val = 5,并且当我们对 key 和 byte_val 执行 XOR 操作时,它给出的输出为 13,现在如果我们再次对我们的输出“13”执行 XOR 操作和关键,我们再次得到我们的 byte_val。在加密和解密的情况下也执行相同的操作。

XOR 操作在字节数组和键的每个值之间执行,因此 Image 的所有数据都发生了变化,因此我们无法打开我们的 Image。现在,每当我们使用相同的键值字节数组值应用解密操作时,都会更改其原始值并能够看到我们的原始图像。

注意:您可以在任何 IDE 中离线执行以下给定的代码,因为您需要一个输入图像位置,它可以从该位置加载您在加密和解密路径中指定的图像。

在IDE上执行:

  • 像eclipse IDE一样打开IDE。
  • 创建一个新项目。
  • 根据需要创建一个新类,如 Encryption 或 Decryption。
  • 编写下面给出的以下代码,用于在 IDE 中进行加密和解密。
  • 只需按Ctrl+S即可保存,或者您可以转到文件并单击保存。
  • 现在,要运行代码,只需选择要执行的类,如加密,然后右键单击。
  • 作为Java应用程序运行。
  • 现在,您将看到用于输出的控制台窗口。

让我们看一下上述步骤的屏幕截图。

加密的可执行代码:

Java
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.Scanner;
 
public class Encryption {
    public static void main(String[] args)
        throws FileNotFoundException, IOException
    {
        Scanner sc = new Scanner(System.in);
        System.out.println("Note : Encryption Key act as Password to
          Decrypt the same Image,otherwise it will corrupt the Image.");
      
        // Here key is act as password to Encrypt and
        // Decrypt the Image
        System.out.print("Enter key for Encryption : ");
        int key = sc.nextInt();
                            
        // Selecting a Image for operation
        FileInputStream fis = new FileInputStream(
            "C:\\Users\\lenovo\\Pictures\\logo4.png");
                            
        // Converting Image into byte array, create a
        // array of same size as Image size
                            
        byte data[] = new byte[fis.available()];
                            
        // Read the array
        fis.read(data);
        int i = 0;
                            
        // Performing an XOR operation on each value of
        // byte array due to which every value of Image
        // will change.
        for (byte b : data) {
            data[i] = (byte)(b ^ key);
            i++;
        }
                            
        // Opening a file for writing purpose
        FileOutputStream fos = new FileOutputStream(
            "C:\\Users\\lenovo\\Pictures\\logo4.png");
                            
        // Writing new byte array value to image which
        // will Encrypt it.
                            
        fos.write(data);
                            
        // Closing file
        fos.close();
        fis.close();
        System.out.println("Encryption Done...");
    }
}


Java
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.Scanner;
 
public class Decryption {
   
    public static void main(String[] args)
        throws FileNotFoundException, IOException
    {
        Scanner sc = new Scanner(System.in);
        System.out.println(
            "Note : Encryption Key act as Password to Decrypt the same Image,
             otherwise it will corrupt the Image.");
         
        System.out.print("Enter a key for Decryption : ");
        int key = sc.nextInt();
           
        // Selecting a Image for Decryption.
           
        FileInputStream fis = new FileInputStream(
        "C:\\Users\\lenovo\\Pictures\\logo4.png");
         
        // Converting image into byte array,it will
        // Create a array of same size as image.
        byte data[] = new byte[fis.available()];
           
        // Read the array
           
        fis.read(data);
        int i = 0;
           
        // Performing an XOR operation
        // on each value of
        // byte array to Decrypt it.
        for (byte b : data) {
            data[i] = (byte)(b ^ key);
            i++;
        }
           
        // Opening file for writting purpose
        FileOutputStream fos = new FileOutputStream(
            "C:\\Users\\lenovo\\Pictures\\logo4.png");
           
        // Writting Decrypted data on Image
        fos.write(data);
        fos.close();
        fis.close();
        System.out.println("Decryption Done...");
    }
}


解密意味着将加密数据转换为原始形式只不过是解密。在图像解密的情况下,我们也将加密的图像转换为其原始形式。这里我们也将使用 XOR 操作来执行解密。正如我们在上面的 XOR 示例中观察到的,我们如何通过对输出和键值执行 XOR 操作来获得字节数组的原始值。我们将在这里使用相同的逻辑。

Java

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.Scanner;
 
public class Decryption {
   
    public static void main(String[] args)
        throws FileNotFoundException, IOException
    {
        Scanner sc = new Scanner(System.in);
        System.out.println(
            "Note : Encryption Key act as Password to Decrypt the same Image,
             otherwise it will corrupt the Image.");
         
        System.out.print("Enter a key for Decryption : ");
        int key = sc.nextInt();
           
        // Selecting a Image for Decryption.
           
        FileInputStream fis = new FileInputStream(
        "C:\\Users\\lenovo\\Pictures\\logo4.png");
         
        // Converting image into byte array,it will
        // Create a array of same size as image.
        byte data[] = new byte[fis.available()];
           
        // Read the array
           
        fis.read(data);
        int i = 0;
           
        // Performing an XOR operation
        // on each value of
        // byte array to Decrypt it.
        for (byte b : data) {
            data[i] = (byte)(b ^ key);
            i++;
        }
           
        // Opening file for writting purpose
        FileOutputStream fos = new FileOutputStream(
            "C:\\Users\\lenovo\\Pictures\\logo4.png");
           
        // Writting Decrypted data on Image
        fos.write(data);
        fos.close();
        fis.close();
        System.out.println("Decryption Done...");
    }
}

通过使用与图像加密和解密相同的逻辑,我们也可以创建一个小的 GUI 项目。我们来看一下。