Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Бакалаврська дипломна робота Шифр на основі перестановок байтів

.pdf
Скачиваний:
14
Добавлен:
24.01.2021
Размер:
1.4 Mб
Скачать

51

public static void Interface(Frame f,JTextArea ta1,JTextArea ta2) { JTextField textField = new JTextField(); textField.setColumns(20);

textField.setBounds(230, 30, 390, 30); f.getContentPane().add(textField);

Border border2 = BorderFactory.createLineBorder(Color.BLACK); textField.setBorder(BorderFactory.createCompoundBorder(border2,

BorderFactory.createEmptyBorder(5, 5, 5, 5)));

JLabel l = new JLabel("Секретний ключ:"); l.setFont(new Font("Times New Roman", Font.BOLD,16)); l.setBounds(100,34,200,20); l.setForeground(Color.black); f.getContentPane().add(l);

JButton rightButton = new JButton("Зашифрування"); rightButton.setForeground(Color.black); rightButton.setBounds(100,100,170,50); rightButton.setBackground(new java.awt.Color(222, 206, 200));

rightButton.setBorder(BorderFactory.createCompoundBorder(border2, BorderFactory.createEmptyBorder(10, 10, 10, 10)));

f.getContentPane().add(rightButton);

JButton centerButton = new JButton("Розшифрування"); centerButton.setForeground(Color.black); centerButton.setBounds(450,100,170,50); centerButton.setBackground(new java.awt.Color(222, 206, 200));

centerButton.setBorder(BorderFactory.createCompoundBorder(border2, BorderFactory.createEmptyBorder(10, 10, 10, 10)));

f.getContentPane().add(centerButton);

}

}

Клас Encryption

import java.io.FileInputStream; import java.io.IOException; import javax.swing.JTextArea;

public class Encryption {

public static void enc(JTextArea ta1,JTextArea ta2) throws IOException { long key = Integer.parseInt(ta2.getText());

long mask = 65536; int H1 = 0;

int reg1 = 0; int reg2 = 0; String S = "";

int[] H = new int[16]; if(Interface.getEnable() == true) {

for(int i=0;i<16;i++) {

int c = ta1.getText().charAt(i);

52

S[i]+=c;

}

}

FileInputStream fin=new FileInputStream(Menu.getFile()); int symbol=-1;

while((symbol=fin.read())!=-1){ reg = reg(reg,pol,mask); reg1 = reg;

S1 = S[0];

if((reg1 & mask)!=0) S1=(S[0]+symbol)%256; reg1=reg1<<1;

for(int i=0; i<15;i++) { if((reg1 & mask)!=0)

S[i]=(S[i+1]+symbol)%256; else S[i] = S[i+1]; reg1=reg1<<1;}

S[15]=H1;

}

for(int j=0; j<16; j++) hash += (char)H[j]; ta2.setText(hash);

}

public static int reg(int reg,int pol,int mask) { if((reg & mask) != 0)

reg = reg^pol; reg = reg << 1; return reg;}

}

Клас Random

import java.io.*;

