Изучение методов разработки программного обеспечения для создания UDP сокетов и протоколов
Курсовой проект - Компьютеры, программирование
Другие курсовые по предмету Компьютеры, программирование
?чилась ошибка при расшифровке, то передаём
// необходимую информацию в отображение.
// Пример: from:INFO:room:message
fireActionPerformed(localAddress
+":"+INFO
+":"+room.getName()
+":"+"Ошибка при декодировании. Нет ключа или он не верен.");
}
}
// Передаём команду в систему отображения.
// Пример: from:MSG:room:message(from+":"+CMD_MESSAGE+":"+roomName+":"+message);
}
}
// INIT:room:public_key || ACPT:room:public_keyif(mes.startsWith(CMD_PRV_INIT) || mes.startsWith(CMD_PRV_ACCEPT)) {[] split = mes.split(":", 3);cmd = split[0];roomName = split[1];key = split[2];
NetRoom room = null;
// При инициализации защищённого соединения для какой-либо
// комнаты, необходимо добавить её в список комнат, к которым
// причастен пользователь.(cmd.equals(CMD_PRV_INIT)) {
room = new NetRoom(roomName);.add(room);
} else
// При принятии приглашения на создание защищенного соединения,
// ищем по названию уже существующую комнату.
room = getRoomByName(roomName);(room != null) {
// Проверяем установку флага защищённого соединения..setProtected(true);
// Преобразуем полученный массив байт в открытый.
// Сначала из массива байт образуется спецификация ключа.
X509EncodedKeySpec pubKeySpec = new X509EncodedKeySpec(key.getBytes());
try {
// Затем создаётся фабрика ключей на основе нужного алгоритма шифрования.
KeyFactory keyFactory = KeyFactory.getInstance(RSACipher.ALGORITHM);
// И наконец создаётся сам открытый ключ.
PublicKey pubKey = keyFactory.generatePublic(pubKeySpec);
// Устанавливаем его в качестве параетра нужной комнаты.
room.setExternalPublicKey(pubKey);
} catch (InvalidKeySpecException e) {.printStackTrace();
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
}
}
// В отображение необходимо передавать лишь команду инициализации
// защищённого соединения.(cmd.equals(CMD_PRV_INIT)) {
// Пример: from:INIT:room:public_key
fireActionPerformed(from+":"+cmd+":"+roomName);
// И необходимо сформировать и передать пакет подтверждения
// соединения. А вместе с ним передать ключ для шифровки сообщений.
sendMessage(new String (room.getKeyPair().getPublic().getEncoded()),
roomName, CMD_PRV_ACCEPT);
}
}
}
Для того, чтобы клиенты знали о существовании друг друга, в каждом из них при запуске программы начинается исполнятся специальная нить, в которой с определённой периодичностью посылается широковещательный пакет определённого формата, который и свидетельствует о наличии клиента в сети. За запуск этой нити отвечает метод runBroadcasting(), описанный ниже:
/**
* Данный метод запускает процесс передачи "маячковых"
* пакетов с определённой периодичностью.
* @param period частота передачи "маяковых" пакетов.
*/run Broadcasting(long period) {timer = new Timer(true);task = new TimerTask() {
@Overridevoid run() {
// Широковещательно передаётся команда PRSN(null, null, CMD_PRESENT);
}
};.schedule(task, 1000, period);
Для реализации защищённых пользовательских каналов методом асинхронного шифрования RSA, используются три метода: encode(), decode() и initKeys(), определённые в классах RSACipher и NetRoom.
Метод encode() шифрует предоставленные ему данные на основе переданного открытого ключа. Описание метода представлено ниже:
/**
* Метод шифрует переданные данные на основе открытого ключа.
* @param data данные для шифрования.
* @param publicKey открытый ключ.
* @return зашифрованное сообщение.
*/static String encode(String data, PublicKey publicKey) {res = null;{
// Создаётся экземпляр кодировщика на основании алгоритма RSA.enc = Cipher.getInstance(ALGORITHM);
// Инициализация кодировщика открытым ключом..init(Cipher.ENCRYPT_MODE, publicKey);
// Шифровка сообщения за один проход.
res = new String(enc.doFinal(data.getBytes()));
} catch (NoSuchAlgorithmException e) {.printStackTrace();
} catch (NoSuchPaddingException e) {.printStackTrace();
} catch (InvalidKeyException e) {.printStackTrace();
} catch (IllegalBlockSizeException e) {.printStackTrace();
} catch (BadPaddingException e) {.printStackTrace();
}res;
}
.6.2 Метод decode() расшифрует предоставленные ему данные на основе сохранённого закрытого ключа. Описание метода представлено ниже:
/**
* Метод расщифрует перданные данные на основе закрого ключа.
* @param data данные для расшифровки.
* @param privateKey закрытый ключ.
* @return расшифрованное сообщение.
*/static String decode(String data, PrivateKey privateKey) throws BadPaddingException {res = null;{
// Создаётся экземпляр кодировшика на основе алгоритма RSA.dec = Cipher.getInstance(ALGORITHM);
// Инициализация кодировщика закрытым ключом..init(Cipher.DECRYPT_MODE, privateKey);
// Расшифровка сообщения за один проход.
res = new String(dec.doFinal(data.getBytes()));
} catch (NoSuchAlgorithmException e) {.printStackTrace();
} catch (NoSuchPaddingException e) {.printStackTrace();
} catch (InvalidKeyException e) {.printStackTrace();
} catch (IllegalBlockSizeException e) {.printStackTrace();
}res;
}
Метод initKey() инициализирует пару ключей (открытый и закрытый), необходимую для шифровки и дешифровки сообщений. Описани метода представлено ниже:
/**
* Метод генерирует пару ключей, необходимую для
* дешифровки входящих сообщений.
private void initKeys() {
if(internalKeyPair == null) {generator;{= KeyPairGenerator.getInstance(RSACipher.ALGORITHM);.initialize(512);= generator.generateKeyPair();
} catch (NoSuchAlgorithmException e) {.printStackTrace();
}
}
}
5 Тестирование программы
Чтобы запустить программу, на компьютере должна быть установлена JVM (виртуальная машина Java) версии 1.6.
Для запуска чата из консоли нудно написать следующую команду: java -jar путь_к_файлу_.jar.
После это должно появиться главное окно программы (рис. 5.1).
Рисунок 5.1 - Главное окно программы
Для проверки всех сетевых функций нужно запустить ещё один клиент программы на другом компьютеры в той же сети. После этого посредством передачи специальных пакетов (PRSN и SYNC), оба клиента синхронизируются. Результирующее отображение показано на рисунке 5.2, полученные пакеты на первом клиенте показаны на рисунке 5.3.
Рисунок 5.2 - Главное окно после входа ещё одного пользователя
Рисунок 5.3 - Пол