English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

Объяснение принципов и использования арифметической операции XOR в Java

Простое введение в исключительный или: Исключительный или - это двоичная операция, обозначаемая символом XOR или ^, ее алгоритм выполняется по правилам: для каждого двоичного бита операндов, если они одинаковы, результат равен 0, если они различаются, результат равен 1.

Просто понимается как безкратное сложение, например, 1+1=0, 0+0=0, 1+0=1.

Описание требований

В информационную эпоху шифрование данных является очень важной темой, в процессе выполнения проекта я также реализовал более сложный шифровальный алгоритм, но из-за секретности используемых технологий, я реализую более простую версию, используя ввод-вывод потоков файла и операцию исключительного или для шифрования любого файла, относительно алгоритма дешифрования, он очень прост, подумайте сами, чтобы решить.

Математические принципы

Этот шифровальный алгоритм использует функцию исключительного или двух чисел, просто скажу о принципах исключительного или, это на самом деле операция над двоичным кодом файла, просто говоря, когда два двоичных бита одинаковы, результат равен 0, а когда они различаются, результат равен 1, посмотрите на следующий пример:

//Бинарное представление числа 7:
00000111
//Бинарное представление числа 2:
00000010
//Результат исключительного или двух чисел:
00000101 // это также число 5
//---------------------------
//Результат, полученный после исключительного или с числом 2
//Бинарное представление числа 5:
00000101
//Бинарное представление числа 2:
00000010
//Результат исключительного или двух чисел:
00000111 // это также 7, неужели это так же神奇, как будто мы снова вернулись к 7?

Реализация кода

import java.io.*;
class FileSecret
{
	public static void main(String[] args) throws Exception
	 {
		//Найти файл для шифрования, диск следует указать сам, ввод и вывод не должны быть на одном диске
		File inFile = new File("диск:\\зашифрованный файл");
		//Следует зашифровать файл в указанный диск
		File outFile = new File("диск:\\расшифрованный файл");
		//Установить канал данных, чтобы двоичные данные изображения流入
		FileInputStream input = new FileInputStream(inFile);
		FileOutputStream output = new FileOutputStream(outFile);
		//Во время чтения данные должны быть извлечены с помощью XOR с числом, это число должно быть сгенерировано с помощью некоторого шифровального алгоритма, здесь я просто генерирую число 928 (мои дни рождения), а затем выполняю XOR, и полученные данные выводятся
		int content = 0 ;
		//Эта переменная используется для хранения считанных данных, конечно, здесь можно использовать более длинные типы данных, такие как long, и мы также можем использовать другие типы данных, только чтобы удовлетворить условию, что данные на обоих концах могут быть преобразованы друг в друга, по крайней мере, можно强制转换 тип данных
		while((content=input.read())!=-1) // Если не достиг конца файла, то продолжайте читать данные, данные, которые были получены, хранятся в переменной content, -1 является признаком конца файла}}
		{
			output.write(content^928);
			//Запись в поток вывода
		}
		//Закрытие ресурсов
		input.close();
		output.close();
	}
}

Оценка функциональности кода

Для этого段 кода, функциональность в основном уже может удовлетворять требованиям, но есть недостатки, в первую очередь, не используется шифровальный алгоритм для генерации другого端的 числа для исключительного или, во вторую очередь, я не реализовал дешифрование файла, на самом деле дешифрование очень просто, достаточно внимательно прочитать раздел математических принципов, чтобы понять, как пишется алгоритм дешифрования, на самом деле шифрование и дешифрование не реализуются одновременно в одном месте, а шифрование и дешифрование выполняются с использованием одного и того же шифровального алгоритма.

Использование случайных чисел для улучшения алгоритма

В процессе, который был описан выше, мы фактически используем заданное значение для выполнения исключительного или с введенным двоичным файлом, можно ли заменить это соглашение случайным числом? Ответ да, сначала мы используем переменную типа int для хранения, а диапазон, который он может представлять, составляет: от минус 2,1 миллиарда до 2,1 миллиарда чисел,具体的代码 будет следующим:

//Метод для генерации случайного числа
import java.util.*;
public class RandomTest{
 public static void main(String[] args){
  Random random = new Random();
  int num = random.nextInt(11); //Это означает, что генерируется случайное число от 0 до 10, это случайное число мы должны сохранить, чтобы использовать его для шифрования и дешифрации
  System.out.println("Случайное число: " + num);
 }
}

Улучшенный алгоритм шифрования

Код для шифрования:

