gpt4 book ai didi

EC 公钥/私钥的文件格式?

转载 作者:行者123 更新时间:2023-12-02 10:25:10 30 4
gpt4 key购买 nike

如果我想将私钥和公钥存储在一个文件中,最容易使用的格式是什么?特别是如果我打算使用 Java 的 BouncyCaSTLe 库?

最佳答案

从理论上来看,公钥可以从私钥重新计算出来(计算成本略低于生成单个 ECDSA 签名的成本,或者做 ECDH 的一半,所以速度很快)。因此,从概念上讲,您只需要存储私钥,其标准格式是 PKCS#8 ,Java 通过 java.security.spec.PKCS8EncodedKeySpec 支持该功能。此外,PKCS#8 格式包括在同一 blob 中选择性地对公钥和私钥进行编码的规定,因此这确实看起来像您正在寻找的内容。

然而,棘手的事情是说服加密提供商(例如 BouncyCaSTLe)提取公钥和/或重新计算它。显然,如果您从 PKCS#8 编码的 EC 私钥(也包含公钥)创建 PKCS8EncodedKeySpec,BouncyCaSTLe 将很友好地在内部保留编码公钥的副本并将其写回如果您决定以 PKCS#8 格式重新编码私钥。然而,它并没有做任何其他事情。它将它作为一个不透明的 Blob 来处理。

因此您必须重新计算公钥。通过 JCE 和 BouncyCaSTLe API 以及未实现的部分,我发现了以下内容,它似乎可以工作(JDK 1.6.0_24,BouncyCaSTLe 1.46):

import java.security.KeyFactory;
import java.security.PrivateKey;
import java.security.PublicKey;
import java.security.Provider;
import java.security.spec.PKCS8EncodedKeySpec;
import org.bouncycastle.jce.provider.BouncyCastleProvider;
import org.bouncycastle.jce.provider.JCEECPrivateKey;
import org.bouncycastle.jce.provider.JCEECPublicKey;
import org.bouncycastle.jce.spec.ECParameterSpec;
import org.bouncycastle.jce.spec.ECPublicKeySpec;

// Create the provider and an appropriate key factory.
Provider pp = new BouncyCastleProvider();
KeyFactory kf = KeyFactory.getInstance("EC", pp);

// Decode the private key (read as a byte[] called 'buf').
PKCS8EncodedKeySpec ks = new PKCS8EncodedKeySpec(buf);
PrivateKey sk = kf.generatePrivate(ks);

// Recompute public key.
JCEECPrivateKey priv = (JCEECPrivateKey)sk;
ECParameterSpec params = priv.getParameters();
ECPublicKeySpec pubKS = new ECPublicKeySpec(
params.getG().multiply(priv.getD()), params);
PublicKey pk = kf.generatePublic(pubKS);

// To reencode the private key.
buf = kf.getKeySpec(sk, PKCS8EncodedKeySpec.class).getEncoded();

从概念上讲,我应该将 kf.getkeySpec()org.bouncycaSTLe.jce.spec.ECPrivateKeySpec 结合使用,而不是将私钥无情地转换为 JCEECPrivateKey 类,但 clean 方法似乎尚未在 BouncyCaSTLe 中实现。

关于EC 公钥/私钥的文件格式?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5186793/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com