【问题标题】:Problems outsourcing RSA encryption and decryption外包RSA加密和解密的问题
【发布时间】:2013-03-08 06:02:07
【问题描述】:

我遇到了 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

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

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

【问题讨论】:

  • 仅供参考-您的日志记录非常奇怪。您可能只想要一个包含Log.e(TAG, "Error loading key", e);catch (Exception e) 语句,其中TAG 是在别处定义的静态字符串,例如private static final String TAG = MyActivity.class.getName();.
  • 请使用您添加到我现在已删除的答案中的 cmets 编辑您的问题。也许有人可以帮助你。
  • 我解决了。我生成了一个新密钥并将其从原始文件夹加载为输入流。然后我使用 PKCS8EncodedKeySpec 和 X509EncodedKeySpec 类来生成密钥。
  • 发布您的答案,以便关闭。
  • 您可以发布自己问题的答案,然后接受它。在您的答案中提供足够的详细信息可以帮助面临类似问题并通过搜索引擎找到此问题的其他人。

标签: android encryption rsa


【解决方案1】:

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

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

请注意,如果您调用getEncoded,私钥将不会被加密。通常你根本不想传输私钥,如果你这样做了,你应该真正加密它们。您可以使用Cipher.wrapCipher.unwrap 方法来做到这一点。

【讨论】:

    猜你喜欢
    • 2018-09-10
    • 2011-04-11
    • 1970-01-01
    • 2011-01-29
    • 1970-01-01
    • 2012-12-09
    • 1970-01-01
    • 2015-02-27
    相关资源
    最近更新 更多