Модераторы: LSD, AntonSaburov
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Криптография в Java 
V
    Опции темы
Domestic Cat
Дата 29.11.2004, 17:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5452
Регистрация: 3.5.2004
Где: Dallas, US

Репутация: 50
Всего: 172



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 - 30.11.2004, 17:57


--------------------

PM   Вверх
jfx
Дата 8.2.2006, 10:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 98
Регистрация: 18.10.2004

Репутация: нет
Всего: 1



У меня вопрос по SecretKeyFactory. Я не могу понять что он делает....
Например в .NET для DES используется key - ключ и IV - вектор инициализации. А вот с java я что-то не пойму:

Код

byte key[] = {0, 1, 2, 3, 4, 5, 6, 7};
DESKeySpec des = new DESKeySpec(key);
SecretKeyFactory skf = SecretKeyFactory.getInstance("DES");
SecretKey secretkey = skf.generateSecret(des);

Cipher сipher = Cipher.getInstance("DES");
cipher.init(2, secretkey);


Где здесь key, где iv... Разъясните пожалуйста в чем смысл SecretKeyFactory. И если можно какиенибудь аналогии с привычными key и iv.
Спасибо.
PM MAIL   Вверх
LSD
Дата 8.2.2006, 12:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Leprechaun Software Developer
****


Профиль
Группа: Модератор
Сообщений: 15718
Регистрация: 24.3.2004
Где: Dublin

Репутация: 210
Всего: 538



IV можно получить - сipher.getIV().
secretkey.getEncoded() возвращает ключ в стандартном виде.


--------------------
Disclaimer: this post contains explicit depictions of personal opinion. So, if it sounds sarcastic, don't take it seriously. If it sounds dangerous, do not try this at home or at all. And if it offends you, just don't read it.
PM MAIL WWW   Вверх
jfx
Дата 8.2.2006, 12:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 98
Регистрация: 18.10.2004

Репутация: нет
Всего: 1



Спасибо. Это понятно.
Я просто хочу разобраться что такое SecretKeyFactory, что это такое, зачем оно нужно и почему нельзя использовать обычние key и iv.
Ну и как соотносятся тот массив байт что в начале к обычным key и iv.
PM MAIL   Вверх
LSD
Дата 8.2.2006, 12:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Leprechaun Software Developer
****


Профиль
Группа: Модератор
Сообщений: 15718
Регистрация: 24.3.2004
Где: Dublin

Репутация: 210
Всего: 538



DESKeySpec - это исходные данные для генерации ключа DES. SecretKey - это уже реальный ключ используемый для шифрования представленных в том формате который используется Cipher-ом. SecretKeyFactory предназначен для конвертирования ключей в обоих направлениях.


--------------------
Disclaimer: this post contains explicit depictions of personal opinion. So, if it sounds sarcastic, don't take it seriously. If it sounds dangerous, do not try this at home or at all. And if it offends you, just don't read it.
PM MAIL WWW   Вверх
jfx
Дата 8.2.2006, 13:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 98
Регистрация: 18.10.2004

Репутация: нет
Всего: 1



Стало не намного понятне smile Что он делает с ключами, и что из себя представляет массив байт? То что это исходные данные для генерации "того ключа с которыми работает сифер" это я понял, но это только слова... В документации по Java я не нашел ни чего о формате ключа... может где-то есть статьи о криптографии в java? Мне просто трудно работать с "этим" не понимая смысла...
Спасибо.
PM MAIL   Вверх
LSD
Дата 9.2.2006, 12:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Leprechaun Software Developer
****


Профиль
Группа: Модератор
Сообщений: 15718
Регистрация: 24.3.2004
Где: Dublin

Репутация: 210
Всего: 538



Цитата(jfx @ 8.2.2006, 13:23 Найти цитируемый пост)
Что он делает с ключами, и что из себя представляет массив байт?

Переводит во внутренний формат. В частности: DES ключ состоит из 64 бит, но реально для шифрования используются только 56, остальные 8 это контрольная сумма, а вектора инициализации и вовсе нет (что там MS в C# намутила, я не понимаю).
Понимаешь этот интерфейс универсальный для самых разных алгоритмов шифрования и требования к ключу шифрования тоже могут быть разными. Далеко не факт, что любая сгенерированная пользователем последовательность байт, будет пригодна как ключ шифрования, поэтому у ввели этот интерфейст.

Попробуй почитать Java Cryptography от O'Relly, в Компьютерной литературе была ссылка.


--------------------
Disclaimer: this post contains explicit depictions of personal opinion. So, if it sounds sarcastic, don't take it seriously. If it sounds dangerous, do not try this at home or at all. And if it offends you, just don't read it.
PM MAIL WWW   Вверх
jfx
Дата 10.2.2006, 09:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 98
Регистрация: 18.10.2004

Репутация: нет
Всего: 1



Спасибо. Почитаю.
Что из себя представляет ключ DES я в курсе smile Просто из всего вышесказанного я сделал вывод что те 8 байт не являются собственно ключом, а являются всего лиш данными для генерации реального ключа. Сейчас, немного покопавшись в отладчике я пришел к выводу что все же это и есть ключь. Кейфактори просто приводит его к некому универсальному формату, для огранизации единого интерфейса для разных алгоритмов...
Осталось только понять в чем разница реализаций DES от SUN и Microsoft.

Это сообщение отредактировал(а) jfx - 10.2.2006, 09:54
PM MAIL   Вверх
jfx
Дата 10.2.2006, 10:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 98
Регистрация: 18.10.2004

Репутация: нет
Всего: 1



Хм, если MS провайдеру сунут вектор инициализации 0, то первые 8 байт (т.е. один блок) шифруется точно также как и в Java. А вот дальше начинаютя отличия. Очевидно он как-то меняет свой iv...
Люди кто сталкивался с шифрованием в Java и в .NET? Помогите разобраться как их совместить? Чтобы зашифрованное одним расшифровывалось другим и наоборот.
Спасибо.
Добавлено @ 10:20
Разобрался smile Оказывается у провайдера от MS есть несколько режимов работы, и совместимость с Java достигается установкой The Electronic Codebook моды.

Цитата

The Electronic Codebook (ECB) mode encrypts each block individually. This means that any blocks of plain text that are identical and are in the same message, or in a different message encrypted with the same key, will be transformed into identical cipher text blocks.


Это сообщение отредактировал(а) jfx - 10.2.2006, 10:23
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Java"
LSD   AntonSaburov
powerOn   tux
javastic
  • Прежде, чем задать вопрос, прочтите это!
  • Книги по Java собираются здесь.
  • Документация и ресурсы по Java находятся здесь.
  • Используйте теги [code=java][/code] для подсветки кода. Используйтe чекбокс "транслит", если у Вас нет русских шрифтов.
  • Помечайте свой вопрос как решённый, если на него получен ответ. Ссылка "Пометить как решённый" находится над первым постом.
  • Действия модераторов можно обсудить здесь.
  • FAQ раздела лежит здесь.

Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, LSD, AntonSaburov, powerOn, tux, javastic.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Java: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0529 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.