Губа Сергій Васильович
Державний ВУЗ
"Національний гірничий університет", Україна
Шифрование
в 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