Реализация алгоритма симметрического шифрования в java на примере алгоритма DES

  • Вид работы:
    Дипломная (ВКР)
  • Предмет:
    Информационное обеспечение, программирование
  • Язык:
    Русский
    ,
    Формат файла:
    MS Word
    391,17 kb
  • Опубликовано:
    2011-06-14
Вы можете узнать стоимость помощи в написании студенческой работы.
Помощь в написании работы, которую точно примут!

Реализация алгоритма симметрического шифрования в java на примере алгоритма DES

Реферат

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

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

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

Содержание

Введение

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

.1 Описание задачи

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

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

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

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

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

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

.1 Шифрование файла

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

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

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

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

Приложение А

Приложение Б

Приложение В

Приложение Г

Введение

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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


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

.1 Описание задачи

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

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

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

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


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 параметра - длину в битах и источник случайности..initialize(1024, random);

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

KeyPair pair = keyGen.generateKeyPair();privKey = pair.getPrivate();pubKey = pair.getPublic();

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

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

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

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

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

На последнем этапе генерируется сама подпись, которая представляется в виде байтового массива.[] realSig = dsa.sign();

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

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

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

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

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


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

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

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

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

Генерация спецификации ключа (необходим пакет java.security.spec.* <#"529668.files/image004.gif">

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

. http://java.org

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

. 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.

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

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


Приложение А

Код класса my_java_sec

public class my_java_sec {

@SuppressWarnings("deprecation")static void main(String[] args){

// TODO Auto-generated method stubfif = new FInterfaceForm();.show();

}

}

Приложение Б

Код класса coding_filesjava.io.FileInputStream;java.io.FileOutputStream;javax.crypto.Cipher;javax.crypto.KeyGenerator;javax.crypto.SecretKey;class CodingFiles {ecipher;

Cipher dcipher;

CodingFiles() {

// TODO Auto-generated constructor stub

}SecretKey initCoding()

{{key = KeyGenerator.getInstance("DES").generateKey();= Cipher.getInstance("DES");= Cipher.getInstance("DES");.init(Cipher.ENCRYPT_MODE, key);.init(Cipher.DECRYPT_MODE, key);key;

}(Exception e)

{

}null;

}void iniCoding(SecretKey key)

{{= Cipher.getInstance("DES");= Cipher.getInstance("DES");.init(Cipher.ENCRYPT_MODE, key);.init(Cipher.DECRYPT_MODE, key);

}(Exception e)

{

}

}boolean fileEncode(String sourse,String result)

{{inFile = new FileInputStream(sourse);bytesAvailable = inFile.available();[] bytesReaded = new byte[bytesAvailable];.read(bytesReaded,0,bytesAvailable);.close();[] br_enc = ecipher.doFinal(bytesReaded);outFile = new FileOutputStream(result);.write(br_enc);.close();true;

}(Exception e)

{}false;

}boolean fileDecode(String sourse,String result)

{{enc_inFile = new FileInputStream(sourse);enc_bytesAvailable = enc_inFile.available();[] enc_bytesReaded = new byte[enc_bytesAvailable];_inFile.read(enc_bytesReaded,0,enc_bytesAvailable);_inFile.close();[] br_dec =dcipher.doFinal(enc_bytesReaded);dec_outFile = new FileOutputStream(result);_outFile.write(br_dec);_outFile.close();true;

}(Exception e)

{}false;

}

}

Приложение В

Код класса DigitalSignaturejava.io.BufferedInputStream;java.io.FileInputStream;java.io.FileOutputStream;java.security.KeyFactory;java.security.KeyPair;java.security.KeyPairGenerator;java.security.PrivateKey;java.security.PublicKey;java.security.SecureRandom;java.security.Signature;java.security.spec.X509EncodedKeySpec;class DigitalSignature {static void saveToFile (byte[] info, String filename) {{fos = new FileOutputStream(filename);.write(info);.close();

}(Exception e){}

}static byte[] readFromFile (String fileName) {[] info;{fis = new FileInputStream(fileName);= new byte[fis.available()];.read(info);.close();

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

}static boolean CreateDigitalSignatureForFile(String puth)

{

{= bufin.read(buffer);.update(buffer, 0, len);

}.close();[] realSig = dsa.sign();(realSig,puth+".sig");[] key = pub.getEncoded();(key,puth+".pubkey");

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

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

}(Exception e){}false;

}static boolean TestedByDigitalSignature(String puth, String sign_puth, String pubkey_puth){{[] encKey = readFromFile(pubkey_puth);EncodedKeySpec pubKeySpec = new X509EncodedKeySpec(encKey);keyFactory = KeyFactory.getInstance("DSA", "SUN");pubKey = keyFactory.generatePublic(pubKeySpec);[] sigToVerify = readFromFile(sign_puth);sig = Signature.getInstance("SHA1withDSA", "SUN");.initVerify(pubKey);datafis = new FileInputStream(puth);bufin = new BufferedInputStream(datafis);[] buffer = new byte[1024];len;(bufin.available() != 0)

{= bufin.read(buffer);.update(buffer, 0, len);

}.close();verifies = sig.verify(sigToVerify);verifies;

}(Exception e){}false;

}

}

Приложение Г

Код класса FInterfaceFormjava.awt.Button;java.awt.Event;java.io.FileInputStream;java.io.FileOutputStream;java.io.ObjectInputStream;java.io.ObjectOutputStream;javax.crypto.SecretKey;javax.swing.JButton;javax.swing.JFileChooser;javax.swing.JFrame;javax.swing.JOptionPane;class FInterfaceForm extends JFrame{

/**

*

*/static final long serialVersionUID = 1L;bt_enc = new Button("Закодировать файл");bt_dec = new Button("Расшифровать файл");bt_dsig = new Button("Подписать файл");bt_testdsig = new Button("Проверить цифровую подпись");FInterfaceForm() {

// TODO Auto-generated constructor stub.setLayout(null);.setBounds(200, 200, 420, 90);.setTitle("Java sercurity");_enc.setBounds(0, 0, 200, 25);_dec.setBounds(200, 0, 200, 25);_dsig.setBounds(0, 25, 200, 25);_testdsig.setBounds(200, 25, 200, 25);.add(bt_enc);.add(bt_dec);.add(bt_dsig);.add(bt_testdsig);

}

@SuppressWarnings("deprecation")

@Overrideboolean action(Event evt, Object arg1) {

// TODO Auto-generated method stub(evt.target instanceof Button)

{(evt.target.equals(bt_enc))

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

if( jfc.showOpenDialog(this) == JFileChooser.APPROVE_OPTION) {jfc_s = new JFileChooser();_s.setDialogTitle("Как сохранить файл?");

if( jfc_s.showSaveDialog(this) == JFileChooser.APPROVE_OPTION) {jfc_s_key = new JFileChooser();_s_key.setDialogTitle("Как сохранить ключ?");

if( jfc_s_key.showSaveDialog(this) == JFileChooser.APPROVE_OPTION) {cf = new CodingFiles();sk = cf.initCoding();fos = new FileOutputStream((jfc_s_key.getSelectedFile()).getAbsolutePath());oos = new ObjectOutputStream(fos);.writeObject(sk);.flush();.close();(cf.fileEncode((jfc.getSelectedFile()).getAbsolutePath(), (jfc_s.getSelectedFile()).getAbsolutePath())).showMessageDialog(new JButton("Ok"), "Файл закодирован успешно!","Поздравляем!", JOptionPane.WARNING_MESSAGE);.showMessageDialog(new JButton("Ok"), "Произошла ошибка при кодировании файла!","Что-то не так!", JOptionPane.WARNING_MESSAGE);

}

}

}

}catch(Exception e){}

}(evt.target.equals(bt_dec))

{{jfc = new JFileChooser();.setDialogTitle("Выберите файл для расшифровки.");( jfc.showOpenDialog(this) == JFileChooser.APPROVE_OPTION) {jfc_o = new JFileChooser();_o.setDialogTitle("Выбирете ключ для расшифровки этого файла.");

if( jfc_o.showOpenDialog(this) == JFileChooser.APPROVE_OPTION) {jfc_s = new JFileChooser();_s.setDialogTitle("Как сохранить расшифрованый файл?");

if( jfc_s.showSaveDialog(this) == JFileChooser.APPROVE_OPTION) {cf = new CodingFiles();fis = new FileInputStream((jfc_o.getSelectedFile()).getAbsolutePath());oin = new ObjectInputStream(fis);ts = (SecretKey) oin.readObject();.iniCoding(ts);(cf.fileDecode((jfc.getSelectedFile()).getAbsolutePath(), (jfc_s.getSelectedFile()).getAbsolutePath()))

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

}

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

}.close();

}

}

}

}catch(Exception e){}

}(evt.target.equals(bt_dsig))

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

