Страницы

24 ноября 2013 г.

Криптография / JCE (Java Cryptography Extentions) - Triple DESede

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

Triple DES (3DES) — это симметричный блочный шифр, созданный Уитфилдом Диффи, Мартином Хеллманом и Уолтом Тачманном в 1978 году на основе алгоритма DES, преследуя цель устранить главный изъян — малую длину ключа (56 бит), который в свою очередь может быть взломан полным перебором ключа.

    Скорость работы 3DES в 3 раза ниже, чем у DES, но криптостойкость намного выше — время, требуемое для криптоанализа 3DES, может быть в миллиард раз больше, чем время, нужное для вскрытия DES. 3DES используется чаще, чем DES, который легко взламывается при помощи сегодняшних технологий (в 1998 году организация Electronic Frontier Foundation, используя специальный компьютер DES Cracker, вскрыла DES за 3 дня). 3DES является простым способом устранения недостатков DES. Алгоритм 3DES построен на основе DES, поэтому для его реализации возможно использовать программы, созданные для 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();
        }
    }
}

Комментариев нет:

Отправить комментарий