Анализ предметной области

Реферат



Курсовая работа содержит 37 страницы, 6 рисунков, 4 приложения, включая дампы экрана и схемы и код приложения. При разработке использовалось 10 источников.

Основным объектом исследования является проектирование java - приложения использующего набор стандартных библиотек (JDK security API). Для реализации шифровки, дешифровки файлов, а также для создания и проверки цифровой подписи. Данные библиотеки в настоящий момент широко используются в большинстве крупных и нуждающихся в защите приложений. Автор не выдвигает новых подходов к реализации алгоритмов шифрования и оформлению программы. Основной упор делается на стабильность и надежность работы программы. С точки зрения пользователя данная программа имеет учебный и коммерческий характер.

Ключевые слова: КРИПТОГРАФИЯ, АЛГОРИТМЫ, ЦИФРОВАЯ ПОДПИСЬ, ПУБЛИЧНЫЙ КЛЮЧ, JAVA, JDK SECURITY API








Содержание



Введение

1. Анализ предметной области

1.1 Описание задачи

2.Реализация проекта

2.1 Реализация цифровой подриси файлов

2.2 Реализация алгоритма DES для шифрования и расшифровки файла	

2.3 Запись ключей в класс с помощью сериализации

2.4 Стандартные диалоговые окна открытия и сохранения файла

3. Работа с приложением

3.1 Шифрование файла

3.2 Расшифровка закодированого файла

3.3 Создания цифровой подписи файла

3.4 Проверка цифровой подписи файла

Перечень ссылок

Приложение А

Приложение Б

Приложение В

Приложение Г








Введение

симметрический шифрование цифровой файл

По мере перехода от эпохи индустриальной цивилизации к преимущественно информационной роль накопленных и соответствующим образом обработанных знаний заметно возрастает. Появление же и стремительное развитие компьютерных сетей обеспечило эффективные способы передачи данных и быстрый доступ к информации как для отдельных людей, так и для больших организаций. Однако локальные и глобальные компьютерные сети, впрочем, как и другие способы передачи информации, могут представлять угрозу для безопасности данных, особенно при отсутствии адекватных мер их защиты от несанкционированного доступа.

Таким образом, сейчас, по мере становления информационного общества средства защиты становятся одними из основных инструментов. Они обеспечивают конфиденциальность, секретность, доверие, авторизацию, электронные платежи, корпоративную безопасность и бесчисленное множество других важных атрибутов современной жизни.

В связи с этим наличие встроенных механизмов защиты информации и эффективность их работы в прикладных системах все чаще приобретает определяющее значение при выборе потребителями оптимального решения. Поэтому данным вопросам уже давно уделяют внимание разработчики программных средств. Должный уровень защиты могут обеспечить криптографические методы.

Существует несколько подходов к решению поставленной задачи.

Во-первых, можно попытаться создать абсолютно надежный и недоступный другим канал связи. К сожалению, достичь этого крайне сложно, по крайней мере, на существующем уровне современного развития науки и техники, которые предоставляют методы и средства не только передачи информации, но и несанкционированного к ней доступа.

Вторым подходом является использование общедоступных каналов связи и скрытие самого факта передачи какой-либо информации. Данным направлением занимается наука стенография. К сожалению, методы стенографии не могут гарантировать высокий уровень конфиденциальности информации.

Третий способ — это использовать общедоступный канал связи, но передавать данные в преобразованном виде, так чтобы восстановить их мог лишь адресат. Разработкой методов преобразования информации, обеспечивающей ее шифрование, и занимается криптография.

Стоит отметить, что криптосистема работает по определенной методологии (процедуре).

Эта методология предусматривает использование:

 одного или более алгоритмов шифрования, которые можно выразить в виде математических формул;

 ключей, используемых данными алгоритмами шифрования,

 системы управления ключами,

 незашифрованного текста,

 зашифрованного текста (шифртекста).








1. Анализ предметной области



1.1 Описание задачи



В связи с явной сетевой направленностью языка Java потребовалось уделить должное внимание средствам защиты. В первую очередь это касается пересылки важных данных между, например, клиентом и сервером, а также запуска программ или апплетов. Такие средства были разработаны и встроены в набор стандартных библиотек (JDK security API).

