ASN.1 编码 routines:OPENSSL_internal:HEADER_TOO_LONG

ASN.1 encoding routines:OPENSSL_internal:HEADER_TOO_LONG

我在 Kotlin 中从字节数组构建私钥时遇到问题(使用 Android Studio)

我必须加载我定义的私钥,如下所示。 据我所知,这个 EC 私钥长 32 个字节,对应于 secp256r1 曲线

0x3C, 0x6D, etc... (this have 32 in total)

这是我拥有的:

val privateKeyArray = arrayOf(0x3C, 0x6D, etc...) //this have 32 size

然后我尝试将其转换为 byteArray:

val privateKeyBytes = privateKeyArray.map { it.toByte() }.toByteArray())

然后我想用它签署一些数据:

val keyFactory = KeyFactory.getInstance("EC")
val privateKey = keyFactory.generatePrivate(PKCS8EncodedKeySpec(privateKeyBytes))  //THIS line gives the Exception

val content = "random string".toByteArray()
val signer = Signature.getInstance("SHA256withECDSA")
signer.initSign(privateKey)
signer.update(content)
val signature = signer.sign()

但是,当我尝试从 keyFactory 生成私钥时,出现以下异常:

java.security.spec.InvalidKeySpecException: java.lang.RuntimeException: error:0c000079:ASN.1 encoding routines:OPENSSL_internal:HEADER_TOO_LONG at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2927)

在这种情况下如何正确读取私钥?

我用的是BouncyCastle作为安全提供者,你也可以试试。 看起来您使用的规范是 secp256r1。在这种情况下,请尝试使用以下代码从表示密钥的字节数组中重新生成 PrivateKey 对象。请记住,字节数组只是 Java 中的一个 BigInteger。

让我知道它是否有效。

public PrivateKey generatePrivateKey(byte[] keyBin) throws InvalidKeySpecException, NoSuchAlgorithmException {
    ECNamedCurveParameterSpec spec = ECNamedCurveTable.getParameterSpec("secp256r1");
    KeyFactory kf = KeyFactory.getInstance("ECDSA", new BouncyCastleProvider());
    ECNamedCurveSpec params = new ECNamedCurveSpec("secp256r1", spec.getCurve(), spec.getG(), spec.getN());
    ECPrivateKeySpec privKeySpec = new ECPrivateKeySpec(new BigInteger(keyBin), params);
    return kf.generatePrivate(privKeySpec);
}