首页 > 解决方案 > Android Keystore EDCSA (secp256r1) 公钥始终无效

问题描述

我目前正在尝试使用 Android 密钥库创建 EDCSA 密钥对。创建工作正常,但将密钥发送到后端时,我收到“无效的 EDCSA 密钥”。我对后端实现一无所知。

网站:https ://kjur.github.io/jsrsasign/sample/sample-ecdsa.html

还将创建的密钥标记为具有无效签名。

我的代码如下:

val keyPairGenerator = KeyPairGenerator.getInstance(KeyProperties.KEY_ALGORITHM_EC, "AndroidKeyStore")
    keyPairGenerator.initialize(
        KeyGenParameterSpec.Builder(
                "key4",
        KeyProperties.PURPOSE_SIGN)
        .setAlgorithmParameterSpec(ECGenParameterSpec("secp256r1"))
        .setDigests(KeyProperties.DIGEST_SHA256)
        .setUserAuthenticationRequired(false)
        .build())
    val keyPair = keyPairGenerator.generateKeyPair()
    val p = KeyFactory.getInstance(keyPair.public.getAlgorithm()).generatePublic(
        X509EncodedKeySpec(keyPair.public.getEncoded()))
    hexPublic = Hex.toHexString(p.encoded)

导致例如:

Public-Key: (256 bit)
00000000  04 6e 33 8a 49 1a 96 de  e8 b6 53 a7 b6 4a df 33  |.n3.I.....S..J.3|
00000010  b5 23 ce 92 2d 39 2e a2  f0 cc 19 ec 54 cf ad d7  |.#..-9......T...|
00000020  6e e1 ce 78 c7 61 c4 01  f4 7b 64 2a a4 32 03 4b  |n..x.a...{d*.2.K|
00000030  8d 29 e4 8f 16 6e d6 82  ce bf 07 b9 30 97 15 ff  |.)...n......0...|
00000040  d1                                                |.|

从上面编码的结果是:

3059301306072a8648ce3d020106082a8648ce3d030107034200046e338a491a96dee8b653a7b64adf33b523ce922d392ea2f0cc19ec54cfadd76ee1ce78c761c401f47b642aa432034b8d29e48f166ed682cebf07b9309715ffd1

经过初步搜索,我发现了以下内容:

KeyFactory.getInstance(keyPair.public.getAlgorithm()).generatePublic(X509EncodedKeySpec(keyPair.public.getEncoded()))

从我的密钥中删除不必要的填充。

但关键看起来仍然与网站创建的示例不同:

04d8888078160aa934ace1745efb1d00ddec4a0e73ea93931902784c57c6ac604df3898241c1925e42907419d6d0ce5956d4109964608749aedc69e1e532c018c9

上面的公钥内容(未编码)似乎具有正确的格式,但是在网站上尝试时,它仍然被标记为无效签名。

我不确定如何从密钥中获取正确的值,我很高兴得到任何指示和/或帮助。

pS 试过:如何生成有效的 ECDSA EC 密钥对?

这也不起作用。

更新 发现我们需要一个 ASIN 9.63 密钥格式才能使其与后端一起使用

先感谢您

标签: androidandroid-keystore

解决方案


推荐阅读