Изучение методов разработки программного обеспечения для создания 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 - Пол