代码之家  ›  专栏  ›  技术社区  ›  K.Os

ASN.1编码例程:OPENSSL\u内部:头\u太长

  •  0
  • K.Os  · 技术社区  · 5 年前

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

    我必须加载我定义的私钥,如下所示。

    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时,我遇到以下异常:

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

    1 回复  |  直到 5 年前
        1
  •  2
  •   linehrr    5 年前

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

    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);
    }