4

我对 RSA 加密和解密有疑问。我正在用 android 开发,想外包 RSA 加密和解密。在我尝试外包之前,我的源代码运行良好。

我创建了一个私钥和公钥并将其保存为 private.key 和 public.key。错误是由此方法引起的 ClassNotFoundException:

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

我查看了 logcat 并收到了以下错误消息:

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

我希望你能理解我的问题,因为英语不是我的母语。

编辑:我发现问题不是由外包代码引起的。所以我想这个话题可以标记为已解决。

4

1 回答 1

0

RSAPublicKey并且RSAPrivateKey是接口。当您获得 a 时,Key您实际上会收到此接口的加密提供者的实现。这些提供程序因不同的 Java 平台而异(尽管至少在官方上,Android/Dalvik 甚至不是 Java 平台)。因此,除非您在同一个平台上工作,否则您永远不应该期望序列化能够工作。

然而,有一些方法可以在 Java 中序列化公钥和私钥;该Key接口包含getEncoded()返回密钥最常见二进制编码的方法。在这种情况下,RSAPublicKey是 X5.09 SubjectKeyIdentifier 中的 PKCS#1 编码。在这种情况下,RSAPrivateKey内部PKCS #8 编码包裹在 PKCS#1 定义的结构周围。这些可以使用X509EncodedKeySpec和表示,PKCS8EncodedKeySpec并使用 RSA 转换回密钥KeyFactory

请注意,如果调用getEncoded. 通常你根本不想传输私钥,如果你这样做了,你应该真正加密它们。您可以使用Cipher.wrapandCipher.unwrap方法执行此操作。

于 2015-09-01T08:59:27.770 回答