Search code examples
javaandroidencryptioncross-platformbouncycastle

Diffrence Between Android encryption and normal Java Applications (.jar) encryption


I´ve got a java Server running on my Windows PC and an Android App. These two shall communicate encoded. So i used the "RSA" algorithm to cummunicate on the asymmetric way. But it didnt work so I used Bouncy Castle as my provider. Still same Problem:

java.lang.ClassNotFoundException: com.android.org.bouncycastle.jcajce.provider.asymmetric.rsa.BCRSAPublicKey
at java.net.URLClassLoader$1.run(URLClassLoader.java:372)
at java.net.URLClassLoader$1.run(URLClassLoader.java:361)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(URLClassLoader.java:360)
at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:308)
at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
at java.lang.Class.forName0(Native Method)
at java.lang.Class.forName(Class.java:344)
at java.io.ObjectInputStream.resolveClass(ObjectInputStream.java:626)
at java.io.ObjectInputStream.readNonProxyDesc(ObjectInputStream.java:1613)
at java.io.ObjectInputStream.readClassDesc(ObjectInputStream.java:1518)
at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1774)
at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1351)
at java.io.ObjectInputStream.readObject(ObjectInputStream.java:371)
at ServerRIL_Android.VerschlüsselungRSA.Verschlüsseln(VerschlüsselungRSA.java:194)
at ServerRIL_Android.SchlüsselAust.Register(SchlüsselAust.java:230)
at ServerRIL_Android.Anmeldung.LeseDaten(Anmeldung.java:61)

The server wants to encode some data with the Publickey from the App.

   byte[] verschlüsselt = new byte[0];
    byte[] s = new byte[0];
    try{

    ObjectInputStream inputStream = new ObjectInputStream(new FileInputStream(PUBLIC_KEY_FILE));
    final PublicKey publicKey = (PublicKey) inputStream.readObject();
   s =  encrypt(zuVerschlüsseln, publicKey);
        verschlüsselt = s;
    }
    catch(Exception e)
    {
        System.out.println(e + "-verschlüsseln");
        e.printStackTrace();
    }
    return verschlüsselt;

Does somebody know how to do this ? Im trying to figure this out since one week and didnt find an answer.


Solution

  • You are using serialization, which will only work if your implementations are as good as identical. You should not use serialization, use RSAPublicKey.getEncoded() instead. This should return a more canonical representation of the key, which can be retrieved again using X509EncodedKeySpec and a KeyFactory for "RSA" keys.