if( jfc.showOpenDialog(this) == JFileChooser.APPROVE_OPTION) {(DigitalSignature.CreateDigitalSignatureForFile((jfc.getSelectedFile()).getAbsolutePath())).showMessageDialog(new JButton("Ok"), "Файл подписан успешно! Вы можите найти файл с цифровой подписью и открытый ключ в каталоге с файлом.","Поздравляем!", JOptionPane.WARNING_MESSAGE);

else

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

}

}catch(Exception e){}

}(evt.target.equals(bt_testdsig))

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

if( jfc.showOpenDialog(this) == JFileChooser.APPROVE_OPTION) {jfc_dg = new JFileChooser();_dg.setDialogTitle("Выберите файл с цифровой подписью.");

if( jfc_dg.showOpenDialog(this) == JFileChooser.APPROVE_OPTION) {jfc_key = new JFileChooser();_key.setDialogTitle("Выберите файл с открытым ключем.");( jfc_key.showOpenDialog(this) == JFileChooser.APPROVE_OPTION) {(DigitalSignature.TestedByDigitalSignature((jfc.getSelectedFile()).getAbsolutePath(), (jfc_dg.getSelectedFile()).getAbsolutePath(), (jfc_key.getSelectedFile()).getAbsolutePath())).showMessageDialog(new JButton("Ok"), "Этот файл полностью соответствует этой цифровой подписи.","Поздравляем!", JOptionPane.WARNING_MESSAGE);.showMessageDialog(new JButton("Ok"), "Этот файл либо небыл подписан этой подписью либо несанкционировано исправлен","Danger!!!", JOptionPane.WARNING_MESSAGE);

}

}

}

}catch(Exception e){}

}

}super.action(evt, arg1);

}

}

Похожие работы на - Реализация алгоритма симметрического шифрования в java на примере алгоритма DES

 

Не нашли материал для своей работы?
Поможем написать уникальную работу
Без плагиата!