Примером необходимости защиты может служить желание пользователя-получателя иметь возможность верификации, что дает определенные гарантии подлинности документа или кода.. В качестве подписываемого объекта могут выступать апплеты, которые широко распространены в Интернете. В результате у получателя появляется уверенность, что информация получена именно от ожидаемого отправителя, а не возможного злоумышленника, и не была изменена в процессе пересылки. Для обеспечения такого рода безопасности служат цифровые подписи и сертификаты.

Симметрическое шифрование - способ шифрования, в котором для (за)шифрования и расшифрования применяется один и тот же криптографический ключ.

В данной курсовой работе мы рассмотрим реализацию алгоритма симметрического шифрования в java на примере алгоритма DES. И создание, и проверку цифровой подписи алгоритмом DSA.








2.Реализация проекта



2.1 Реализация цифровой подриси файлов





Рисунок 2.1 – Схема действий при генерации подписи



Работа отправителя

Генерация ключей

Программист, не вникая в математические формулы и особенности их реализации, может использовать уже доступные готовые алгоритмы и методы криптографии. Они предоставляются определенными организациями, так называемыми провайдерами (provider). По умолчанию встроенные средства Java поставляет провайдер "SUN". Таким образом, единственное, что необходимо делать, это указывать собственно алгоритм и провайдера.

В первую очередь необходимо сгенерировать пару ключей - public key и private key. Для этого используется класс KeyPairGenerator. Для получения конкретного объекта этого класса необходимо вызвать static factory метод getInstance(). В качестве аргументов передаются строки с указанием алгоритма и провайдера. Например, для использования DSA (Digital Signature Algorithm) и провайдера SUN необходимо писать:

KeyPairGenerator keyGen = KeyPairGenerator.getInstance("DSA", "SUN");

В связи с тем, что большинство криптографических алгоритмов являются вероятностными, необходимо создать вероятностный источник — объект класса SecureRandom. При этом существует возможность использовать разные методы, например, SHA1PRNG (pseudo-random-number generation algorithm).

SecureRandom random = SecureRandom.getInstance("SHA1PRNG", "SUN");

Теперь необходимо проинициализировать объект keyGen, передав ему 2 параметра — длину в битах и источник случайности.

keyGen.initialize(1024, random);

Последним этапом является собственно генерация пары ключей (метод generateKeyPair()) и выделение двух отдельных ключей (методы getPrivate() и getPublic()).

KeyPair pair = keyGen.generateKeyPair();

PrivateKey privKey = pair.getPrivate();

PublicKey pubKey = pair.getPublic();

Создание подписи.

В первую очередь необходимо создать объект класса Signature, вызвав метод getInstance():

Signature dsa = Signature.getInstance("SHA1withDSA", "SUN");

В данном случае используется алгоритм DSA с SHA1 (хэш-функция). Затем идет процесс инициализации подписи ключом. На этом этапе используется закрытый ключ, полученный ранее:

dsa.initSign(privKey);

После этого необходимо свести подпись и сами данные. Для этого вызывается метод update(), получаемый в качестве параметра байтовый массив данных, которые должны быть подписаны.

На последнем этапе генерируется сама подпись, которая представляется в виде байтового массива.

byte[] realSig = dsa.sign();

Сохранение подписи.

После получения подписи и ключей необходимо сохранить их, например, в файл, и отправить адресату вместе с исходными данными. Следует подчеркнуть, что закрытый ключ не посылается, а остается у отправителя. Отсылается же открытый ключ.

Итак, отправитель посылает получателю, например, по электронной почте или через прямое сетевое соединение следующие файлы:

1. Открытый ключ (public key)

2. Цифровую подпись (digital signature)

3. Исходные данные (подписанный документ или код).





Рисунок 2.1 - Схема действий при верификации подписи



Работа с ключом: чтение из файла и преобразование в PrivateKey.

Получатель располагает последовательностью байт, представляющих открытый ключ. Необходимо получить байтовый массив (Byte[] encKey), например, прочитать эти данные из файла в массив, а затем преобразовать его в объект класса PublicKey.

Для этого можно воспользоваться классом KeyFactory, который по спецификации ключа может восстановить объект класса Key (PrivateKey и PublicKey являются потомками класса Key). Таким образом, необходимо получить так называемую спецификацию ключа. Ее можно получить, основываясь на том, какой стандарт использовался при генерации ключа. В данном случае ключ был сгенерирован с помощью провайдера "SUN", поэтому он удовлетворяет стандарту X.509.

