Поддержка Rijndael в Java - PullRequest
       27

Поддержка Rijndael в Java

15 голосов
/ 25 февраля 2009

У нас есть требование сделать некоторые разработки Rijndael на Java.

Какие-нибудь рекомендации для статей, библиотек и т. Д., Которые могут нам помочь?

Есть ли какие-либо указания на обслуживание хранилища ключей и как надежно хранить ключи?

Редактировать:

Это должно быть с открытым исходным кодом. По сути, это просто стандартное шифрование / дешифрование данных с использованием Rijndael.

Ответы [ 4 ]

24 голосов
/ 20 марта 2009

Java включает AES из коробки. Рейндаэль это AES. Вам не нужны внешние библиотеки. Вам просто нужно что-то вроде этого:

byte[] sessionKey = null; //Where you get this from is beyond the scope of this post
byte[] iv = null ; //Ditto
byte[] plaintext = null; //Whatever you want to encrypt/decrypt
Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
//You can use ENCRYPT_MODE or DECRYPT_MODE
cipher.calling init(Cipher.ENCRYPT_MODE, new SecretKeySpec(sessionKey, "AES"), new IvParameterSpec(iv));
byte[] ciphertext = cipher.doFinal(plaintext);

И все, для шифрования / дешифрования. Если вы обрабатываете большие объемы данных, вам лучше читать фрагменты, кратные 16 байтам, и вызывать update вместо doFinal (вы просто вызываете doFinal в последнем блоке).

5 голосов
/ 25 февраля 2009

Для большой бесплатной библиотеки я настоятельно рекомендую BouncyCastle. Она активно поддерживается, отличается высоким качеством и имеет хороший набор примеров кода. Для справочной документации вам придется больше полагаться на общие документы JCE.

Я не могу сказать, какую библиотеку мы используем для соответствия требованиям сертификации FIPS. Но есть альтернативы CryptoJ, которые намного, намного дешевле.

В общем, я бы рекомендовал генерировать новый ключ для каждого сообщения, которое вы шифруете с помощью симметричного шифра, такого как Rijndael, и затем шифровать этот ключ с помощью асимметричного алгоритма, такого как RSA. Эти закрытые ключи могут храниться в защищенном паролем программном хранилище ключей, таком как PKCS # 12 или Java JKS, или, для большей безопасности, на аппаратном токене «смарт-карты» или другом крипто-аппаратном модуле.

3 голосов
/ 19 января 2011

Как недавно узнала моя компания, AES - это не совсем Рейндаэль. AES имеет ограничение, согласно которому ключи ДОЛЖНЫ быть 128, 192 или 256-битными, однако Rijndael также допускает использование ключей с 160 и 224.

Как указано выше erickson, BouncyCastle предоставляет объект Rijndael, который поддерживает дополнительные длины ключей: 128/160/192/224/256 бит. В частности, взгляните на облегченный API.

Gnu-crypto - еще одна библиотека с открытым исходным кодом, однако она также НЕ обеспечивает поддержку 160- и 224-битных ключей.

Итак, если вы специально ищете полную поддержку Rijndael, то BouncyCastle - единственный, кого я нашел до сих пор.

1 голос
/ 25 февраля 2009

javax.crypto имеет поддержку AES: http://java.sun.com/developer/technicalArticles/Security/AES/AES_v1.html

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

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

При этом вопрос очень расплывчатый.

...