在Android中以PKCS#1格式生成RSA密钥

4
我正在尝试在Android中以PKCS#1的形式生成RSA公钥。
这里几乎有一个完全相同的问题: 在Java中以PKCS#1格式生成RSA密钥 作者没有回答。我已经查看了答案,但是没有找到有效的解决方法。我得出结论(除非有人有不同的答案),必须使用Bouncy Castle进行操作。我唯一遇到的问题是如何在Android中使用Bouncy Castle。 我“貌似”已经正确导入了jar(我说“貌似”,因为我以前从未做过这样的操作,但这是一个相当简单的过程,而且在Eclipse中没有错误),但是然后我在日志cat中收到一个错误信息。
03-25 22:25:58.780: E/AndroidRuntime(9171): java.lang.NoClassDefFoundError: org.bouncycastle.jce.provider.BouncyCastleProvider

1个回答

5
两个可能的答案。
如果您想继续使用当前方法,可以尝试以下方法来解决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,但我对标准不够熟悉。 我参考了相关的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文件包含在您的构建路径中,最好作为本地jar文件(例如放在lib文件夹中)。确保在“顺序和导出”选项卡上进行检查。
现在刷新您的项目即可。

我认为我将继续追求BouncyCastle的错误,但http://www.jcraft.com/jsch/似乎没有提到PKCS#1,或者我只是忽略了它? - EGHDK
我相信它是的,但这只是从这里看:http://epaul.github.com/jsch-documentation/javadoc/com/jcraft/jsch/KeyPairGenRSA.html。无论哪种情况,我已经更新了我的答案,并提供了一个示例。如果不是PKCS#1,请告诉我,我会进行更新! - sastraxi
getRootFolder()方法出现了错误。其他部分都没问题。我需要将其保存为文件吗? - EGHDK
getRootFolder() 方法来自我类的另一个成员 - 我只是从我的项目中摘取了该方法 :) 如果您查看我在上面发布的 javadoc 链接,您可以浏览并查看其他获取密钥的方式。 - sastraxi
1
让我们在聊天中继续这个讨论:http://chat.stackoverflow.com/rooms/9298/discussion-between-sastraxi-and-eghdk - sastraxi
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接