Лабораторна работа №4.
Криптографические методы защиты информации.
Шифрование
Задание: Зашифровать и расшифровать текст с использованием шифра Плейфера. В качестве входного текста взять реферат их первой работы.
т |
а |
н |
ц |
о |
р |
б |
в |
г |
д |
е |
є |
ж |
з |
и |
і |
ї |
й |
к |
л |
м |
п |
с |
у |
ф |
х |
ч |
ш |
щ |
ь |
ю |
я |
. |
, |
_ |
‘ |
Использовал ключевое слово : Танцор
1.Теория
Шифр Плейфера использует матрицу 5х5 (для латинского алфавита, для кирилического алфавита необходимо увеличить размер матрицы до 4х8), содержащую ключевое слово или фразу. Для создания матрицы и использования шифра достаточно запомнить ключевое слово и четыре простых правила. Чтобы составить ключевую матрицу, в первую очередь нужно заполнить пустые ячейки матрицы буквами ключевого слова (не записывая повторяющиеся символы), потом заполнить оставшиеся ячейки матрицы символами алфавита, не встречающимися в ключевом слове, по порядку (в английских текстах обычно опускается символ «Q», чтобы уменьшить алфавит, в других версиях «I» и «J» объединяются в одну ячейку). Ключевое слово может быть записано в верхней строке матрицы слева направо, либо по спирали из левого верхнего угла к центру. Ключевое слово, дополненное алфавитом составляет матрицу 5х5 и является ключом шифра.
Для того, чтобы зашифровать сообщение необходимо разбить его на биграммы (группы из двух символов), например «Hello World» становится «HE LL OW OR LD», и отыскать эти биграммы в таблице. Два символа биграммы соответствуют углам прямоугольника в ключевой матрице. Определяем положения углов этого прямоугольника относительно друг друга. Затем руководствуясь следующими 4 правилами зашифровываем пары символов исходного текста:
1. Если два символа биграммы совпадают, добавляем после первого символа «Х», зашифровываем новую пару символов и продолжаем. В некоторых вариантах шифра Плейфера вместо «Х» используется «Q».
2. Если символы биграммы исходного текста встречаются в одной строке, то эти символы замещаются на символы, расположенные в ближайших столбцах справа от соответствующих символов. Если символ является последним в строке, то он заменяется на первый символ этой же строки.
3. Если символы биграммы исходного текста встречаются в одном столбце, то они преобразуются в символы того же столбца, находящимися непосредственно под ними. Если символ является нижним в столбце, то он заменяется на первый символ этого же столбца.
4. Если символы биграммы исходного текста находятся в разных столбцах и разных строках, то они заменяются на символы, находящиеся в тех же строках, но соответствующие другим углам прямоугольника.
Для расшифровки необходимо использовать инверсию этих четырёх правил, откидывая символы «Х» (или «Q»), если они не несут смысла в исходном сообщении.
2. Реферат – небольшая часть для примера работы программы.
Закон України «Про інформацію»
Закон України «Про інформацію» закріплює право громадянУкраїни на інформацію, закладаєправовіосновиінформаційноїдіяльності, визначаєправовіформиміжнародногоспівробітництва в галузіінформації. Діяцього закону поширюється на інформаційнівідносини, яківиникають у всіх сферах життя і діяльностісуспільства і держави при одержанні, використанні, поширенні та зберіганніінформації. Закон складається з 6 розділів та 54 статей.
Розділ 1 цього Закону присвяченийзагальнимположенням, визначенню мети та завданнями Закону, а самеправовим основам одержання, використання, поширенняінформації в усіх сферах суспільногожиттяУкраїни, а такожсистеміінформації, їїджерелам, визначає статус учасниківінформаційнихвідносин,регулює доступ до інформації та забезпечуєїїохорону, захищає особу та суспільствовіднеправдивоїінформації. В ст..5 визначаютьпринципиінформаційнихвідносин: гарантованість права на інформацію, відкритість, доступністьінформації та свобода їїобміну, повнота і точністьінформації, законністьодержання, використання, поширення та зберіганняінформації.
3.Программа:
Файл cod2.java
package cod2;
import java.util.Scanner;
/**
*
* @author kalambyryura
*/
public class Cod2 {
private char[][] Table1 = {
{'т', 'а', 'н', 'ц', 'о', 'р'},
{'б', 'в', 'г', 'д', 'е', 'є'},
{'ж', 'з', 'и', 'і', 'ї', 'й'},
{'к', 'л', 'м', 'п', 'с', 'у'},
{'ф', 'х', 'ц', 'ш', 'щ', 'ь'},
{'ю', 'я', '.', ',', ' ', '\’'}
};
public String CodedText = "";
Files f = new Files();
/**
* @param args the command line arguments
*/
public static void main(String[] args) {
new Cod2().run();
}
private void run() {
System.out.println("Если хотите закодировать текст поместите его в файл \"data.txt\"");
System.out.println("результат кодирования будет в файле \"cod.txt\"");
System.out.println("\nЕсли хотите декодировать текст поместите его в файл \"cod.txt\"");
System.out.println("результат кодирования будет в файле \"data.txt\"");
System.out.println("\nКодировать нажмите 1");
System.out.println("Декодировать нажмите 2");
System.out.println("Любой другой чтобы выйти");
System.out.printf("Ваш выбор:");
Scanner s = new Scanner(System.in);
switch (s.nextInt()) {
case 1:
coding(f.readFromFile("D:/data.txt"));
f.writeToFile(CodedText, "D:/cod.txt");
break;
case 2:
coding(f.readFromFile("D:/cod.txt"));
f.writeToFile(CodedText, "D:/data.txt");
break;
default:
System.exit(0);
}
}
private void coding(String Text) {
int i1, i2, j1, j2;
int Tb1, Tb2 = 0;
for (int i = 0; i <Text.length(); i += 2) {
Tb1 = searchInTable1(Text.charAt(i));
if ((i + 1) >= Text.length()) {
Tb2 = searchInTable1(' ');
} else {
Tb2 = searchInTable1(Text.charAt(i + 1));
}
j1 = (int) Tb1 % 10;
i1 = (int) (Tb1 - j1) / 10;
j2 = (int) Tb2 % 10;
i2 = (int) (Tb2 - j2) / 10;
CodedText += Character.toString(Table1[i2][j1]) + Character.toString(Table1[i1][j2]);
if (i = i)(Char(‘ю’))
}
}
private int searchInTable1(char c) {
for (int i = 0; i < Table1.length; i++) {
for (int j = 0; j < Table1.length; j++) {
if (c == Table1[i][j]) {
return (i * 10) + j;
}
}
}
return 99;
}
private String cheсk(String Text) {
if ((Text.length() % 2) == 1) {
return Text += " ";
}
return Text;
}
Файл Files.java
package cod2;
import java.io.*;
import java.util.logging.Level;
import java.util.logging.Logger;
public class Files {
public String readFromFile(String file) {
BufferedReader in = null;
try {
in = new BufferedReader(new FileReader(file));
} catch (FileNotFoundException ex) {
Logger.getLogger(Cod2.class.getName()).log(Level.SEVERE, null, ex);
}
String line = null, nextLine = "";
try {
while ((line = in.readLine()) != null) {
nextLine += line;
}
} catch (IOException ex) {
Logger.getLogger(Cod2.class.getName()).log(Level.SEVERE, null, ex);
}
return nextLine;
}
public void writeToFile(String s, String file) {
FileWriter out = null;
try {
out = new FileWriter(file);
} catch (IOException ex) {
Logger.getLogger(Files.class.getName()).log(Level.SEVERE, null, ex);
}
try {
out.write(s);
} catch (IOException ex) {
Logger.getLogger(Files.class.getName()).log(Level.SEVERE, null, ex);
}
try {
out.close();
} catch (IOException ex) {
Logger.getLogger(Files.class.getName()).log(Level.SEVERE, null, ex);
}
}
}