Java Cryptography Extension

Материал из Википедии — свободной энциклопедии
Это старая версия этой страницы, сохранённая KaterinaKrupnik (обсуждение | вклад) в 07:11, 17 декабря 2016. Она может серьёзно отличаться от текущей версии.
Перейти к навигации Перейти к поиску

Криптографическое расширение Java (англ. Java Cryptography Extension, сокр. JCE)  —официально выпущенное стандартное расширение для платформы Java и часть Java Cryptography Architecture(JCA). Представляет собой набор пакетов, который обеспечивает фреймворк и реализацию таких криптографических задач, как шифрование и дешифрование данных, генерация и проверка на подлинность ключей управления, а так же реализацию для и Message Authentication Code (MAC) алгоритмов.

Криптографическое расширение Java  основано на том же, что и криптографическая архитектура Java (JCA) и рассматривается как часть JCA. Разделение на JCA и JCE было необходимо, потому что американские законы запрещают экспорт некоторых видов криптографического программного обеспечения за пределы США и Канады или разрешают экспорт с урезанными ключами. Стандартные классы JCA содержат только хеш - функции, генераторы ключей и т.д. и не попадают под данное ограничение, поэтому могут быть спокойно экспортированы в составе платформы Java 2. Однако для сильных алгоритмов шифрования, это не применяется. Такие реализации должны быть получены из других источников, поэтому их хранят в JCE.

Криптографическое расширение Java  разработано таким образом, чтобы другие криптографические библиотеки могли быть подключены для предоставления новых алгоритмов без проблем.

Составляющие.

На данный момент криптографическое расширение поставляется в трех пакетах:

javax.crypto — интерфейс и классы для симметричного шифрования

javax.crypto.interfaces — интерфейсы средств выработки ключей для алгоритма Диффи-Хелмана

javax.crypto.spec — классы для управления ключами и параметрами криптографических алгоритмов

Функциональность

Как и JCA, JCE не зависит от реализации конкретных алгоритмов. Благодаря SPI различные реализации от разных производителей могут быть одновременно интегрированы в среде программирования Java. Начиная с версии 1.4, Java включает в себя JCE и JCA, однако другие реализации так же без каких-либо проблем могут быть подключены как статически, так и динамически.

Криптографическое расширение Java предлагает следующие функциональные возможности:

·        Шифр - криптографические алгоритмы (симметричные и асимметричные) для шифрования, блочные и потоковые шифры

·        Управление ключами - Классы KeyGenerator для генерации ключей, KeyAgreement для безопасного обмена ключами и SecretKeyFactory для разделения закрытого и открытого ключей

·        Проверка на подлинность кодов 

·        Создание безопасных объектов и цифровых подписей

Аудитория JCE

У криптографического расширения Java есть функции безопасности, предназначенные для различных аудиторий

Пользователи

Встроенные функции безопасности JCE защищают пользователя от злонамеренных программ (включая вирусы), сохраняют конфиденциальность пользовательских файлов и информации о пользователе, проверяют подлинность личности каждого поставщика кода. Пользователь так же может подвергнуть приложения проверке на безопасность, когда ему это необходимо.

Разработчики

Разработчик может использовать методы JCE, чтобы включить функции безопасности в свои программы, в том числе криптографические службы и проверки безопасности. JCE позволяет определить и интегрировать свои собственные права доступа (контроль доступа к определенным ресурсам) и реализации криптографических служб безопасности. Кроме того, классы JCE предназначены для управления собственными приватными/частными парами ключей и сертифицирования открытых ключей от людей, которым доверяет разработчик.

Системные администраторы, разработчики и пользователи

Инструменты JCE управляют хранилищем ключей (база данных ключей и сертификатов); генерируют цифровые подписи для JAR-файлов, а также проверяют подлинность таких подписей и целостность подписанного содержимого; а также создавать и изменять приватные файлы, которые определяют безопасность их установки.

Известные реализации JCE

Среди различных реализаций JCE можно выделить пакет Cryptix JCE, пакет Bouncy Castle и пакет IAIK JCE.

Cryptix JCE

Пакет Cryptix JCE является самым известным из бесплатных расширений. Работа над ним началась в 1995 году. Это была первая доступная криптографическая библиотека для Java. Тогда криптография не имела широкой доступности, и данный проект играл важную роль в защите информации при разработке программ на Java платформе.  Последняя версия Cryptix была выпущена 28 апреля 2005 года. В том же году поддержка Cryptix была прекращена.

Пакет Cryptix JCE включает в себя:

  • ·        Шифры Blowfish, CAST5, DES, IDEA, MARS, RC2, RC4, RC6, Rijndael, Serpent, SKIPJACK, Square, TripleDES, Twofish.
  • ·        Протоколы обмена ключами – Диффи-Хелмана
  • ·        Методы шифрования CBC, ECB, OFB
  • ·        Хэш-функции – MD2, MD4, MD5, RIPEMD-128, RIPEMD-160, SHA-0, SHA-1, Tiger
  • ·        MAC-коды – HMAC-MD2, HMAC-MD4, HMAC-MD5, HMAC-RIPEMD-128, HMAC-RIPEMD-160, HMAC-SHA-0, HMAC-SHA-1, HMAC-Tiger
  • ·        Подписи – RawDSA, RSA
  • ·        Асимметричные шифры – ElGamal, RSA

