report_lab9
.docxМИНИСТЕРСТВО ЦИФРОВОГО РАЗВИТИЯ,
СВЯЗИ И МАССОВЫХ КОММУНИКАЦИЙ РОССИЙСКОЙ ФЕДЕРАЦИИ
ФЕДЕРАЛЬНОЕ ГОСУДАРСТВЕННОЕ БЮДЖЕТНОЕ ОБРАЗОВАТЕЛЬНОЕ УЧРЕЖДЕНИЕ ВЫСШЕГО ОБРАЗОВАНИЯ
«САНКТ-ПЕТЕРБУРГСКИЙ ГОСУДАРСТВЕННЫЙ УНИВЕРСИТЕТ ТЕЛЕКОММУНИКАЦИЙ ИМ. ПРОФ. М.А. БОНЧ-БРУЕВИЧА»
(СПбГУТ)
Факультет Инфокоммуникационных сетей и систем
Кафедра Защищенных систем связи
Дисциплина Разработка защищенного программного обеспечения
ОТЧЕТ ПО ЛАБОРАТОРНОЙ РАБОТЕ №9
Обработка бинарных файлов
(тема отчета)
Направление/специальность подготовки
10.03.01 Информационная безопасность
(код и наименование направления/специальности)
Студент:
(Ф.И.О., № группы) (подпись)
Преподаватель:
Цветков А.Ю.
(Ф.И.О) (подпись)
Цель лабораторной работы
Освоить работу с бинарными файлами с использованием средств Java
Используемое программное обеспечение
JDK 1.5 и выше.
Интегрированная среда разработки на Java.
Задание на лабораторную работу
Программа получает в аргументах 3 адреса файла и 1 число (ключ дешифрования)
args[0] - адрес исходного зашифрованного файла
args[1] - адрес расшифрованного файла
args[2] - адрес файла результата
args[3] - ключ дешифрования (byte). Для конвертирования в byte использовать Byte.parseByte(args[3])
Написать программу, которая:
Расшифровывает файл args[0] ключём args[3] по алгоритму XOR
Записывает результат расшифровки в файл args[1]
Над расшифрованным файлом выполняет указанные в задании действия, записывая результат задачи в файл args[2]
Проверить правильность работы программы
Собрать исполняемый jar и отправить на проверку
Основное задание:
После расшифровки файла args[0] в args[1] ключём args[3] проделать над ним следующие операции:
Считать переменную типа byte и вычесть 105
Считать переменную типа int и умножить на 105
Считать переменную типа long и прибавить 105
Результат каждой операции сохраняется в конечный файл args[2] long) Листинг программного кода основного задания
import java.io.*;
public class Main {
public static void main(String[] args) {
String inputfile = args[0];
String decryptfile = args[1];
String output = args[2];
byte key = Byte.parseByte(args[3]);
DataOutputStream dos;
DataInputStream dis;
try {
dis = new DataInputStream(new FileInputStream(inputfile));
dos = new DataOutputStream(new FileOutputStream(decryptfile));
while (dis.available() > 0) {
byte x = dis.readByte();
x ^= key;
dos.writeByte(x);
}
// Очистка внутреннего буффера и запись в файл
dos.flush();
dos.close();
} catch (IOException e) {
e.printStackTrace();
}
try {
dis = new DataInputStream(new FileInputStream(decryptfile));
dos = new DataOutputStream(new FileOutputStream(output));
dos.writeByte( (byte) dis.readByte() - 105 );
dos.writeInt( (int) dis.readInt() * 105 );
dos.writeLong( (long) dis.readLong() + 105 );
// Очистка внутреннего буффера и запись в файл
dos.flush();
dos.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
Вариант дополнительного задания
Зашифровать конечный файл args[2] в файл args[4] Ключ для повторного шифрования отличается. Передаётся аргументом args[5] Итого (в доп задаче):
args[0] - исходный зашифрованный файл с задачей
args[1] - файл, куда писать расшифровку args[0]
args[2] - файл, куда писать результаты операций над args[1]
args[4] - сюда зашифровать повторно файл args[2]
....
args[3] - ключ расшифровки исходного файла args[0]
args[5] - ключ для повторного шифрования в файл args[4]
Листинг программного кода дополнительного задания
import java.io.*;
public class Dop {
public static void main(String[] args) {
String inputfile = args[0];
String decryptfile = args[1];
String output = args[2];
byte key = Byte.parseByte(args[3]);
String outputdecrypt = args[4];
byte newkey = Byte.parseByte(args[5]);
DataOutputStream dos;
DataInputStream dis;
try {
dis = new DataInputStream(new FileInputStream(inputfile));
dos = new DataOutputStream(new FileOutputStream(decryptfile));
while (dis.available() > 0) {
byte x = dis.readByte();
x ^= key;
dos.writeByte(x);
}
// Очистка внутреннего буффера и запись в файл
dos.flush();
dos.close();
} catch (IOException e) {
e.printStackTrace();
}
try {
dis = new DataInputStream(new FileInputStream(decryptfile));
dos = new DataOutputStream(new FileOutputStream(output));
byte xbyte = (byte) dis.readByte();
int xint = (int) dis.readInt();
Long xlong = (long) dis.readLong();
dos.writeByte( (byte) (xbyte - 105) );
dos.writeInt( (int) (xint * 105) );
dos.writeLong( (Long) (xlong + 105) );
// Очистка внутреннего буффера и запись в файл
dos.flush();
dos.close();
} catch (IOException e) {
e.printStackTrace();
}
try {
dis = new DataInputStream(new FileInputStream(output));
dos = new DataOutputStream(new FileOutputStream(outputdecrypt));
while (dis.available() > 0){
byte x = dis.readByte();
x ^= newkey;
dos.writeByte(x);
}
// Очистка внутреннего буффера и запись в файл
dos.flush();
dos.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
Вывод
Изучены основные средства для работы с бинарными файлами в языке Java из пакета java.io, представляющие собой потоки ввода-вывода
Санкт-Петербург
2021