Vamos lá, vc esta querendo importar a chave publica para que? ela ja esta em um arquivo vc pode ler ela direto deste arquivo. Se vc precisa assinar alguma coisa vc vai precisar obter a chave privada, agora caso vc precise apenas validar alguma coisa ai sim vc vai precisar apenas da chave publica. Mas se vc precisa apenas obter a chave publica vc pode tentar usando o codigo a baixo:
public class Criptografia {
// private static final String algorithm = "RSA";
private static final String algorithm = "RSA";
// private static final String signatureAlgorithm = "MD5withRSA";
private static final String signatureAlgorithm = "SHA1withDSA";
private static final String TIPO_KEY_STORE = "PKCS12";
// private static final String TIPO_KEY_STORE = "JKS";
public static void main(String[] args) {
String txt = "String a ser encriptada";
try {
File cert = new File("C:\\arquivo.pem");
String alias = "aliasDaChave";
String pwd = "senha";// senha é necessaria apenas para se obter a chave privada
PrivateKey privateKey = getPrivateKeyFromFile(cert, alias, pwd);
PublicKey publicKey = getPublicKeyFromFile(cert, alias, pwd);
byte[] txtAssinado = createSignature(privateKey, txt.getBytes());
System.out.println(txt2Hexa(txtAssinado));
if (verifySignature(publicKey, txt.getBytes(), txtAssinado)) {
System.out.println("Assinatura OK!");
}
else {
System.out.println("Assinatura NOT OK!");
}
}
catch (Exception e) {
e.printStackTrace();
}
}
/**
* Extrai a chave privada do arquivo.
*/
public static PrivateKey getPrivateKeyFromFile(File cert, String alias, String password) throws Exception {
KeyStore ks = KeyStore.getInstance(TIPO_KEY_STORE);
char[] pwd = password.toCharArray();
InputStream is = new FileInputStream(cert);
ks.load(is, pwd);
is.close();
Key key = ks.getKey(alias, pwd);
if (key instanceof PrivateKey) {
return (PrivateKey) key;
}
return null;
}
/**
* Extrai a chave pública do arquivo.
*/
public static PublicKey getPublicKeyFromFile(File cert, String alias, String password) throws Exception {
KeyStore ks = KeyStore.getInstance(TIPO_KEY_STORE);
char[] pwd = password.toCharArray();
InputStream is = new FileInputStream(cert);
ks.load(is, pwd);
// Key key = ks.getKey(alias, pwd);
Certificate c = ks.getCertificate(alias);
PublicKey p = c.getPublicKey();
return p;
}
/**
* Retorna a assinatura para o buffer de bytes, usando a chave privada.
*/
public static byte[] createSignature(PrivateKey key, byte[] buffer) throws Exception {
Signature sig = Signature.getInstance(signatureAlgorithm);
sig.initSign(key);
sig.update(buffer, 0, buffer.length);
return sig.sign();
}
/**
* Verifica a assinatura para o buffer de bytes, usando a chave pública.
*/
public static boolean verifySignature(PublicKey key, byte[] buffer, byte[] signed) throws Exception {
Signature sig = Signature.getInstance(signatureAlgorithm);
sig.initVerify(key);
sig.update(buffer, 0, buffer.length);
return sig.verify(signed);
}
/**
* Converte um array de byte em uma representação, em String, de seus hexadecimais.
*/
public static String txt2Hexa(byte[] bytes) {
if (bytes == null)
return null;
String hexDigits = "0123456789abcdef";
StringBuffer sbuffer = new StringBuffer();
for (int i = 0; i < bytes.length; i++) {
int j = ((int) bytes[i]) & 0xFF;
sbuffer.append(hexDigits.charAt(j / 16));
sbuffer.append(hexDigits.charAt(j % 16));
}
return sbuffer.toString();
}
}
Cara se vc não conseguir usando este codigo entra em contato, que estou disposto a te ajudar