Так же как и Cryptix JCE пакет Bouncy Castle является бесплатным. Первый официальный релиз Bouncy Castle появился в мае 2000 года и был длиной около 27 000 строк. Проект постоянно рос, и к 2012 году код Bouncy Castle для Java составлял более 300000 строк.

Он включает в себя

  • ·        реализацию протокола обмена Диффи-Хеллмана, включа­я версию алгоритма с эллиптическими кривыми.
  • ·        вычисление бесключевых хэш- функций сообщений - MD2, MD4, MD5, Tiger, RIPEMD, SHA
  • ·        вычисления ключевых хэш-функций сообщений - CMAC, HMAC
  • ·        асимметричное шифрование PKCS 1
  • ·        симметричное шифрование с помощью DES, TripleDES, AES, Blowfish, IDEA, RC2, RC4, RC5, RC6, Twofish, Skipjack и многих других шифров
  • ·        генераторы ключей, ключевых пар и других параметров криптографических алгоритмов.
  • ·        вычисления MAC с использованием любого блочного шифра, обрабатывающего текст блоками методом CBC, CFB, OFB
  • ·        алгоритмы электронной цифровой подписи RSA, DSA, EC-DSA

И обладает следующими свойствами

  • ·        содержит криптографические API для языков Java и C#
  • ·        содержит провайдер для JCE и JCA
  • ·        содержит реализации JCE 1.2.1, реализован­ные разработчиками самостоятельно (т.е. пакет не со­держит кодов JCE 1.2.1 от Sun, экспорт на который запрещен в США)
  • ·        поддерживает спецификации ASN.1 кодиро­вания объектов
  • ·        поддержка сертификатов X.509 различных версий
  • ·        поддержка стандартов Open PGP, OCSP, TSP и др.

IAIK JCE

Коммерческий пакет, реализованный институтом прикладной обработки информации и связи (Institute for Applied Information Processing and Communication , IAIK) технологического университета Граца.

Примеры

Шифрование массива

В следующем примере показана реализация шифрования массива байтов с помощью алгоритма AES. Для написания программы использовались средства пакета Bouncycastle.

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();

}

SecureRandom

SecureRandom это класс, который используется для генерации криптографически сильного псевдослучайного числа с помощью PRNG алгоритма. Есть два основных преимущества SecureRandom перед Random.

1. SecureRandom производит криптостойкого генератор псевдослучайных чисел.

2. SecureRandom производит криптостойкие последовательности, как описано в Randomness Recommendations for Security

package org.owasp.java.crypto;

import java.security.SecureRandom;
import java.security.NoSuchAlgorithmException;

import sun.misc.BASE64Encoder;

/**
 * @author Joe Prasanna Kumar
 * This program provides the functionality for Generating a Secure Random Number.
 *  
 * There are 2 ways to generate a  Random number through SecureRandom.
 * 1. By calling nextBytes method to generate Random Bytes
 * 2. Using setSeed(byte[]) to reseed a Random object
 * 
 */


public class SecureRandomGen {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		try {
	        // Initialize a secure random number generator
	        SecureRandom secureRandom = SecureRandom.getInstance("SHA1PRNG");
	    
	        // Method 1 - Calling nextBytes method to generate Random Bytes
	        byte[] bytes = new byte[512];
	        secureRandom.nextBytes(bytes); 
	        
	        // Printing the SecureRandom number by calling secureRandom.nextDouble()
	        System.out.println(" Secure Random # generated by calling nextBytes() is " + secureRandom.nextDouble());
	    
	        // Method 2 - Using setSeed(byte[]) to reseed a Random object
	        int seedByteCount = 10;
	        byte[] seed = secureRandom.generateSeed(seedByteCount);   
	        
	        // TBR System.out.println(" Seed value is " + new BASE64Encoder().encode(seed));
	    
	        secureRandom.setSeed(seed);
	        
	        System.out.println(" Secure Random # generated using setSeed(byte[]) is  " + secureRandom.nextDouble());
	        
	    } catch (NoSuchAlgorithmException noSuchAlgo)
		{
			System.out.println(" No Such Algorithm exists " + noSuchAlgo);
		}
	}

}

Ссылки

Источники

http://www.oracle.com/technetwork/java/javase/tech/index-jsp-136007.html

https://www.bouncycastle.org/

Шнайер Б. Прикладная криптография. Протоколы, алгоритмы, исходные тексты на языке С. М.: Триумф, 2002. 816 с.

“Java Security Handbook” Jamie Jaworski and Paul Perrone

Rich Helton, Johennie Helton: . Wiley, 2002

Jason Weiss: . Practical Guide for Programmers. Morgan Kaufmann, 2004

См. также