Генерация спецификации ключа (необходим пакет java.security.spec.*):

X509EncodedKeySpec pubKeySpec = new X509EncodedKeySpec(encKey);

Создание объекта класса KeyFactory, соответствующего цифровой подписи и провайдеру "SUN".

KeyFactory keyFactory = KeyFactory.getInstance("DSA", "SUN");

Получение объекта класса PublicKey

PublicKey pubKey = keyFactory.generatePublic(pubKeySpec);

Работа с подписью: чтение из файла и Signature.

Подпись также необходимо перевести в байтовый массив (Byte[] sigToVerify). Затем необходимо создать объект типа Signature, также как это делалось ранее.

Signature sig = Signature.getInstance("SHA1withDSA", "SUN");

sig.initVerify(pubKey);

Во время чтения необходимо применять метод update() объекта sig, аналогично случаю создания подписи.

Проверка подлинности (верификация).

Завершающим этапом работы получателя является собственно получение ответа на вопрос о правдивости подписи и данных. С помощью метода verify() объекта класса Signature можно получить результатом boolean:

boolean verifies = sig.verify(sigToVerify);

Значение будет true, если данная подпись (sigToVerify) действительная подпись для данных, созданная с использованием открытого ключа (pubKey).

Следует отметить, что первый этап, связанный с работой отправителя, требует некоторого времени для генерации необходимых для отправки данных. Для компьютера класса Intel Pentium III с частотой 733 МГц время генерации составляет приблизительно 10 секунд. Кстати, время, затрачиваемое для верификации на порядок меньше.

Кроме рассмотренного DSA, предоставляются и многие другие средства криптографической защиты, как RSA, DES и другие. Их использование подобно представленному DSA.



2.2 Реализация алгоритма DES для шифрования и расшифровки файла



Симметрическое шифрование - способ шифрования, в котором для (за)шифрования и расшифрования применяется один и тот же криптографический ключ. Рассмотрим реализацию симметрического шифрования в java на примере алгоритма DES. В первую очередь нам понадобится класс javax.crypto.Cipher, который реализует базовые функции популярных криптографических алгоритмов шифрования. Для создания экземпляра такого класса используется статистический метод Cipher.getInstance , который в качестве параметра получает имя криптографического алгоритма шифрования. В нашем случае:

Cipher chr = Cipher.getInstance("DES");

Следующим шагом будет инициализация экземпляра класса и указание каком режиме он будет работать: в режиме шифрования chr.init(Cipher.ENCRYPT_MODE, key); - , или расщифрования –

chr.init(Cipher.DECRYPT_MODE, key);

Как видно, появился новый неизвесный параметр: key - это 56 битный ключ алгоритма DES. Данный параметр имеет тип javax.crypto.SecretKey и может быть создан с помощью класса:

javax.crypto.KeyGenerator. SecretKey key = KeyGenerator.getInstance("DES").generateKey();

Шифрование или расшифрование выполняет функция doFinal класса Cipher, которая на входе получает масив байт и возвращает также масив байт, но уже соответственно преобразованных. Что именно (шифрование или расшифрование) будет выполнять функция зависит от того что было указанно в первом параметре функции инициализации init(). Итак из всего выше сказанного можно скомпоновать небольшой класс. Класс по работе скриптографическим алгоритмом шифрования DES. К классу прилагается функция main, для того что-бы проверить правильность работы созданных функций.



2.3 Запись ключей в класс с помощью сериализации



Для того, чтобы объект был сериализуемым, класс этого объекта должен реализовывать интерфейс java.io.Serializable.

Интерфейс java.io.Serializable не содержит методов и является маркером, который говорит механизму сериализации о том, что объект, реализующий данный интерфейс, может быть сериализован.

Теперь, когда у нас уже есть класс, реализующий интерфейс java.io.Serializable, следующим шагом станет написание алгоритма, ответственного за сериализацию экземпляра класса SecretKey.



2.4 Стандартные диалоговые окна открытия и сохранения файла



Swing содержит готовое окно для выбора файла (полезное, например, для программирования пункта меню Файл --> Открыть). Объект класса JFileChooser создается простым конструктором без параметров, после чего может выводиться на экран методом showOpenDialog(). Этот метод возвращает результат действий пользователя по выбору файла, который сравнивается с одной из следующих констант:

APPROVE_OPTION — выбор файла прошел успешно. Теперь можно методом getFile() получить выбранный файл.

