4
votes

I'm trying to generate an RSA public key in the form of PKCS#1 in Android.

There is almost an exact duplicate of this question here: Generating RSA keys in PKCS#1 format in Java

The author never responded with an answer though. I went through the answers, but I haven't been able to find something that works. I've come to the conclusion (unless someone else has a different answer) that it must be done using Bouncy Castle. The only problem I'm having with bouncy castle is actually using it in Android. I "seem" to have imported the jar correctly (I say "seem" because I've never done it before, but it was a fairly painless process and I get no errors in Eclipse) but, then I get an error in log cat.

03-25 22:25:58.780: E/AndroidRuntime(9171): java.lang.NoClassDefFoundError: org.bouncycastle.jce.provider.BouncyCastleProvider
1
It is tricky to use BouncyCastle in Android as Android already uses a mangled BouncyCastle internally. SpongyCastle (google.com.au/…) was created for this reasons and works quite well for me (though I haven't tried your case)Carsten

1 Answers

5
votes

Two possible answers.

If you want to go the way you're going, try this to resolve the NoClassDefFoundError. android eclipse updated and now app crashes when it trys to run

You can also use JSch instead. I have this working reliably on android myself. RSA Encryption forceclosing before generating public/private keys

Edit: Here's an example of using JSch to generate RSA-type keypairs. I think it's PKCS#1, but I'm not familiar enough with the standard. The relevant javadoc is what I'm going off of.

/**
 * Load or generate a RSA keypair to use as a client for the given JSch.
 */
public boolean registerKeyPair(JSch jSch) {             
    new File(getRootFolder().getAbsolutePath() + "/.ssh").mkdirs();

    File privateKey = new File(getRootFolder().getAbsolutePath() + "/.ssh/id_rsa");
    File publicKey = new File(getRootFolder().getAbsolutePath() + "/.ssh/id_rsa.pub");
    if (!privateKey.exists() || !publicKey.exists()) {          
        try {
            KeyPair keyPair = KeyPair.genKeyPair(jSch, KeyPair.RSA);
            keyPair.writePrivateKey(privateKey.getAbsolutePath());
            keyPair.writePublicKey(publicKey.getAbsolutePath(), "Machine Shop");
            return true;
        } catch (JSchException e) {
            Log.e("genKeyPair(RSA)", Log.getStackTraceString(e));
        } catch (FileNotFoundException e) {
            Log.e("genKeyPair(RSA)", Log.getStackTraceString(e));
        } catch (IOException e) {
            Log.e("genKeyPair(RSA)", Log.getStackTraceString(e));
        }
        return false;           
    }       

    try {
        jSch.addIdentity(privateKey.getAbsolutePath());
        return true;
    } catch (JSchException e) {
        Log.w("jSch.addIdentity", Log.getStackTraceString(e));
        return false;           
    }

}

Edit: Assuming Eclipse. Include the JSch jar file in your build path, preferably as a local jar (say in a lib folder). Make sure to check it on the "Order and Export" tab.

Now refresh your project.