String dateMessage ="Дата и время: " + c.get(Calendar.DAY_OF_MONTH) + "/" +
(c.get(Calendar.MONTH)+1) + " – " + c.get(Calendar.YEAR) +
" " + c.get(Calendar.HOUR_OF_DAY) + ":" +
c.get(Calendar.MINUTE);
// После записи в String-переменную dateMessage информации о дате –
// вызывается метод writeLogMessage
writeLogMessage(dateMessage);
writeLogMessage("Инициализация апплета завершена");
}
/*--------------INIT--------------*/
}
// Вывод сообщения в буферизированный поток для записи в файл
privatevoidwriteLogMessage(Stringmessage)
{
// Запись в файл осуществляется вызовом метода write объек-та out типа BufferedWriter
try
{
out.write(message);
out.newLine();
}
catch(IOException ex)
{
fileText.setText("Ошибка записи в файл:" + ls);
fileText.append(ex.toString() + ls);
}
}
// Запускпотоков
public void run()
{
// Пока флаг остановки анимации равен false – происходит анимация
while (!stopFlag)
{
try
{
if(animFlag==0)
{
if(posFlag==0) // Начальное движение вправо по верхней грани
{
p6.repaint(); // Перерисовка
// Временное (на 40 мс) остановка потока для создания эффекта анимации
// Далее идут аналогичные изменения координат/
Thread.currentThread().sleep(40);
rectX+=5;
if(rectX>p6.getSize().width-50)
{
rectX-=7;
posFlag =1;
if(posFlag==1)
{
rColor = (int)(255*Math.random());
gColor = (int)(255*Math.random());
bColor = (int)(255*Math.random());
col = new Color(rColor,gColor,bColor);
p6.repaint();
}
}
}
if(posFlag==1) // Движение вниз по правой грани
{
p6.repaint();
Thread.currentThread().sleep(40); // приостановить поток
rectY+=5;
if(rectY>p6.getSize().height – 50)
{
rectY=p6.getSize().height-53;
posFlag=2;
if(posFlag==2)
{
rColor = (int)(255*Math.random());
gColor = (int)(255*Math.random());
bColor = (int)(255*Math.random());
col = new Color(rColor,gColor,bColor);
p6.repaint();
}
}
}
if(posFlag==2) // Движение влево по нижней грани
{
if(rectX>0)
{
p6.repaint();
Thread.currentThread().sleep(40);
rectX-=5;
}
else
{
rectX=0;
posFlag=3;
if(posFlag==3)
{
rColor = (int)(255*Math.random());
gColor = (int)(255*Math.random());
bColor = (int)(255*Math.random());
col = new Color(rColor,gColor,bColor);
p6.repaint();
}
}
}
if(posFlag==3) // Движение вверх по левой грани
{
if(rectY>0)
{
p6.repaint();
Thread.currentThread().sleep(40);
rectY-=5;
if(rectY<0)
{
rectX=0;
rectY=0;
p6.repaint();
{
if(rectX==0 && rectY==0)
{
posFlag=0;
if(posFlag==0)
{
rColor = (int)(255*Math.random());
gColor = (int)(255*Math.random());
bColor = (int)(255*Math.random());
col = new Color(rColor,gColor,bColor);
p6.repaint();
}
}
}
}
}
}
}
if(animFlag==1)
{
if(movFlag==0) // Движение по диагонали сверху в нижний угол
{
p7.repaint();
Thread.currentThread().sleep(50);
ovalX+=5;
ovalY+=5;
if(ovalX>p7.getSize().width-50)
{
ovalX = p7.getSize().width -50;
ovalY = p7.getSize().height-52;
movFlag =1;
if(movFlag==1)
{
rColor = (int)(255*Math.random());
gColor = (int)(255*Math.random());
bColor = (int)(255*Math.random());
col = new Color(rColor,gColor,bColor);
p7.repaint();
}
}
}
if(movFlag==1) // Движение по нижней грани
{
p7.repaint();
Thread.currentThread().sleep(50);
ovalX-=5;
if(ovalX<0)
{
ovalX=0;
movFlag=2;
if(movFlag==2)
{
rColor = (int)(255*Math.random());
gColor = (int)(255*Math.random());
bColor = (int)(255*Math.random());
col = new Color(rColor,gColor,bColor);
p7.repaint();
}
}
}
if(movFlag==2) // Движение по диагонали снизу вверх
{
p7.repaint();
Thread.currentThread().sleep(50);
ovalX+=5;
ovalY-=5;
if(ovalX>p7.getSize().width-50)
{
ovalX = p10.getSize().width – 52;
ovalY = 0;
movFlag=3;
if(movFlag==3)
{
rColor = (int)(255*Math.random());
gColor = (int)(255*Math.random());
bColor = (int)(255*Math.random());
col = new Color(rColor,gColor,bColor);
p7.repaint();
}
}
}
if(movFlag==3) // Движение по верхней грани в обратном направлении
{
p7.repaint();
Thread.currentThread().sleep(50);
ovalX-=5;
if(ovalX<0)
{
ovalX = 0;
movFlag=0;
if(movFlag==0)
{
rColor = (int)(255*Math.random());
gColor = (int)(255*Math.random());
bColor = (int)(255*Math.random());
col = new Color(rColor,gColor,bColor);
p7.repaint();
}
}
}
}
}
catch (InterruptedException e)
{
return; // Завершить поток
}
}
}
//Реализация блоков прослушивания от кнопок
publicvoidactionPerformed(ActionEvente)
{
String ac = e.getActionCommand();
if(ac.equals("Квадрат"))
{
animFlag=0;
cardLO.show(cards,"sqaure");
writeLogMessage("Рисуется Квадрат");
}
if(ac.equals("Круг"))
{
animFlag=1;
cardLO.show(cards,"oval");
writeLogMessage("Рисуется Круг");
}
if(ac.equals("Треугольник"))
{
cardLO.show(cards,"rect");
}
if(ac.equals("Строка"))
{
cardLO.show(cards,"text");
}
else if("Запуск".equals(ac))
{
t = new Thread(this);
stopFlag = false;
t.start();
start.setEnabled(false);
writeLogMessage("Поток запущен");
}
else if("Остановка".equals(ac))
{
stopFlag=true;
t = null;
start.setEnabled(true);
writeLogMessage("Поток остановлен");
}
if("Чтение файла-журнала".equals(ac))
{
try
{
// Сброс данных из буфера потока (запись в файл)
out.flush();
// Далее происходит чтение из файла и заполнение текстовой области
// данными, содержащимися в текстовом файле Lab4Log.txt
// Создание буферизированного символьного потока чтения из файла*/
BufferedReader in = new BufferedReader(new FileReader(fileName));
String s = "", line;
while ((line = in.readLine()) != null)
s += line + "\n";
fileText.setText(s);
in.close();
}
catch(IOException ex)
{
fileText.setText("Ошибка чтения файла: " + ls);
fileText.append(ex.toString());
}
}
}
// Реализация блока прослушивания от списка Listи переключателей(CheckBox)
public void itemStateChanged(ItemEvent ie)
{
if(ie.getSource() == list)
{
String s = list.getSelectedItem();
if(s.equals("Чёрный"))
{
col = Color.black;
}
if(s.equals("Синий"))
{
col = Color.blue;
}
if(s.equals("Красный"))
{
col = Color.red;
}
if(s.equals("Зелёный"))
{
col = Color.green;
}
if(s.equals("Жёлтый"))
{
col = Color.yellow;
}
if(s.equals("Оранжевый"))
{
col = Color.orange;
}
if(s.equals("Розовый"))
{
col = Color.pink;
}
if(s.equals("Фиолетовый"))
{
col = Color.magenta;
}
if(s.equals("Тёмно-серый"))
{
col = Color.darkGray;
}
p6.repaint();
p7.repaint();
p8.repaint();
p9.repaint();
}
}
// Обработка события от CheckBox(Определение доступности панелей и их компонентов)
if(ie.getSource() == cb1)
{
p1.setEnabled(true);p4.setEnabled(true);
p7.setEnabled(true);
cards.setEnabled(true);
}
if(ie.getSource() == cb2)
{
p1.setEnabled(true);p4.setEnabled(true);
p7.setEnabled(false);
cards.setEnabled(false);
}
if(ie.getSource() == cb3)
{
p1.setEnabled(true);p4.setEnabled(false);
p7.setEnabled(true);
cards.setEnabled(false);
}
if(ie.getSource() == cb4)
{
p1.setEnabled(true);p4.setEnabled(false);
p7.setEnabled(false);
cards.setEnabled(true);
}
}
}
2. Создание подписанного апплета
2.1 Создание архивного JAR-файла
Для подписания апплета электронной цифровой подписью его упаковывают в архивный JAR-файл. В данной курсовой работе для этой цели используется утилита jar, либо можно использовать интегрированную среду разработки приложений.
Для создания архива применилась команда следующего вида:
jar cfv Lab4.jar Lab4*.class,
где: jar – название утилиты, которая упаковывает файлы и создаёт архив
cfv – это набор из трёх параметров:
· с – указывает на то,что создаётся новый архив
· f – первый элемент в списке файлов – имя архива, который должен быть создан
· v – вывод на консоль сообщений о всех действиях утилиты jar
Lab4.jar– название нового архива
Lab4*.class– параметр указывает, что все файлы классов расположенные в текущем каталоге, размещаются в архивеLab4.jar
При этом утилита jar создаёт каталогMETA-INFс файлом описания архиваMANIFEST.MF
Также в HTML файле, используемом для запуска апплета были внесены изменения, а именно добавлен атрибут ARCHIVE элемента Applet. Значение атрибута ARCHIVE = Lab4.JAR.
2.2 Создание пары ключей и сертификата в хранилище ключей
Далее с помощью утилиты keytool создаётся пара ключей («открытый/закрытый») и сертификат по стандарту X.509 для псевдонима «Taraninkey» в хранилище ключейTaraninstore в текущем каталоге.
Для создания самоподписанного сертификата применилась команда:
keytool -genkey -alias «Taraninkey» -keystore Taraninstore,
где:
-genkey – параметр указывающий, что утилита keytool должна сгенерировать ключи
-alias «Taraninkey» – псевдоним, под которым в хранилище ключей размещается сертификат
-keystoreTaraninstore – название хранилища ключей
Также по требованиям утилиты, был введён пароль защиты хранилища ключей, информация о владельце сертификата и пароль защиты закрытого ключа.
В данном курсовом проекте пароль закрытого ключа «Taraninkey» – 123369, а пароль хранилища ключей «Taraninstore» – 123.
При создании ключей и подписании сертификата были использованы алгоритмы:
· Алгоритм ключа RSA
· Алгоритм подписи MD-5
2.3 Подписывание JAR-файла цифровой подписью
Архивный JAR-файл подписывается с помощью утилиты jarsigner. используя следующую команду:
jarsigner -keystoreTaraninstoreLab4.jar«Taraninkey»
Утилита требует ввести пароль хранилища ключей и пароль закрытого ключа после чего модифицирует файл описания архива MANIFEST.MF в каталоге META-INF архива.
В него добавляются записи для каждого файла класса, входящего в архив. Запись файла класса включает имя и дайджест файла.
Также в каталог META-INF архива добавляется файл подписиTARNINK.SF.
Содержимое файла подписи TARNINK.SF.
Файл подписи идентифицирует каждый из файлов в архиве, алгоритм дайджестасодержит для каждого файла значение дайджеста, вычисленного из записи файла в файле описания MANIFEST.MF.
На заключительном этапе подписания в каталог META-INF файла архива добавляется двоичный файл подписиTARANINK.RSA. Расширение файла подписи указывает, что утилита keytool использует алгоритм цифровой подписиRSA. Этот файл содержит подпись файла подписиTARNINK.SF и сертификат, заверяющий подлинность открытого ключа, соответствующего закрытому ключу, использованному при создании подписи.
2.4 Задание политики безопасности для подписанного апплета