Outsourcing Issues for RSA Encryption and Decryption

I have a problem with RSA encryption and decryption. I am developing in android and would like to get outsourced RSA encryption and decryption. My source code worked well before I tried to outsource it.

I created a private key and a public key and saved it as private.key and public.key. The error is a ClassNotFoundException exception thrown by this method:

public Key getPrivateKey(){ try { InputStream fis = activity.getResources().openRawResource(R.raw.private); ObjectInputStream ois = new ObjectInputStream(fis); Key RSAprivateKey = (Key)ois.readObject(); return RSAprivateKey; } catch (FileNotFoundException e) { Log.e("FileNotFound","FileNotFound"); e.printStackTrace(); } catch (IOException e) { Log.e("IOEXception","IOEXception"); e.printStackTrace(); } catch (ClassNotFoundException e) { Log.e("ClassNotFound","ClassNotFound"); Log.e("Errro", "Error: "+ e.getMessage()); Log.e("error", e.toString()); e.printStackTrace(); } return null; } 

I looked at logcat and received this error message:

 E/ClassNotFound(1205): ClassNotFound 03-19 13:54:52.176: E/Errro(1205): Error: com.android.org.bouncycastle.jce.provider.JCERSAPrivateCrtKey 03-19 13:54:52.176: E/error(1205): java.lang.ClassNotFoundException: com.android.org.bouncycastle.jce.provider.JCERSAPrivateCrtKey 

I hope you understand my problem, because English is not my native language.

Edit: I found out that the problem is not related to code outsourcing. Therefore, I think that the topic can be marked as resolved.

+4
source share
1 answer

RSAPublicKey and RSAPrivateKey are interfaces. When you get a Key , you actually get a cryptographic provider implementation of this interface. These providers vary across Java platforms (although, at least officially, Android / Dalvik is not even a Java platform). Therefore, you should not expect serialization to work if you are not working on the same platform.

However, there are ways to serialize public and private keys in Java; The Key interface contains the getEncoded() method, which returns the most common binary key encoding. In the case of RSAPublicKey this is PKCS # 1 encoding in X5.09 SubjectKeyIdentifier. In the case of RSAPrivateKey this is PKCS # 8 internal encoding wrapped around a specific PKCS # 1 structure. They can be represented using X509EncodedKeySpec and PKCS8EncodedKeySpec and converted back to keys using RSA KeyFactory .

Note that the private key will not be encrypted if you call getEncoded . Usually you do not want to transfer private keys at all, and if you do, you really need to encrypt them. You can do this using the Cipher.wrap and Cipher.unwrap .

0
source

All Articles