CRIPTOGRAFIA RSA (128 bits) - IMPORTACAO DE CHAVE PUBLICA

2 respostas
F

Boa tarde pessoal,

Estou implementando uma rotina em meu sistema para envio de dados de cartao de convenio, para isso o pessoal me enviou uma chavepublica.pem, porém só consigo criptografar gerando as chaves, mas não eh isso que quero, eu preciso importar uma chave_publica.pem, Alguém poderia me ajudar com um exemplo ou um trecho de código que funciona ? Já procurei aqui no forum !Já procurei no bouncycastle, vi que eles tem uma classe chamada PEMReader, mas não consegui implementar nem com banda de música…Já estou a 3 dias nisso e não saio do chão…ALGUÉM PODERIA DAR ALGUMA LUZ ???

Obrigado

2 Respostas

G

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

F

Cara, muito obrigado pela força…mas depois de uma semana pesquisando consegui implementar a criptografia importando a chave publica…vou testar o seu código, se quiser que eu mostre minha implementação eh só falar !

Muito Obrigado

Criado 5 de fevereiro de 2009
Ultima resposta 7 de fev. de 2009
Respostas 2
Participantes 3