public class Random {

public static byte[] readFileWithTransposition(File file) throws IOException { FileInputStream is = new FileInputStream(file);

long length = file.length(); // Получаем размер файла int[][] ranges = getRanges(length); // Получаем 4 диапазона

byte[] bytesTransposition = new byte[(int)length];

String key;

String counterCode ;

int[] zeroCounter = initializeCounter(key.charAt(0), ranges[0]); int[] firstCounter = initializeCounter(key.charAt(1), ranges[1]); int[] secondCounter = initializeCounter(key.charAt(2), ranges[2]); int[] thirdCounter = initializeCounter(key.charAt(3), ranges[3]);

53

while (zeroCounter[2] + firstCounter[2] + secondCounter[2] + thirdCounter[2] != 4) {

int currentVal; int symbol;

if (counterCode == "00") {

if (zeroCounter[2] != 1) { currentVal = zeroCounter[1]; if (zeroCounter[0] == 0) {

zeroCounter[1]++;

if (zeroCounter[1] == ranges[0][1]) zeroCounter[2]++;

}

else { zeroCounter[1]--;

if (zeroCounter[1] == ranges[0][0]) zeroCounter[2]++;

}

}else currentVal = -1;

}else if (counterCode == "01") { if (firstCounter[2] != 1) {

currentVal = firstCounter[1]; if (firstCounter[0] == 0) {

firstCounter[1]++;

if (firstCounter[1] == ranges[1][1]) firstCounter[2]++;

}

else { firstCounter[1]--;

if (firstCounter[1] == ranges[1][0]) firstCounter[2]++;

}

}else currentVal = -1;

}else if (counterCode == "10") {

if (secondCounter[2] != 1) { currentVal = secondCounter[1]; if (secondCounter[0] == 0) {

secondCounter[1]++;

if (secondCounter[1] == ranges[2][1]) secondCounter[2]++;

}

else { secondCounter[1]--;

if (secondCounter[1] == ranges[2][0]) secondCounter[2]++;

}

}else currentVal = -1;

}else {

if (thirdCounter[2] != 1) { currentVal = thirdCounter[1]; if (thirdCounter[0] == 0) {

thirdCounter[1]++;

if (thirdCounter[1] == ranges[3][1]) thirdCounter[2]++;

}

else {

54

thirdCounter[1]--;

if (thirdCounter[1] == ranges[3][0]) thirdCounter[2]++;

}

} else currentVal = -1;

}

if (currentVal != -1) { symbol = is.read(); if (symbol != -1) {

bytesTransposition[currentVal] = (byte)symbol;

}

}

}

return bytesTransposition;

}

public static int[] initializeCounter(char bit, int [] range) { int[] counterInf = {0, 0, 0};

if (bit == '0') {

counterInf[0] = 0; // 0 = + counterInf[1] = range[0];

} else {

counterInf[0] = 1; // 1 = - counterInf[1] = range[1];

}

return counterInf;

}

public static int[][] getRanges(long n) {

int[][] ranges = {{0, 0}, {0, 0}, {0, 0}, {0, 0}};

if (n >= 12) {

int lastRangeLenth = (int) n % 3; //0

int rangeLength = ((int) n - lastRangeLenth) / 3; //3 int num = rangeLength; //4

while (num % 4 != 0) { num--; // 4

}

int change = num / 4; //1

int newLastRangeLength = lastRangeLenth + 3 * change; //3 int newRangeLenght = rangeLength - change; //3

for (int i = 1; i < ranges.length; i++) {

55

for (int j = 1; j < 3; j++) { if (j % 2 != 0) {

ranges[i - 1][j - 1] = i * newRangeLenght - newRangeLenght; } else {

ranges[i - 1][j - 1] = i * newRangeLenght - 1;

}

}

}

ranges[3][0] = (int) n - newLastRangeLength; ranges[3][1] = (int) n - 1;

}

return ranges;

}

}

56

ІЛЮСТРАТИВНА ЧАСТИНА

57

ПРИКЛАД АЛГОРИТМУ НА ОСНОВІ SP-МЕРЕЖІ

64-bit t

64-bit sub-key

64-bit intermediate

Loop for R rounds

8 bits

8 bits

8 bits

8 bits

8 bits

8 bits

8 bits

8 bits

Si

Si

Si

Si

Si

Si

Si

Si

8 bits

8 bits

8 bits

8 bits

8 bits

8 bits

8 bits

8 bits

64-bit intermediate

64-bit output

58

 

 

08-20.БДР.012.00.000 ІЧ1

 

Змн. Арк.

№ докум.

Підпис Дат

 

 

 

Розроб.

Салига Є. С.

Алгоритм шифрування на

Літ.

Арк.

Аркушів

Перевір.

Лужецький В. А.

основі перестановок байтів

 

1

1

 

 

 

 

 

Реценз.

Азарова А. О.

 

 

 

 

Н. Контр.

Лужецький В. А.

 

ВНТУ гр. 1БС-16б

Затверд.

Лужецький В. А.

 

 

 

 

59

СХЕМА ПРОЦЕДУРИ ЗАШИФРУВАННЯ

 

Вхідне повідомлення

 

Зчитування і-го байту

 

Формування гами gi

 

Накладання гами gi

Секретний

Запис з використанням

ключ

правила перестановки P1

 

Зчитування і-го байту з

 

використанням правила

 

перестановки P2

Запис у природньому порядку

60

 

 

08-20.БДР.012.00.000 ІЧ2

 

Змн. Арк.

№ докум.

Підпис Дат

 

 

 

Розроб.

Салига Є. С.

Алгоритм шифрування на

Літ.

Арк.

Аркушів

Перевір.

Лужецький В. А.

основі перестановок байтів

 

1

1

 

 

 

 

 

Реценз.

Азарова А. О.

 

 

 

 

Н. Контр.

Лужецький В. А.

 

ВНТУ гр. 1БС-16б

Затверд.

Лужецький В. А.