如何从 32 字节原始私钥中获取 java.security.PrivateKey ? (Secp256k1 算法)

Posted

技术标签:

【中文标题】如何从 32 字节原始私钥中获取 java.security.PrivateKey ? (Secp256k1 算法)【英文标题】:How can I get java.security.PrivateKey from 32 byte raw private key ? (Secp256k1 Algorithm) 【发布时间】:2019-11-27 01:18:21 【问题描述】:

我正在尝试从使用 getS() 方法获得的 32 字节原始私钥中获取 PrivateKey 对象。我在充气城堡库中使用了 ECDSA secp256k1 算法来生成密钥对。

下面是我在字节数组中获取 32 字节私钥的方式,我想反转这个过程以从 32 字节私钥中获取 PrivateKey 对象。

谁能帮我解决这个问题?我真的很感激。

PrivateKey prvKey;

public byte[] getPrivateKey() 
        ECPrivateKey ecPrv = (ECPrivateKey) this.prvKey;
        byte[] prv = ecPrv.getS().toByteArray();
        if (prv[0] == 0) 
            byte[] rslt = new byte[prv.length - 1];
            System.arraycopy(prv, 1, rslt, 0, prv.length - 1);
            return rslt;
         else 
            return prv;
        
    

【问题讨论】:

【参考方案1】:

我找到了我的问题的答案。 我使用编码的私钥作为以下方法的参数。 以防万一有人还在寻找答案……

private PrivateKey generatePrivateKey(byte[] encodedPrivateKey)
            throws NoSuchAlgorithmException, InvalidKeySpecException 
        Security.addProvider(new BouncyCastleProvider());
        KeyFactory keyFactory = KeyFactory.getInstance(KEY_FACTORY_ALGORITHM);
        return keyFactory.generatePrivate(new PKCS8EncodedKeySpec(encodedPrivateKey));
    

【讨论】:

更好的答案是包含进行实际编码的代码。

以上是关于如何从 32 字节原始私钥中获取 java.security.PrivateKey ? (Secp256k1 算法)的主要内容,如果未能解决你的问题,请参考以下文章

如何获取 PCCERT_CONTEXT 的私钥的 NCRYPT_KEY_HANDLE?

如何通过 PKCS#11 API 从 eToken 获取私钥?

在 java/scala 中生成 ecdsa 32 字节私钥

如何从 OpenSSL 中的 ECDSA 私钥获取公钥?

从原始文件中获取最多 x 个字节的 AudioInputStream(剪切音频文件)

密码技术--椭圆曲线EDCSA数字签名及Go语言应用