【问题标题】:Generating RSA keys in Android in PKCS#1 format in Android在 Android 中以 PKCS#1 格式在 Android 中生成 RSA 密钥
【发布时间】:2012-04-09 14:09:24
【问题描述】:

我正在尝试在 Android 中以 PKCS#1 的形式生成 RSA 公钥。

这里几乎有一个完全相同的问题:Generating RSA keys in PKCS#1 format in Java

尽管作者从未给出答案。我浏览了答案,但我找不到有效的东西。我得出的结论是(除非其他人有不同的答案)必须使用 Bouncy Castle 来完成。我对充气城堡的唯一问题实际上是在 Android 中使用它。我“似乎”正确导入了 jar(我说“似乎”是因为我以前从未做过,但这是一个相当轻松的过程,我在 Eclipse 中没有错误)但是,然后我在 log cat 中收到错误.

03-25 22:25:58.780: E/AndroidRuntime(9171): java.lang.NoClassDefFoundError: org.bouncycastle.jce.provider.BouncyCastleProvider

【问题讨论】:

  • 在 Android 中使用 BouncyCastle 很棘手,因为 Android 已经在内部使用了损坏的 BouncyCastle。 SpongyCastle (google.com.au/…) 就是出于这个原因而创建的,并且对我来说效果很好(尽管我没有尝试过你的情况)

标签: java android rsa bouncycastle logcat


【解决方案1】:

两个可能的答案。

如果您想按照自己的方式前进,请尝试使用此方法解决NoClassDefFoundErrorandroid eclipse updated and now app crashes when it trys to run

您也可以改用 JSch。我自己在android上可靠地工作。 RSA Encryption forceclosing before generating public/private keys

编辑: 下面是一个使用 JSch 生成 RSA 类型密钥对的示例。我认为这是 PKCS#1,但我对标准还不够熟悉。 relevant javadoc 是我要离开的地方。

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

}

编辑:假设 Eclipse。在您的构建路径中包含JSch jar file,最好是作为本地jar(例如在lib 文件夹中)。请务必在“订购和导出”选项卡上进行检查。

现在刷新您的项目。

【讨论】:

  • 我想我会追查 BouncyCastle 错误,但是,jcraft.com/jsch 似乎没有提到任何关于 PKCS#1 的内容,还是我只是忽略了它?
  • 我相信确实如此,但这只是从这个角度来看:epaul.github.com/jsch-documentation/javadoc/com/jcraft/jsch/…。无论哪种情况,我都用一个例子更新了我的答案。如果不是 PKCS#1,请告诉我,我会更新它!
  • 抱歉,老实说,我不知道如何将 Jsch “导入”到我的应用程序中。一点帮助?
  • getRootFolder() 方法导致错误。其他一切都很好。我必须将其保存为文件吗?
猜你喜欢
  • 2011-11-28
  • 2020-09-16
  • 2020-06-13
  • 1970-01-01
  • 2018-08-04
  • 2014-08-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多