当前位置: 首页 > 知识库问答 >
问题:

在Android上获取X.509证书ECDH私钥和公钥(Java/静态编程语言)

萧建木
2023-03-14

我目前正在尝试在我的android应用程序中实现ECDH算法。但我面临一个问题,我想将私钥和公钥存储在Android密钥库中。然而,为了实现这一点,我需要为我的密钥对获取证书。这就是我被困的地方。

我无法获得Android密钥库允许使用的正确证书。

这是我如何生成密钥(精简版)

    val ecParamSpec = ECGenParameterSpec("secp521r1")
    val keyPairGenerator = KeyPairGenerator.getInstance("ECDH", "SC")
    keyPairGenerator.initialize(ecParamSpec, SecureRandom())

    val keyPair = keyPairGenerator.generateKeyPair()

    val privateKey = keyPair.private
    val publicKey = keyPair.public

对于证书,我尝试了这个(使用SHA256WitECDSA)

    val startDate = Calendar.getInstance()
    val endDate = Calendar.getInstance().apply {
        add(Calendar.YEAR, 20)
    }
    val certBuilder = X509v3CertificateBuilder(
        X500Name("CN=MASTERKEY CA Certificate"),
        BigInteger.valueOf(System.currentTimeMillis()),
        startDate.time,
        endDate.time,
        X500Name("DN=MASTERKEY CA Certificate"),
        SubjectPublicKeyInfo.getInstance(keyPair.public.encoded)
    )
    val builder = JcaContentSignerBuilder("SHA256WithECDSA")
    val signer = builder.build(keyPair.private)
    val certBytes = certBuilder.build(signer).encoded
    val certificateFactory = CertificateFactory.getInstance("X.509")

    val certificate = certificateFactory.generateCertificate(ByteArrayInputStream(certBytes)) as X509Certificate

这很容易理解,因为jcacontsignerbuilder算法与KeyPairGenerator不同,所以这不起作用。这就是Android密钥库开始告诉我出了什么问题的地方。

java.lang.IllegalArgumentException: private key algorithm does not match algorithm of public key in end entity certificate (at index 0)

我使用此代码尝试将密钥存储在Android密钥库中

keyStore.setEntry("MASTERKEY", KeyStore.PrivateKeyEntry(key[DH.PRIVATE_KEY] as PrivateKey, arrayOf(key[DH.CERTIFICATE] as Certificate)),
                        KeyProtection.Builder(KeyProperties.PURPOSE_DECRYPT or KeyProperties.PURPOSE_ENCRYPT or KeyProperties.PURPOSE_SIGN).setDigests(KeyProperties.DIGEST_SHA256, KeyProperties.DIGEST_SHA512)
                            .build())

如果你问的话,我用的是海绵城堡。

如果有人能帮助我,我将不胜感激!谢谢大家。

共有1个答案

赵嘉赐
2023-03-14

好的,我解决这个问题的方法是将加密的私钥保存在sharedpref中。我知道这不是最好的,但我用Android密钥库处理的AES密钥对其进行了加密。除非AES被破解,否则没有密钥就无法解密。

 类似资料:
  • 问题内容: 我正在寻找一个Java库或代码来即时生成证书,公共和私有密钥,而无需使用第三方程序(例如openssl)。 我认为是从Java代码中获取keytool + openssl的东西。 考虑使用ssl和客户端身份验证保护的基于Java servlet的Web应用程序。我希望Servlet容器仅在请求时使用Java代码生成客户端证书(例如pkcs12格式)。 问题答案: 您可以使用一对或密钥在

  • 本文向大家介绍获取Android签名证书的公钥和私钥的简单实例,包括了获取Android签名证书的公钥和私钥的简单实例的使用技巧和注意事项,需要的朋友参考一下 本文以Android签名JKS格式的证书为例: 以上这篇获取Android签名证书的公钥和私钥的简单实例就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持呐喊教程。

  • 我有这样的代码来导入一个ECDH键: 这是可行的,但是它只返回私钥,而不是整个密钥对。如何从私钥中导出公钥?

  • 问题内容: 我在配置中有这个: 我有一对X.509证书和一个密钥文件。 如何导入这两个以便在SSL和连接器中使用它们?我可以用google搜索的所有示例始终都会自己生成密钥,但是我已经有了密钥。 我试过了 但这只会导入证书而不是密钥文件,并导致 我已经尝试连接证书和密钥,但是得到了相同的结果。 如何导入密钥? 问题答案: 我使用了以下两个步骤,这些步骤是在其他答案中链接的评论/帖子中找到的: 第一

  • 问题内容: 我记得很久以前使用OpenSSL进行过此操作,但是我想知道是否可行以及如何进行,我从未在Java上使用过密码学。 问题答案: 您不能直接从另一个生成任何一个密钥。从数学上讲这是不可能的。如果你有一个含有密钥团 两者 的公钥和私钥,你可以提取它们的相对轻松的任何一个。 编辑,2017年: 多年之后,人们对加密技术有了更深入的了解,现在我很清楚这个答案并不正确。 引用维基百科: 公用密钥由

  • 本文向大家介绍Android 获取签名公钥和公钥私钥加解密的方法(推荐),包括了Android 获取签名公钥和公钥私钥加解密的方法(推荐)的使用技巧和注意事项,需要的朋友参考一下 如下所示: 以上这篇Android 获取签名公钥和公钥私钥加解密的方法(推荐)就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持呐喊教程。