Криптографічне розширення Java (англ. Java Cryptography Extension, скор. JCE) — офіційно випущене стандартне розширення для платформи Java і частина Java Cryptography Architecture (JCA). Являє собою набір пакетів, який забезпечує фреймворк і реалізацію таких криптографічних завдань, як шифрування і дешифрування даних, генерація та перевірка на справжність ключів керування, а також реалізацію та Message Authentication Code (MAC) алгоритмів[1].
Криптографічне розширення Java засноване на тому ж, що і криптографічний архітектура Java (JCA) і розглядається як частина JCA. Справа в тому, що американські закони забороняють експорт деяких видів криптографічного програмного забезпечення[en] (зокрема симетричного шифрування і вироблення загального ключового матеріалу) за межі США і Канади або дозволяють експорт з урізаними ключами. Стандартні класи JCA містять тільки хеш-функції, генератори ключів та інші функції, які не потрапляють під це обмеження, і можуть бути спокійно експортовані в складі платформи Java 2. Однак сильні алгоритми шифрування, які потрапляють під експортні обмеження на криптографію в США, повинні бути отримані з інших джерел, тому їх постачається у вигляді окремого продукту - JCE.
Криптографічне розширення Java розроблено таким чином, щоб інші криптографічні бібліотеки могли бути підключені для надання нових алгоритмів без проблем[2].
На даний момент в JDK 1.2 криптографічне розширення поставляється в трьох пакетах:
Як і JCA, JCE не залежить від реалізації конкретних алгоритмів. Завдяки SPI різні реалізації від різних виробників можуть бути одночасно інтегровані в середовищі програмування Java. Починаючи з версії 1.4, Java включає в себе JCE і JCA, проте інші реалізації так само без будь-яких проблем можуть бути підключені як статично, так і динамічно.
Криптографічне розширення Java пропонує наступні функціональні можливості:
Шифр — криптографічні алгоритми (симетричні і асиметричні) для шифрування, блокові і потокові шифри
У криптографічного розширення Java є функції безпеки, призначені для різних аудиторій
Вбудовані функції безпеки JCE захищають користувача від зловмисних програм (включаючи віруси), зберігають конфіденційність файлів користувача та інформації про користувача, перевіряють справжність особистості кожного постачальника коду. Користувач так само може піддати додатки перевірці на безпеку, коли йому це необхідно.
Розробник може використовувати методи JCE, щоб включити функції безпеки в свої програми, в тому числі криптографічні служби та перевірку безпеки. JCE дозволяє визначити та інтегрувати свої власні права доступу (контроль доступу до певних ресурсів) і реалізації криптографічних служб безпеки. Крім того, класи JCE призначені для управління власними приватними парами ключів та сертифікації відкритих ключів від людей, яким довіряє розробник.
Інструменти JCE керують сховищем ключів (база даних ключів і сертифікатів); генерують цифрові підписи для JAR-файлів, а також перевіряють достовірність таких підписів і цілісність підписаного вмісту; створюють і змінюють приватні файли, які визначають безпеку їх встановлення.
Серед різних реалізацій JCE можна виділити пакет Cryptix JCE, пакет Bouncy Castle і пакет IAIK JCE.
Пакет Cryptix JCE є найвідомішим з безкоштовних розширень. Робота над ним розпочалася у 1995 році. Це була перша доступна криптографічна бібліотека для Java. Тоді криптографія не мала широкої доступності, і даний проект грав важливу роль у захисті інформації при розробці програм на Java платформі. Остання версія Cryptix була випущена 28 квітня 2005 року. У тому ж році підтримка Cryptix була припинена.
Пакет Cryptix JCE включає в себе:
Так само як і Cryptix JCE, пакет Bouncy Castle є безкоштовним. Перший офіційний реліз Bouncy Castle з'явився в травні 2000 року і був довжиною близько 27 000 рядків. Проект постійно зростав, і до 2012 року код Bouncy Castle для Java становив понад 300 000 рядків.
Він включає в себе:
І має наступні властивості:
Комерційний пакет, реалізований інститутом прикладної обробки інформації (Institute for Applied Information Processing and Communication, IAIK) технологічного університету Граца.[4]
У наведеному прикладі показана реалізація шифрування масиву байтів за допомогою алгоритму AES. Для написання програми використовувалися засоби пакета Bouncy Castle.[5]
BufferedBlockCipher cipher = new PaddedBufferedBlockCipher( new CBCBlockCipher(new AESFastEngine()));
SecureRandom srr = new SecureRandom();
byte [] AESkey = new byte[16];
srr.nextBytes(AESkey);
byte [] AESinitV = new byte[16];
srr.nextBytes(AESinitV);
ParametersWithIV piv= new ParametersWithIV ((new KeyParameter(AESkey)), AESinitV);
cipher.init(true, piv);
byte[] result = new byte[cipher.getOutputSize( toEncrypt.length)];
int len = cipher.processBytes( toEncrypt, 0, toEncrypt.length, result, 0);
try {
cipher.doFinal(result, len);
} catch (CryptoException ce)
{ result = "Cipher error".getBytes();
ce.printStackTrace();
}