Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/shell/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Encryption 在Android(Java/Kotlin)上获取X.509证书ECDH私钥和公钥_Encryption_Kotlin_Cryptography_Certificate_Diffie Hellman - Fatal编程技术网

Encryption 在Android(Java/Kotlin)上获取X.509证书ECDH私钥和公钥

Encryption 在Android(Java/Kotlin)上获取X.509证书ECDH私钥和公钥,encryption,kotlin,cryptography,certificate,diffie-hellman,Encryption,Kotlin,Cryptography,Certificate,Diffie Hellman,我目前正在尝试在我的android应用程序中实现ECDH算法。 但我面临一个问题,我想将私钥和公钥存储在Android密钥库中。然而,为了实现这一点,我需要为我的密钥对获得一个证书。这就是我被困的地方 我无法获得Android密钥库允许使用的正确证书 下面是我如何生成密钥(精简版) 对于证书,我尝试了这个(使用SHA256和ECDSA) 这是很容易理解的,因为JcaContentSignerBuilder算法与KeyPairGenerator算法不同,所以它不起作用。这就是安卓密钥库开始告诉我出

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

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

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

对于证书,我尝试了这个(使用SHA256和ECDSA)

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

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())
如果你问的话,我用的是海绵城堡

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

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

好的,所以我解决这个问题的方法是将加密的私钥保存在sharedpref中。我知道这不是最好的,但我已经用安卓密钥库处理的AES密钥对其进行了加密。除非AES被破解,否则在没有密钥的情况下无法解密。能否尝试为密钥对生成器指定
“EC”
或甚至
“ECDSA”
?因为这些密钥是相同的,但适用于算法规范。然后您可以获得私钥,希望它仍然适用于您的密钥协议。您也可以创建一个双证书链,在其中创建一个ECDH证书并使用基于ECDSA的自签名证书对其进行签名,但这似乎需要更多的工作,而且我不知道cert builder是否支持基于ECDH的证书。可用于ECDSA和ECDH算法的密钥(对)类型EC对于BouncyCastle(以及SunEC)绝对正确在JavaSE中。通常,ECDH证书的最佳实践是将KeyUsage扩展设置为允许keyAgree和禁止digSign,但如果您从未共享此证书,则无所谓。自签名证书应具有issuer=subject,但您在其中一个证书中使用了CN(这是常见的),在另一个证书中使用了DN(这是不同的,非常罕见的)。您是否可以尝试为密钥对生成器指定
“EC”
,甚至
“ECDSA”
?因为这些密钥是相同的,但适用于算法规范。然后您可以获得私钥,希望它仍然适用于您的密钥协议。您也可以创建一个双证书链,在其中创建一个ECDH证书并使用基于ECDSA的自签名证书对其进行签名,但这似乎需要更多的工作,而且我不知道cert builder是否支持基于ECDH的证书。可用于ECDSA和ECDH算法的密钥(对)类型EC对于BouncyCastle(以及SunEC)绝对正确在JavaSE中。通常,ECDH证书的最佳实践是将KeyUsage扩展设置为允许keyAgree和禁止digSign,但如果您从未共享此证书,则无所谓。自签名证书应具有issuer=subject,但您在其中一个证书中使用了CN(这是常见的),在另一个证书中使用了DN(这是不同的,非常罕见的)。请注意,仅使用AES(分组密码)并不意味着整个解决方案本身是安全的。平台上AES的实现可能存在问题,或者您设计的协议可能不安全。我并不是说它是安全的,但常见的“AES因此安全”参数不一定成立,而且通常不成立。请注意,仅使用AES(分组密码)并不意味着整个解决方案本身就是安全的。平台上AES的实现可能存在问题,或者您设计的协议可能不安全。我并不是说它是,但常见的“AES因此安全”论点不一定成立,而且常常不成立。
java.lang.IllegalArgumentException: private key algorithm does not match algorithm of public key in end entity certificate (at index 0)
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())