Бакалаврська дипломна робота Шифр на основі перестановок байтів
.pdf51
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б |
||
Затверд. |
Лужецький В. А. |
|
|
|
|