import java.io.*;
import java.util.*;
class FileSecret
{
	public static void main(String[] args) throws Exception
	 {
		//Найти файл для шифрования, диск следует указать сам, ввод и вывод не должны быть на одном диске
		File inFile = new File("диск:\\зашифрованный файл");
		//Следует зашифровать файл в указанный диск
		File outFile = new File("диск:\\расшифрованный файл");
		//Установить канал данных, чтобы двоичные данные изображения流入
		FileInputStream input = new FileInputStream(inFile);
		FileOutputStream output = new FileOutputStream(outFile);
		//Генерация другого числа для шифрования XOR
		Random random = new Random();
		int num = random.nextInt(11);
		//Это означает, что генерируется случайное число от 0 до 10, это случайное число мы должны сохранить, чтобы использовать его для шифрования и дешифрации
		System.out.println("Случайное число: " + num);
		//Во время чтения данные должны быть извлечены с помощью XOR с числом, это число должно быть сгенерировано с помощью некоторого шифровального алгоритма, здесь я просто генерирую число 928 (мои дни рождения), а затем выполняю XOR, и полученные данные выводятся
		int content = 0 ;
		//Эта переменная используется для хранения считанных данных, конечно, здесь можно использовать более длинные типы данных, такие как long, и мы также можем использовать другие типы данных, только чтобы удовлетворить условию, что данные на обоих концах могут быть преобразованы друг в друга, по крайней мере, можно强制转换 тип данных
		while((content=input.read())!=-1) // Если не достиг конца файла, то продолжайте читать данные, данные, которые были получены, хранятся в переменной content, -1 является признаком конца файла}}
		{
			output.write(content ^ num);
			//Запись в поток вывода
		}
		//Закрытие ресурсов
		input.close();
		output.close();
	}
}

Для реализации дешифрации файла необходимо сообщить генерируемое числом num на стороне дешифрации, в противном случае дешифрация файла не может быть реализована.

Код для дешифрации:

import java.io.*;
class FileSecret
{
	public static void main(String[] args) throws Exception
	 {
		//Найти файл для шифрования, диск следует указать сам, ввод и вывод не должны быть на одном диске
		File inFile = new File("диск:\\зашифрованный файл");
		//Следует зашифровать файл в указанный диск
		File outFile = new File("диск:\\расшифрованный файл");
		//Установить канал данных, чтобы двоичные данные изображения流入
		FileInputStream input = new FileInputStream(inFile);
		FileOutputStream output = new FileOutputStream(outFile);
		//Во время чтения данные должны быть извлечены с помощью XOR с числом, это число должно быть сгенерировано с помощью некоторого шифровального алгоритма, здесь я просто генерирую число 928 (мои дни рождения), а затем выполняю XOR, и полученные данные выводятся
		int content = 0 ;
		//Эта переменная используется для хранения считанных данных, конечно, здесь можно использовать более длинные типы данных, такие как long, и мы также можем использовать другие типы данных, только чтобы удовлетворить условию, что данные на обоих концах могут быть преобразованы друг в друга, по крайней мере, можно强制转换 тип данных
		while((content=input.read())!=-1) // Если не достиг конца файла, то продолжайте читать данные, данные, которые были получены, хранятся в переменной content, -1 является признаком конца файла}}
		{
			output.write(content^цифра, переданная из зашифрованного端);
			//Запись в поток вывода
		}
		//Закрытие ресурсов
		input.close();
		output.close();
	}
}

Еще одно улучшение

Действительно, в нашем коде стандартный шифр должен быть сгенерирован случайным образом и содержать символы, цифры и другие символы. Как мы можем сгенерировать такую строку шифра? Как преобразовать такую строку шифра в двоичный код? Предоставляю один способ: с помощью регулярного выражения Java можно сгенерировать любую строку, которую вы хотите, а затем с помощью метода преобразования строки можно сгенерировать соответствующий двоичный код. Я реализовал один极其 сложный метод генерации шифра, но не могу公开, так как это связано с материалами лабораторного проекта, и также можно использовать множество классических алгоритмов шифрования в области криптографии.

Обобщение

Это все, что касается в этой статье о принципе и использовании операции исключения Java для шифрования файлов и их использовании. Надеюсь, это поможет вам. Те, кто интересуется, могут продолжить читать наш сайт:

Пример кода реализации простого алгоритма шифрования и дешифрования с использованием операции исключения в Java

Пример кода реализации операции исключения для строки шестнадцатеричной системы счисления в Java

Анализ кода проблемы исключения Java

Если вы заметите недостатки, пожалуйста, оставьте комментарий. Спасибо друзьям за поддержку нашего сайта!

Заявление: содержимое этой статьи взято из Интернета, авторские права принадлежат соответствующему владельцу. Контент предоставлен пользователями Интернета, автоматически загружен на сайт, сайт не имеет права собственности, не производил ручную редактуру и не несет ответственности за связанные с этим юридические обязательства. Если вы обнаружите содержимое,涉嫌侵犯版权, пожалуйста, отправьте письмо по адресу: notice#oldtoolbag.com (при отправке письма замените # на @) для отчета,并提供相关证据. При подтверждении правонарушения сайт незамедлительно удаляет涉嫌侵权的内容。

Основной учебник
Вам может понравиться