Что значит «SecretKeyFactory недоступен»? - PullRequest
5 голосов
/ 06 декабря 2011

Что с этим не так?

for (Object obj : java.security.Security.getAlgorithms("Cipher")) {
  System.out.println(obj);
}
javax.crypto.SecretKeyFactory.getInstance("AES");

Это вывод (JDK 1.6 в Mac OS 10.6):

BLOWFISH
ARCFOUR
PBEWITHMD5ANDDES
RC2
RSA
PBEWITHMD5ANDTRIPLEDES
PBEWITHSHA1ANDDESEDE
DESEDE
AESWRAP
AES
DES
DESEDEWRAP
PBEWITHSHA1ANDRC2_40

java.security.NoSuchAlgorithmException: AES SecretKeyFactory not available
 at javax.crypto.SecretKeyFactory.<init>(DashoA13*..)
 at javax.crypto.SecretKeyFactory.getInstance(DashoA13*..)
 ...

Ответы [ 3 ]

5 голосов
/ 06 декабря 2011

Это подтвержденная ошибка Java. Смотри http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=7022467

РЕДАКТИРОВАТЬ: Различные версии Java поддерживают разные алгоритмы, вы также можете расширить его с помощью пользовательских провайдеров и так далее. У Oracle есть список для Java 6 здесь http://docs.oracle.com/javase/6/docs/technotes/guides/security/SunProviders.html. Для KeyFactory это DSA.

4 голосов
/ 06 декабря 2011

Вам не нужно использовать SecretKeyFactory. Вы можете создать ключ AES с помощью следующего:

byte[] keyData = ........ 
SecretKeySpec key = new SecretKeySpec(keyData, "AES");

Если вы хотите использовать шифрование на основе пароля (PBE), просто выберите безопасный алгоритм хеширования, который дает вам хэш-код того же размера, что и требуемый ключ. Например, если вам нужен 256-битный ключ для AES, вот метод для создания ключа;

private Key buildKey(String password) throws NoSuchAlgorithmException, UnsupportedEncodingException {
  MessageDigest digester = MessageDigest.getInstance("SHA-256");
  digester.update(password.getBytes("UTF-8"));
  byte[] key = digester.digest();
  SecretKeySpec spec = new SecretKeySpec(key, "AES");
  return spec;
}

Edit:
Я бы рекомендовал не использовать MD5 и DES, если это не игровой проект, оба имеют недостатки и считаются устаревшими.

2 голосов
/ 17 марта 2013

Не все версии Java предоставляют SecretKeyFactory для "AES" в своих провайдерах по умолчанию.

Если вы хотите сгенерировать новый ключ, выберите желаемое количество бит (128, 192 или 256).) из экземпляра SecureRandom и используйте это случайное число для инициализации экземпляра SecretKeySpec.

Если вы используете шифрование на основе пароля, создайте SecretKeyFactory для алгоритма "PBKDF2WithHmacSHA1" и используйтечтобы инициализировать экземпляр SecretKeySpec как , показанный здесь.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...