CANCEL_OPTION — пользователь отменил выбор файла, щелкнув на кнопке Cancel.

ERROR_OPTION — при выборе файла произошла ошибка, либо пользователь закрыл диалоговое окно крестиком.

Метод showSaveDialog() отображает то же самое окно, но теперь оно работает в режиме сохранения. Пользователь выбирает директорию для сохранения файла и может ввести его имя. Метод возвращает результат того же типа, что и showOpenDialog(). Если выбор пути для сохранения прошел успешно, вызов метода getFile() вернут путь, куда пользователь желает сохранить файл.

Следует иметь в виду, что сам класс JFileChooser ничего не открывает и не сохраняет. Он только возвращает путь к выбранному пользователем файлу. А открыть его или сохранить файл в заданном месте должна уже сама программа.

Метод setDialogTitle(String title) позволяет задать окну заголовок.








3. Работа с приложением



3.1 Шифрование файла



Для шифрования файла нажать на кнопку «Зкодировать файл» главного меню программы (Рис. 3.1), после чего откроется стандартное диалоговое окно для открытия файла (Рис. 3.2), в котором нужно выбрать файл для шифрования. После этого откроется стандартное диалоговое окно для сохранения файлов (Рис. 3.3), в котором необходимо выбрать место расположения и названия закодированного файла. Затем появляется еще одно диалоговое окно сохранения файла с требованьем указать ему адрес сохранения файла ключей. После чего в случае успешной шифровки файла по алгоритму DES выдается сообщение типа MessageBox с уведомлением о успешном кодировании файла(Рис 3.4).





Рисунок 3.1 – Главное окно программы





Рисунок 3.2 – Стандартное диалоговое окно для открытия файла








Рисунок 3.3 – Стандартное диалоговое окно для сохранения файла





Рисунок 3.4 – Стандартное окно сообщения



3.2 Расшифровка закодированого файла



Для расшифровки закодированного файла необходимо выбрать в главном окне программы (Рис 3.1) пункт меню «расшифровать файл». После чего указать: файл для расшифровки, адрес для сохранения декодированного файла, ключ шифрования. После чего в случае совпадения ключа происходит успешная расшифровка по указанному адресу и появляется сообщения с уведомлением об успешном завершении, или о несоответствии файла ключей.



3.3 Создания цифровой подписи файла



Для создания цифровой подписи файла необходимо в главном меню программы (Рис. 3.1) выбрать пункт меню «Подписать файл». После чего в стандартном диалоговом окне открытия файла указать путь к подписываемому файлу. После чего выводиться сообщение о успешном создании цифровой подписи и в директории с эти файлом создается файл с таким же именем и расширением .sig – это цифровая подпись и с расширением .pubkey – это публичный ключ для проверки цифровой подписи.



3.4 Проверка цифровой подписи файла



Для проверки цифровой подписи файла необходимо в главном меню программы (Рис. 3.1) выбрать пункт меню «Проверить цифровую подпись». После чего необходимо указать путь к проверяемому файлу, путь к файлу с цифровой подписью и файл с публичным ключом. В случае корректного указания всех файлов и неизменности проверяемого файла выдается сообщение, что верификация прошла успешно. Если хотя бы один бит в одном из этих файлов был модифицирован, выдается уведомление о несанкционированном доступе.








Перечень ссылок



1. “Введение в криптографию” / Под общ. ред. В.В.Ященко. — М.:МЦНМО, ”ЧеРо”, 1998. — 272c.

2. А.Никитин, “Универсальные криптографические интерфейсы”, Защита информации, Конфидент, N5, 1997.

3. М.Могран, “Java 2. Руководство разработчика”, Пер. с англ. : Уч. пос. — М.: “Вильямс”, 2000. — 720c. : ил.

4. Vipul Ved Prakash, Benjamin Trott, “Asymmetric Cryptography in Perl”, O'Reilly, 2001.

5. R.Coleridge, “The Cryptography API, or How to Keep a Secret”, MSDN, 1996.

6. D.Esposito, “Supporting CryptoAPI in Real-World Applications”, MSDN, 1997.

7. http://java.org

8. S.K.Parmar, “An introduction to security”, Fred Cohen &Associates, 2000.

9. R.L/Rivest, A.Shamir and L.Adleman, “A method for obtaining digital signatures and public key cryptosystems”. Commun. ACM, vol.21, p. 120-126, 1978.

