java - Come posso elencare gli algoritmi Cipher disponibili?




encryption cryptography (2)

Ricevo un'implementazione di Cipher con Cipher.getInstance(String algorithm) . Ho l'impressione che i nomi di algoritmi disponibili che posso passare differiscano in base a quali librerie sono presenti nel mio classpath.

Vorrei scrivere un semplice programma che possa essere eseguito con diversi classpath che elencheranno i nomi degli algoritmi Cipher disponibili. Quale metodo avrei bisogno di chiamare per ottenere questo elenco?

https://code.i-harness.com


Il documento di Cipher.getInstance() dice:

Si noti che l'elenco dei provider registrati può essere recuperato tramite il metodo Security.getProviders ()

Cliccando sul link si accede al documento del Provider, che ha un metodo getServices() documentato da:

Ottieni un insieme non modificabile di tutti i servizi supportati da questo Provider.

E facendo clic sul link si accede al documento del Provider che ha un metodo getAlgorithm() .

Si noti che questo è un metodo molto empirico. Un metodo più logico sarebbe quello di leggere la documentazione delle librerie crittografiche che stai utilizzando. Deve contenere l'elenco degli algoritmi supportati.

Qualunque sia il metodo scelto, leggere la documentazione aiuta molto.


Una volta che ho un elenco di provider, come descritto nel post di JB Nizet, non ho ancora un elenco di algoritmi. Ho scoperto che ogni Provider funziona come un oggetto Proprietà e le Proprietà codificano i nomi degli algoritmi. Non sono del tutto chiaro se questo è il modo corretto per cercarli o meno, e cosa significano esattamente tutte le altre proprietà, ma ho appena scritto una routine che ha sputato tutte le proprietà a System.out e grepped per varie stringhe che descrivono cosa Stavo cercando fino a quando l'ho trovato.

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






javax.crypto