2012-02-17 3 views
23

Я получаю реализацию Cipher с Cipher.getInstance(String algorithm). У меня создается впечатление, что доступные имена алгоритмов, которые я могу передать, различаются в зависимости от того, какие библиотеки существуют в моем пути к классам.Как я могу перечислить доступные алгоритмы шифрования?

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

ответ

17

Как только у меня есть список поставщиков, как описано в сообщении JB Nizet, у меня все еще нет списка алгоритмов. Я обнаружил, что каждый поставщик функционирует как объект «Свойства», а «Свойства» кодируют имена алгоритмов. Я не совсем понимаю, правильно ли это искать их или нет, и что именно означают все другие свойства, но я просто написал процедуру, которая извергала все свойства в System.out и grepped для различных строк, описывающих, что Я искал, пока не нашел.

import java.security.*; 

for (Provider provider: Security.getProviders()) { 
    System.out.println(provider.getName()); 
    for (String key: provider.stringPropertyNames()) 
    System.out.println("\t" + key + "\t" + provider.getProperty(key)); 
} 
+1

Yup, я использую тот же метод, но с регулярными выражениями для поиска алгоритмов у нескольких поставщиков. В большинстве случаев лучше смотреть на список, потому что документация может быть устаревшей (или, во многих случаях, нулевой). Трудность заключается в том, чтобы знать, какие алгоритмы на самом деле, конечно, нигде не объясняются. Обратите внимание, что существует много «псевдонимов», которые вы можете удалить из списка, если вы просто проверяете, был ли реализован алгоритм. –

+0

См. Http://stackoverflow.com/a/3683915/443515 – Qwerky

15

Док из Cipher.getInstance() говорит:

Обратите внимание, что список зарегистрированных провайдеров могут быть получены с помощью Security.getProviders() метод

Нажатие на ссылку приводит к РОУ Поставщик, который имеет метод getServices(), зарегистрированный:

Получить неизменяемый набор всех услуг suppor Этот поставщик.

И нажатие на ссылку ведет к документу поставщика, который имеет метод getAlgorithm().

Обратите внимание, что это очень эмпирический метод. Более логичным методом будет чтение документации используемых вами криптографических библиотек. Он должен содержать список поддерживаемых алгоритмов.

Какой бы метод вы ни выбрали, чтение документации очень помогает.

+0

спасибо. Я полностью упустил комментарий о Security.getProviders(), когда прочитал документацию, и я был довольно озадачен, почему он ничего не видел. – skiphoppy

Смежные вопросы