10. W.Diffie and M.E.Hellman, “New directions in cryptograpgy”, IEEE Trans.Inf.Theory, vol.IT-22, N6, p.644-654, Nov. 1976.

11. A.Menezes, P.van Oorschot, S.Vanstone, “Handbook of applied cryptography”, CRC Press, 1996.








Приложение А



Код класса my_java_sec

public class my_java_sec {

@SuppressWarnings("deprecation")

public static void main(String[] args){

// TODO Auto-generated method stub

FInterfaceForm fif = new FInterfaceForm();

fif.show();

}



}








Приложение Б



Код класса coding_files

import java.io.FileInputStream;

import java.io.FileOutputStream;

import javax.crypto.Cipher;

import javax.crypto.KeyGenerator;

import javax.crypto.SecretKey;

public class CodingFiles {

Cipher ecipher;

Cipher dcipher;



public CodingFiles() {

// TODO Auto-generated constructor stub

}

public SecretKey initCoding()

{

try{

SecretKey key = KeyGenerator.getInstance("DES").generateKey();

ecipher = Cipher.getInstance("DES");

dcipher = Cipher.getInstance("DES");

ecipher.init(Cipher.ENCRYPT_MODE, key);

dcipher.init(Cipher.DECRYPT_MODE, key);

return key;

}

catch(Exception e)

{

}

return null;

}

public void iniCoding(SecretKey key)

{

try{

ecipher = Cipher.getInstance("DES");

dcipher = Cipher.getInstance("DES");

ecipher.init(Cipher.ENCRYPT_MODE, key);

dcipher.init(Cipher.DECRYPT_MODE, key);

}

catch(Exception e)

{

}

}

public boolean fileEncode(String sourse,String result)

{

try{

FileInputStream inFile = new FileInputStream(sourse);

int bytesAvailable = inFile.available();

byte[] bytesReaded = new byte[bytesAvailable];

inFile.read(bytesReaded,0,bytesAvailable);

inFile.close();

byte[] br_enc = ecipher.doFinal(bytesReaded);

FileOutputStream outFile = new FileOutputStream(result);

outFile.write(br_enc);

outFile.close();

return true;

}

catch(Exception e)

{}

return false;

}

public boolean fileDecode(String sourse,String result)

{

try{

FileInputStream enc_inFile = new FileInputStream(sourse);

int enc_bytesAvailable = enc_inFile.available();

byte[] enc_bytesReaded = new byte[enc_bytesAvailable];

enc_inFile.read(enc_bytesReaded,0,enc_bytesAvailable);

enc_inFile.close();

byte[] br_dec =dcipher.doFinal(enc_bytesReaded);

FileOutputStream dec_outFile = new FileOutputStream(result);

dec_outFile.write(br_dec);

dec_outFile.close();

return true;

}

catch(Exception e)

{}

return false;

}

}








Приложение В



Код класса DigitalSignature

import java.io.BufferedInputStream;

import java.io.FileInputStream;

import java.io.FileOutputStream;

import java.security.KeyFactory;

import java.security.KeyPair;

import java.security.KeyPairGenerator;

import java.security.PrivateKey;

import java.security.PublicKey;

import java.security.SecureRandom;

import java.security.Signature;

import java.security.spec.X509EncodedKeySpec;

