使用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...");
}
}
Note: Encryption Key act as Password to Decrypt the same Image,otherwise it will corrupt the Image.
Enter key for Encryption : 1234
Encryption 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...");
}
}
Note: Encryption Key act as Password to Decrypt the same Image,otherwise it will corrupt the Image.
Enter a key for Decryption : 1234
Decryption Done…
通过使用与图像加密和解密相同的逻辑,我们也可以创建一个小的 GUI 项目。我们来看一下。