2010-06-02 5 views
10

Comment procéder au cryptage RSA d'un tableau d'octets avec une clé publique codée en base 64?Cryptage RSA avec clé publique codée en base64 dans Android

Après avoir lu le couple d'articles (de recherche Google) sur la façon de chiffrement RSA en Java, a trouvé l'extrait suivant

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

J'ai la clé publique comme une chaîne codée base64 (126 caractères), Comment puis-je créer 'PublicKey' avec la chaîne encodée et l'utiliser avec Cipher.

+0

Comment pouvons-nous savoir ce qui est contenu dans votre chaîne encodée en base64? C'est probablement un module et un exposant public, mais sous quelle forme? * Probablement * le codage DER d'un X509EncodedKeySpec. –

Répondre

8

Votre chaîne base64 est peut-être un X509EncodedKeySpec. Je peux seulement deviner. Si c'est le cas, vous devriez base64 décoder la chaîne pour obtenir un byte []. Puis construisez un X509EncodedKeySpec à partir de ce byte []. Créez ensuite une instance d'un RSA KeyFactory et utilisez la méthode generatePublic() de cette KeyFactory pour obtenir un PublicKey. Cette clé publique peut ensuite être transmise à Cipher.init(). Remarque: pour effectuer un décodage en base64, utilisez le apache commons codec ou le the Harder base64 decoder.

MISE À JOUR 8 Mars 2017 En meilleure fin-que-jamais nouvelles, Java 8 inclut désormais une classe Base64/décodage, java.util.Base64

4

c'est comment vous pouvez créer une paire de clés publique et privée ci-dessous est la fonction pour les stocker sur dur dist

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(); 
    } 
} 
Questions connexes