public class DigitalSignature {

public static void saveToFile (byte[] info, String filename) {

try {

FileOutputStream fos = new FileOutputStream(filename);

fos.write(info);

fos.close();

}

catch (Exception e){}

}

public static byte[] readFromFile (String fileName) {

byte[] info;

try {

FileInputStream fis = new FileInputStream(fileName);

info = new byte[fis.available()];

fis.read(info);

fis.close();

}

catch (Exception e) {info = new byte[0];}

return(info);

}

public static boolean CreateDigitalSignatureForFile(String puth)

{

try

{

KeyPairGenerator keyGen = KeyPairGenerator.getInstance("DSA", "SUN");

SecureRandom random = SecureRandom.getInstance("SHA1PRNG", "SUN");

keyGen.initialize(1024, random);

KeyPair pair = keyGen.generateKeyPair();

PrivateKey priv = pair.getPrivate();

PublicKey pub = pair.getPublic();

Signature dsa = Signature.getInstance("SHA1withDSA", "SUN");

dsa.initSign(priv);

FileInputStream fis = new FileInputStream(puth);

BufferedInputStream bufin = new BufferedInputStream(fis);

byte[] buffer = new byte[1024];

int len;

while (bufin.available() != 0)

{

len = bufin.read(buffer);

dsa.update(buffer, 0, len);

}

bufin.close();

byte[] realSig = dsa.sign();

saveToFile (realSig,puth+".sig");

byte[] key = pub.getEncoded();

saveToFile (key,puth+".pubkey");

//byte[] priv_key = priv.getEncoded();

//saveToFile (priv_key,"privkey_"+puth);

return true;

}

catch (Exception e){}

return false;

}

public static boolean TestedByDigitalSignature(String puth, String sign_puth, String pubkey_puth){

try{

byte[] encKey = readFromFile(pubkey_puth);

X509EncodedKeySpec pubKeySpec = new X509EncodedKeySpec(encKey);

KeyFactory keyFactory = KeyFactory.getInstance("DSA", "SUN");

PublicKey pubKey = keyFactory.generatePublic(pubKeySpec);

byte[] sigToVerify = readFromFile(sign_puth);

Signature sig = Signature.getInstance("SHA1withDSA", "SUN");

sig.initVerify(pubKey);

FileInputStream datafis = new FileInputStream(puth);

BufferedInputStream bufin = new BufferedInputStream(datafis);

byte[] buffer = new byte[1024];

int len;

while (bufin.available() != 0)

{

len = bufin.read(buffer);

sig.update(buffer, 0, len);

}

bufin.close();

boolean verifies = sig.verify(sigToVerify);

return verifies;

}

catch(Exception e){}

return false;

}

}








Приложение Г



Код класса FInterfaceForm

import java.awt.Button;

import java.awt.Event;

import java.io.FileInputStream;

import java.io.FileOutputStream;

import java.io.ObjectInputStream;

import java.io.ObjectOutputStream;

import javax.crypto.SecretKey;

import javax.swing.JButton;

import javax.swing.JFileChooser;

import javax.swing.JFrame;

import javax.swing.JOptionPane;

