gpt4 book ai didi

java - 从字符串创建 ECPublicKey

转载 作者:太空宇宙 更新时间:2023-11-04 09:43:08 25 4
gpt4 key购买 nike

我有一个普通的字符串,我使用 Java util 中的 Base64 类对其进行编码,并将其传递到 ECPublicKey 构造函数中,但它不起作用。我们是否必须以其他格式进行编码才能将其传递到 ECPublicKey 构造函数中?

我也尝试过创建 keyfactory 方法,如下所示,编码 obj 是 Base64 编码的字符串

byte[] keyBytesPublic = Base64.getDecoder().decode(encodingObj);

X509EncodedKeySpec specPublic = new X509EncodedKeySpec(keyBytesPublic);

KeyFactory keyFactory = KeyFactory.getInstance("EC");
ECPublicKey public_key12 = (ECPublicKey) keyFactory.generatePublic(specPublic);

String obj = "{ "+
"hello world "+
"}";

byte[] encodingObj = Base64.getEncoder().encode(obj.getBytes());
byte[] keyBytesPublic = Base64.getDecoder().decode(encodingObj);

首先尝试从 key 工厂生成

X509EncodedKeySpec specPublic = new X509EncodedKeySpec(keyBytesPublic);
KeyFactory keyFactory = KeyFactory.getInstance("EC");
ECPublicKey public_key12 = (ECPublicKey) keyFactory.generatePublic(specPublic);
PublicKey publicKey = keyFactory.generatePublic(specPublic);

或者如果我直接在构造函数中传递编码 obj

ECPublicKey publicKey1 = new ECPublicKeyImpl(encodingObj);

最佳答案

该格式称为 SubjectPublicKeyInfo,它是 X.509 规范的一部分。它是 ASN.1 编码结构,还包括 key 类型。在内部,您将有一个编码公钥的 X9.63 结构。在其中,您可以选择命名曲线(其中使用 OID 标识曲线参数)或指定公共(public)点 W 的所有参数以及未压缩或压缩点的曲线。

例如,您可以看到一个使用带有 OID 和未压缩公共(public)点 in this other question I answered 的命名曲线的示例。 :

> openssl asn1parse -i -in ecpub.der -inform DER -dump
0:d=0 hl=2 l= 89 cons: SEQUENCE
2:d=1 hl=2 l= 19 cons: SEQUENCE
4:d=2 hl=2 l= 7 prim: OBJECT :id-ecPublicKey
13:d=2 hl=2 l= 8 prim: OBJECT :prime256v1
23:d=1 hl=2 l= 66 prim: BIT STRING
0000 - 00 04 d0 ee 64 61 7b 90-48 a2 a9 5f b5 a3 da 67 ....da{.H.._...g
0010 - 53 56 91 e0 cf 5b b8 85-3e 05 0c b9 e6 95 c3 8d SV...[..>.......
0020 - 26 ab d7 ee 47 94 38 61-1e cd 07 e6 90 0b 3d 4a &...G.8a......=J
0030 - 6a df c5 d5 9f f3 11 91-53 00 ff 0e 91 93 49 44 j.......S.....ID
0040 - 4c 58

请注意,我更改了该行以使用 DER,因为这是 Java 所期望的。 Java 的公共(public) API 中不包含 PEM 解析器,您必须使用例如充气城堡为此。

<小时/>

您不应使用 key 工厂从头开始生成 key , key 是公钥/私钥的一部分。要创建这样的编码,您可以使用以下代码(如果需要字符串,则包括 base64):

KeyPairGenerator kpg = KeyPairGenerator.getInstance("EC");
kpg.initialize(new ECGenParameterSpec("secp256r1"));
KeyPair kp = kpg.generateKeyPair();
ECPublicKey publicKey = (ECPublicKey) kp.getPublic();
System.out.println("Encoding format: " + publicKey.getFormat());
byte[] derEncoded = publicKey.getEncoded();
// base64 encoded is what you get for PEM, between the header and footer lines
String base64DEREncoded = Base64.getEncoder().encodeToString(derEncoded);
System.out.println("Base64 SubjectPublicKeyInfo: " + base64DEREncoded);

结果:

Encoding format: X.509
Base64 SubjectPublicKeyInfo: MFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEDA0qMRpJwaJyJ4YDciMqWefvr/mwYvF1fKnblJl5DOqAh5XUXkdWvYRDTTs9hPoHfPaNWWC9I0hOGb6+JPNxVw==
<小时/>

当然,您通常也希望将私钥存储在安全的地方,例如在 keystore 中。

关于java - 从字符串创建 ECPublicKey,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55744092/

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