Губа Сергій Васильович

Державний ВУЗ "Національний гірничий університет", Україна

Шифрование в Java. Архитектура, возможности и применение

В даних тезах містяться основні поняття про архітектуру класів пакету Java JCE. В тексті наведені приклади використання пакету JCE для симетричного шифрування даних.

 

ВСТУП

Мова Java, починаючи з версії 1.2, володіє вбудованим набором класів підтримки криптографії. З плином часу і виходом нових версій мови, підтримка криптографії розширювалася, доповнюючись новими алгоритмами і стандартами.
У версії JAVA SE 6 всі класи, що реалізують криптографічні функції об'єднані в пакеті javax.crypto. Даний пакет містить 18 основних класів, 1 інтерфейс, а також 5 додаткових класів для підтримки виняткових ситуацій.

Компанія Sun, починаючи з версії Java SE 1.2 виділила класи підтримки криптографії в окремий фреймворк під назвою JCE (Java Cryptography Extensions), тим самим забезпечивши незалежне розвиток JCE. Основні заявлені принципи архітектури фреймворку [3,c.5]:

Незалежність організації і взаємодії;

Незалежність від конкретного алгоритму, можливість додавання нових алгоритмів.

На сьогоднішній день підтримуються наступні симетричні алгоритми шифрування: RC2, RC5, Blowfish, DES, Triple DESede, AES Rijndael[4,с. 20].

Однак можливості JCE не обмежуються лише симетричними алгоритмами шифрування. Даний фреймворк надає повний інструментарій для створення електронних цифрових підписів та сертифікатів з використанням асиметричної криптографії.
         Розглянемо докладніше симетричне шифрування, його можливості і використання в прикладних програмах.

Прагнучи забезпечити максимальну незалежність роботи від певного алгоритму шифрування, розробники JCE зробили наступний крок: рядковий завдання типу алгоритму і параметрів його роботи, з подальшою ініціалізацією універсального класу зі стандартним набором методів, які не залежать від алгоритму шифрування.

У процесі шифрування\дешифрування беруть участь поняття «ключ» і «алгоритм шифрування», відповідно до JCE ці поняття представлені у вигляді класів Key і Cipher. Ініціалізація алгоритму шифрування відбувається наступним чином:

Cipher aes_cipher = Cipher.getInstance("AES/ECB/NoPadding");

Розглянемо рядковий параметр:

AES – тип алгоритму;

ECB – режим роботи алгоритму (в даному випадку використовується режим «електронна кодова книга»);

NoPadding – тип заповнення.

У загальному випадку можна виділити два типи строкового параметра для ініціалізації алгоритму шифрування:

«алгоритм/режим/заповнення»;

«алгоритм».

При ініціалізації і завданні неприпустимих або невірних параметрів алгоритму шифрування виникають такі виняткові ситуації на етапі ініціалізації: NoSuchAlgorithmException, NoSuchPaddingException.

Ініціалізація ключа вимагає передачу типу алгоритму шифрування, як строкового параметра конструктора, а також масиву байт в якості секретного ключа.
Байтовий масив повинен бути відповідної довжини для вибраного алгоритму шифрування, в іншому випадку при операції шифрування / дешифрування виникне надзвичайна ситуація IllegalBlockSizeException.

String key_string="Sonnenuntergang!";

SecretKey secret_key = new SecretKeySpec(key_string.getBytes(),"AES");

Варіант функції шифрування буде виглядати наступним чином:public String encrypt(String str)

{

     Cipher cipher = Cipher.getInstance(CIPHER);

     cipher.init(Cipher.ENCRYPT_MODE, secret_key);

     String res = new String(cipher.doFinal(str.getBytes()));

     return res;

}

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

Варіант функції дешифрування аналогічний функції шифрування. Відмінність полягає в константах, які задають режим шифрування або дешифрування. Цими константами можуть бути Cipher.ENCRYPT_MODE, Cipher.DECRYPT_MODE. Відповідно при дешифруванні рядка, слід використовувати константу Cipher.DECRYPT_MODE.

 

ВИСНОВОК

У наведених прикладах показано зручність роботи з JCE, а також широкі можливості його застосування. JCE застосовується в таких відомих проектах, як Sun Glassfish, Apache-SSL, а також у ряді інших веб-серверів і додатків.

 

Перелік літератури:

1.       Хорстман К., Корнел Г. Java2.Том 1  М.: Вільямс. 2006. 890 с.

2.       Хорстман К., Корнел Г. Java2.Том 2  М.: Вільямс. 2006. 1166 с.

3.       Java Cryptography Architecture API Specification & Reference. 2002

4.       Java Cryptography Extension (JCE) Reference Guide for the Java 2 SDK, Standard Edition, v 1.4. 2003