2010-06-02 29 views
10

Come eseguire la crittografia RSA dell'array di byte con la chiave pubblica codificata in base 64?Codifica RSA con chiave pubblica codificata Base64 in Android

Dopo aver letto la coppia di articoli (di Google Search) su come fare la crittografia RSA in Java, ha trovato il seguente frammento

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

Ho chiave pubblica come una stringa base64 codificato (126 caratteri), Come creo "PublicKey" con la stringa codificata e lo uso con Cipher.

+0

Come possiamo sapere cosa è contenuto nella stringa codificata in base64? È probabilmente un modulo e un esponente pubblico, ma quale forma? * Probabilmente * la codifica DER di X509EncodedKeySpec. –

risposta

8

La stringa base64 è probabilmente un X509EncodedKeySpec. Posso solo indovinare. In tal caso, dovresti decodificare in base64 la stringa per ottenere un valore byte []. Quindi creare un X509EncodedKeySpec da questo byte []. Quindi creare un'istanza di RSA KeyFactory e utilizzare il metodo generatePublic() di questo KeyFactory per ottenere uno PublicKey. Questa chiave pubblica può essere passata a Cipher.init().

Nota: per eseguire la decodifica base64 utilizzare apache commons codec o the Harder base64 decoder.

UPDATE 8 mar 2017: In meglio-tardi-che-mai notizia, Java 8 include ora una classe di codifica Base64/decodifica, java.util.Base64

4

in questo modo è possibile generare coppia di chiavi pubblica e privata sotto è la funzione per memorizzarli sul disco rigido

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(); 
    } 
} 
Problemi correlati