Primero, leemos los bytes codificados de la clave pública
FileInputStream keyfis = new FileInputStream(args[0]);
byte[] encKey = new byte[keyfis.available()];
keyfis.read(encKey);
keyfis.close();
Ahora el array de bytes encKey contiene los bytes codificados de la clave pública.
Podemos usar una clase KeyFactory para ejemplarizar una clave pública DSA desde sus bytes codificados. La clase KeyFactory proporciona conversión entre claves opacas (del tipo Key) y especificaciones de claves, que son representaciones transparentes del material de la clave. Con una clave opaca podemos obtener el nombre del algorimo, el nombre delformato, y los bytes de la clave codificados, pero no el material de la clave, que, por ejemplo, podría consistir en la propia clave y los argumentos del algoritmo usado para calcularla. (observa que PublicKey, como desciende de Key, es propiamente una Key.)
Por eso, primero necesitamos una especificación de clave. Podemos obtener una mediante esto, asumiendo que la clave fue codificada para el estándard X.509, que es el caso, por ejemplo, su la clave fue generada por el suministrado de key-pair generator DSA interno del proporcionador de SUN:
X509EncodedKeySpec pubKeySpec = new X509EncodedKeySpec(encKey);
Ahora necesitamos un objeto KeyFactory para hacer la conversión. Este objeto debe ser uno que trabaje con clves DS:
KeyFactory keyFactory = KeyFactory.getInstance("DSA", "SUN");
Finalmente, podemos usar el objeto KeyFactory para generar un PublicKey partiendo de la especificación de la clave.
PublicKey pubKey = keyFactory.generatePublic(pubKeySpec);