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

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

Любые рекомендации для статей, библиотек и т.д., которые нам помогут?

Любые указатели на обслуживание хранилища ключей и надежное хранение ключей?

Изменить:

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

Ответ 1

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.init(Cipher.ENCRYPT_MODE, new SecretKeySpec(sessionKey, "AES"), new IvParameterSpec(iv));
byte[] ciphertext = cipher.doFinal(plaintext);

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

Ответ 2

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

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

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

Ответ 3

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

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

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

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

Ответ 4

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

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

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

Говоря, вопрос очень расплывчатый.