English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
Простое введение в исключительный или: Исключительный или - это двоичная операция, обозначаемая символом 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 (при отправке письма замените # на @) для отчета,并提供相关证据. При подтверждении правонарушения сайт незамедлительно удаляет涉嫌侵权的内容。