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

Фриланс
Новости
Статьи
   
Рубрики:


Криптография в JAVA

Поиск:
Спасибо Domestic Cat за предоставленную информацию

JCE (Java Cryptography Extentions) позволяет работать с энкрипшн, генерировать ключи, генерировать MAC. Он поддерживает симметричные, асимметричные блок- и стрим шифры.
Я начну с самого простого: энкрипшн - декрипшн.
Существует множество алгоритмов шифрования. Поддерживаемые алгоритмы можно узнать из документации к пакету javax.crypto.spec, он включает в себя RC2, RC5, Blowfish, DES, Triple DESede, AES Rijndael.
Для примера мы возьмем алгоритм Triple DESede, который был (не знаю, является ли сейчас) одобрен для использования в правительстве US. Он основан на стандарте DES (Digital Encryption Standard), 64-битном шифре, реально использующем 56 битов. Troiple DESede означает тройной DES (encryption-decryption-encryption), суть которого в том, что информация шифруется с одним ключом, дешифруестя с другим, и вновь шифруется с третьим. Также, как и DES, ломается брут-форсом.
Мы начнем с генерации ключа и записи шифрованного сообщения в файл.
Код

import java.io.*;
import javax.crypto.*;
import javax.crypto.spec.*;

public class Encryptor
{  
   public static void main(String [] args)
   {  
       FileOutputStream fos = null;
       String secret = "This is SECRET!!!";
       try
       {
           String keyfile = "key.key";
           String algorithm = "DESede";

Файл keyfile будет содержать ключ.
Следующая задача - сгенерировать этот самый ключ. Для этого нужно получить
инстанс класса KeyGenerator для данного алгоритма:
Код

           KeyGenerator kg = KeyGenerator.getInstance(algorithm);
           SecretKey key = kg.generateKey();

Имея ключ, мы создаем объект Cipher для шифрования сообщения (ENCRYPT_MODE):
Код

           Cipher cipher = Cipher.getInstance(algorithm);
           cipher.init(Cipher.ENCRYPT_MODE, key);


Теперь можно создать шифрованный стрим и обернуть его во что хотим, в данном случае - в ObjectOutputStream:
Код

           ObjectOutputStream oos = new ObjectOutputStream(new CipherOutputStream(new FileOutputStream("Secret.file"), cipher));
           oos.writeObject(secret);

Код

           fos = new FileOutputStream(keyfile);
           SecretKeyFactory skf = SecretKeyFactory.getInstance(algorithm);
           DESedeKeySpec keyspec = (DESedeKeySpec) skf.getKeySpec(key, DESedeKeySpec.class);
           fos.write(keyspec.getKey());
           fos.close();
           oos.close();
       }
       catch (Exception e)
       {
           e.printStackTrace();
       }
   }
}


Чтобы прочесть шифрованный файл, необходимо выполнить обратные операции: считать ключ из файла, создать объект Cipher для дешифровки (DECRYPT_MODE) и прочитать объект:
Код

class Decryptor
{  
   public static void main(String [] args)
   {  
       FileInputStream fis = null;
       try
       {
           String keyfile = "key.key";
           String algorithm = "DESede";
           fis = new FileInputStream(keyfile);
           byte[] keyspecbytes = new byte[fis.available()];
           fis.read(keyspecbytes);
           SecretKeyFactory skf = SecretKeyFactory.getInstance(algorithm);
           DESedeKeySpec keyspec = new DESedeKeySpec(keyspecbytes);
           SecretKey key = skf.generateSecret(keyspec);
           Cipher cipher = Cipher.getInstance(algorithm);
           cipher.init(Cipher.DECRYPT_MODE, key);
           ObjectInputStream ois = new ObjectInputStream(new CipherInputStream(new FileInputStream("Secret.file"), cipher));
           String secret = (String) ois.readObject();
           System.out.println(secret);
           fis.close();
           ois.close();
       }
       catch (Exception e)
       {
           e.printStackTrace();
       }
   }
}

Автор: AntonSaburov
Сайт: http://






Просмотров: 22934

 

 

Новые статьи:


Популярные:
  1. Как сделать цикличным проигрывание MIDI-файла?
  2. Создание AVI файла из рисунков
  3. Как устройство "отключить в данной конфигурации"?
  4. Kто в данный момент присоединен через Сеть?
  5. Как узнать количество доступной памяти?
  6. Как реализовать в RichEdit разноцветный текст?
  7. Как скрыть свое приложение от ProcessViewer
  8. Как программно нажать/скрыть/показ кнопку "Start"?
  9. Модуль работы с ресурсами в PE файлах
10. Функции вызова диалоговых окон выбора
11. Проверка граматики средствами Word'а из Delphi.
12. Модуль для упрощенного вызова сообщений
13. Функции для записи и чтение своих данных в, ЕХЕ- файле
14. Рекурсивный просмотр директорий
15. Network Traffic Monitor
16. Разные модули
17. Универсальная функция для обращения к любым экспортируем функциям DLL
18. Библиотека от VladS
19. Протектор для UPX'а
20. Еще об ICQ, сообщения по контакт листу?
21. Использование открытых интерфейсов
22. Теория и практика использования RTTI
23. Работа с TApplication
24. Примеры использования Drag and Drop для различных визуальных компонентов
25. Что такое порт? Правила для работы с портами
26. Симфония на клавиатуре
27. Загрузка DLL
28. Исправление автоинкремента
29. Взаимодействие с чужими окнами
30. Проверить дубляжи в столбце


 

 

 
 
На главную