android - ASN.1编码例程: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 生成 privateKey 时,出现以下异常:
java.security.spec.InvalidKeySpecException: java.lang.RuntimeException: 错误:0c000079:ASN.1 编码例程: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);
}
推荐阅读
- java - 相同的连接字符串在 sqldeveloper 中工作正常,但是从独立的 JDBC 程序抛出 IO 异常
- amazon-web-services - 我们在 AWS AppConfig 应用程序中创建的配置数量是否有限制?
- c# - 使用 Windows 应用程序授予对文件夹的读取和写入权限
- c# - 如何访问 CurseForge 的 API?
- android - 使用Frida在android上的BruteForce登录方法
- r - 如何添加以字符变量为条件的 geom_text?
- shader - 在像素着色器 (DirectX11) 中无法正确访问纹理
- python - 更改 jupyter notebook 中单个 *output* 单元格的颜色?
- python - 如何在不使用 selenium 的情况下使用 Beautifulsoup 或 Python 处理 Preloader?
- python - 如何在不使用导入 csv 和 panda 等不同模块的情况下从 python 打开 csv excel 文件