Java 从字符串创建ECPublicKey

Java 从字符串创建ECPublicKey,java,encryption,cryptography,key,rsa,Java,Encryption,Cryptography,Key,Rsa,我有一个普通字符串,我使用Javautil中的Base64类对其进行编码,并将其传递到ECPublicKey构造函数中,但它不起作用。我们是否必须以其他格式编码才能将其传递到ECPublicKey构造函数中 我也尝试过创建keyfactory方法,如下所示,编码obj是Base64编码字符串 byte[] keyBytesPublic = Base64.getDecoder().decode(encodingObj); X509EncodedKeySpec specPublic = new X

我有一个普通字符串,我使用Javautil中的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);
首先尝试从键fatory生成

X509EncodedKeySpec specPublic = new X509EncodedKeySpec(keyBytesPublic);
KeyFactory keyFactory = KeyFactory.getInstance("EC");
ECPublicKey public_key12 = (ECPublicKey) keyFactory.generatePublic(specPublic);
PublicKey publicKey = keyFactory.generatePublic(specPublic);
或者如果我直接在构造函数中传递编码对象

ECPublicKey publicKey1 = new ECPublicKeyImpl(encodingObj);

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

例如,您可以看到使用带OID的命名曲线和未压缩公共点的示例:

注意,我将行更改为使用DER,因为这正是Java所期望的。Java在公共API中不包含PEM解析器,因此必须使用Bouncy Castle等


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

结果:

编码格式:X.509
Base64主题PublicKeyInfo:MFKwewyhkozizj0Caqyikozizj0DaqcdQgaed0QMrPjwajyj4Ydcimqwefr/MWYVF1FKNBLjl5Doqah5xuxwkdwyRdts9HPOHFPANwC9I0HOGB6+JPNxVw==

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

需要更多详细信息:(1)示例输入字符串,(2)错误消息。更妙的是,有一个。
> 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
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);