2010-06-02 48 views
10

¿Cómo hacer el cifrado RSA de la matriz de bytes con la clave pública codificada en base 64?Encriptación RSA con clave pública codificada en base64 en Android

Después de leer el par de artículos (de búsqueda de google) sobre cómo hacer el cifrado RSA en Java, que se encuentra el siguiente fragmento

public byte[] rsaEncrypt(byte[] data) { 
    PublicKey pubKey = readKeyFromFile("/public.key"); 
    Cipher cipher = Cipher.getInstance("RSA"); 
    cipher.init(Cipher.ENCRYPT_MODE, pubKey); 
    byte[] cipherData = cipher.doFinal(src); 
    return cipherData; 
} 

tengo la clave pública como una cadena codificada en base64 (126 caracteres), ¿Cómo Cómo creo 'PublicKey' con la cadena codificada y la uso con Cipher.

+0

¿Cómo podemos saber lo que está contenido en su cadena codificada en base64? Probablemente sea un módulo y un exponente público, pero ¿qué forma? * Probablemente * la codificación DER de un X509EncodedKeySpec. –

Respuesta

8

Su cadena base64 es posiblemente una X509EncodedKeySpec. Solo puedo adivinar. Si es así, debe base64 decodificar la cadena para obtener un byte []. Luego construya un X509EncodedKeySpec desde este byte []. A continuación, cree una instancia de RSA KeyFactory y utilice el método generatePublic() de KeyFactory para obtener un PublicKey. Esta clave pública se puede pasar al Cipher.init().

Nota: para realizar la decodificación base64 utilice apache commons codec, o the Harder base64 decoder.

ACTUALIZACIÓN 8 de marzo de, 2017 En mejor tarde de lo que nunca noticias, Java 8 ahora incluye una clase base 64 de codificación/decodificación, java.util.Base64

4

esto es cómo se puede generar un par de claves pública y privada a continuación es la función para almacenarlos en disco duro

enter code here 
public static void GenerateKeyPair() 
{  
    try{ 
     KeyPairGenerator kpg = KeyPairGenerator.getInstance("RSA"); 
     kpg.initialize(2048); 
     KeyPair kp = kpg.genKeyPair(); 

     KeyFactory fact = KeyFactory.getInstance("RSA"); 
     RSAPublicKeySpec pub = fact.getKeySpec(kp.getPublic(), 
      RSAPublicKeySpec.class); 
     RSAPrivateKeySpec priv = fact.getKeySpec(kp.getPrivate(), 
      RSAPrivateKeySpec.class); 

     saveToFile("public.key", pub.getModulus(), 
        pub.getPublicExponent()); 
     saveToFile("private.key", priv.getModulus(), 
        priv.getPrivateExponent()); 
    }catch(Exception e){ 
     System.out.println(e.getMessage()); 
    } 
} 

public static void saveToFile(String fileName, 
    BigInteger mod, BigInteger exp) throws Exception { 
    ObjectOutputStream oout = new ObjectOutputStream(
    new BufferedOutputStream(new FileOutputStream(fileName))); 
    try { 
    oout.writeObject(mod); 
    oout.writeObject(exp); 
    } catch (Exception e) { 
    throw new Exception("error", e); 
    } finally { 
    oout.close(); 
    } 
} 
Cuestiones relacionadas