public class FInterfaceForm extends JFrame{

/**

*

*/

private static final long serialVersionUID = 1L;

Button bt_enc = new Button("Закодировать файл");

Button bt_dec = new Button("Расшифровать файл");

Button bt_dsig = new Button("Подписать файл");

Button bt_testdsig = new Button("Проверить цифровую подпись");

public FInterfaceForm() {

// TODO Auto-generated constructor stub

this.setLayout(null);

this.setBounds(200, 200, 420, 90);

this.setTitle("Java sercurity");

bt_enc.setBounds(0, 0, 200, 25);

bt_dec.setBounds(200, 0, 200, 25);

bt_dsig.setBounds(0, 25, 200, 25);

bt_testdsig.setBounds(200, 25, 200, 25);

this.add(bt_enc);

this.add(bt_dec);

this.add(bt_dsig);

this.add(bt_testdsig);

}

@SuppressWarnings("deprecation")

@Override

public boolean action(Event evt, Object arg1) {

// TODO Auto-generated method stub

if(evt.target instanceof Button)

{

if(evt.target.equals(bt_enc))

{

try{

JFileChooser jfc = new JFileChooser();

jfc.setDialogTitle("Выберите файл для кодирования");

if( jfc.showOpenDialog(this) == JFileChooser.APPROVE_OPTION) {

JFileChooser jfc_s = new JFileChooser();

jfc_s.setDialogTitle("Как сохранить файл?");

if( jfc_s.showSaveDialog(this) == JFileChooser.APPROVE_OPTION) {

JFileChooser jfc_s_key = new JFileChooser();

jfc_s_key.setDialogTitle("Как сохранить ключ?");

if( jfc_s_key.showSaveDialog(this) == JFileChooser.APPROVE_OPTION) {

CodingFiles cf = new CodingFiles();

SecretKey sk = cf.initCoding();

FileOutputStream fos = new FileOutputStream((jfc_s_key.getSelectedFile()).getAbsolutePath());

ObjectOutputStream oos = new ObjectOutputStream(fos);

oos.writeObject(sk);

oos.flush();

oos.close();

if(cf.fileEncode((jfc.getSelectedFile()).getAbsolutePath(), (jfc_s.getSelectedFile()).getAbsolutePath()))

JOptionPane.showMessageDialog(new JButton("Ok"), "Файл закодирован успешно!","Поздравляем!", JOptionPane.WARNING_MESSAGE);

else

JOptionPane.showMessageDialog(new JButton("Ok"), "Произошла ошибка при кодировании файла!","Что-то не так!", JOptionPane.WARNING_MESSAGE);

}

}

}

}catch(Exception e){}

}

if(evt.target.equals(bt_dec))

{

try{

JFileChooser jfc = new JFileChooser();

jfc.setDialogTitle("Выберите файл для расшифровки.");

if( jfc.showOpenDialog(this) == JFileChooser.APPROVE_OPTION) {

JFileChooser jfc_o = new JFileChooser();

jfc_o.setDialogTitle("Выбирете ключ для расшифровки этого файла.");

if( jfc_o.showOpenDialog(this) == JFileChooser.APPROVE_OPTION) {

JFileChooser jfc_s = new JFileChooser();

jfc_s.setDialogTitle("Как сохранить расшифрованый файл?");

if( jfc_s.showSaveDialog(this) == JFileChooser.APPROVE_OPTION) {

CodingFiles cf = new CodingFiles();

FileInputStream fis = new FileInputStream((jfc_o.getSelectedFile()).getAbsolutePath());

ObjectInputStream oin = new ObjectInputStream(fis);

SecretKey ts = (SecretKey) oin.readObject();

cf.iniCoding(ts);

if(cf.fileDecode((jfc.getSelectedFile()).getAbsolutePath(), (jfc_s.getSelectedFile()).getAbsolutePath()))

{

JOptionPane.showMessageDialog(new JButton("Ok"), "Файл расшифрован успешно!","Поздравляем!", JOptionPane.WARNING_MESSAGE);

}

else

{

JOptionPane.showMessageDialog(new JButton("Ok"), "Файл не расшифрован! Возможно не подходящий ключ.","Что-то нето!", JOptionPane.WARNING_MESSAGE);

}

oin.close();

}

}

}

}catch(Exception e){}

}

if(evt.target.equals(bt_dsig))

{

try{

JFileChooser jfc = new JFileChooser();

jfc.setDialogTitle("Выберите файл для подписи.");

if( jfc.showOpenDialog(this) == JFileChooser.APPROVE_OPTION) {

if(DigitalSignature.CreateDigitalSignatureForFile((jfc.getSelectedFile()).getAbsolutePath()))

JOptionPane.showMessageDialog(new JButton("Ok"), "Файл подписан успешно! Вы можите найти файл с цифровой подписью и открытый ключ в каталоге с файлом.","Поздравляем!", JOptionPane.WARNING_MESSAGE);

else

JOptionPane.showMessageDialog(new JButton("Ok"), "Возник какойто эксепшен","Что-то пошло не так.!", JOptionPane.WARNING_MESSAGE);

}

}catch(Exception e){}

}

if(evt.target.equals(bt_testdsig))

{

try{

JFileChooser jfc = new JFileChooser();

jfc.setDialogTitle("Выберите файл для проверки подписи.");

if( jfc.showOpenDialog(this) == JFileChooser.APPROVE_OPTION) {

JFileChooser jfc_dg = new JFileChooser();

jfc_dg.setDialogTitle("Выберите файл с цифровой подписью.");

if( jfc_dg.showOpenDialog(this) == JFileChooser.APPROVE_OPTION) {

JFileChooser jfc_key = new JFileChooser();

jfc_key.setDialogTitle("Выберите файл с открытым ключем.");

if( jfc_key.showOpenDialog(this) == JFileChooser.APPROVE_OPTION) {

if(DigitalSignature.TestedByDigitalSignature((jfc.getSelectedFile()).getAbsolutePath(), (jfc_dg.getSelectedFile()).getAbsolutePath(), (jfc_key.getSelectedFile()).getAbsolutePath()))

JOptionPane.showMessageDialog(new JButton("Ok"), "Этот файл полностью соответствует этой цифровой подписи.","Поздравляем!", JOptionPane.WARNING_MESSAGE);

else

JOptionPane.showMessageDialog(new JButton("Ok"), "Этот файл либо небыл подписан этой подписью либо несанкционировано исправлен","Danger!!!", JOptionPane.WARNING_MESSAGE);

}

}

}

}catch(Exception e){}

}

}

return super.action(evt, arg1);

}

}