Java 如何将十六进制公钥转换为ASN.1 SubjectPublicKeyInfo结构以进行Diffie-Hellman密钥交换?

Java 如何将十六进制公钥转换为ASN.1 SubjectPublicKeyInfo结构以进行Diffie-Hellman密钥交换?,java,public-key,asn.1,diffie-hellman,public-key-exchange,Java,Public Key,Asn.1,Diffie Hellman,Public Key Exchange,我正在尝试实现Diffie-Hellman密钥交换,以使用JAVA加密软件包生成用于加密/解密的对称密钥。这需要双方交换公钥 客户端共享的公钥是1024位十六进制字符串,应使用该字符串计算共享密钥。如何将此字符串转换为编码密钥格式(ASN.1 SubjectPublicKeyInfo结构)以创建PublicKey对象 考虑一个示例公钥字符串。参数p和g被输入inputDHParameterSpec对象 示例实现: 自动生成密钥对: KeyPairGenerator clientKpairGen=

我正在尝试实现Diffie-Hellman密钥交换,以使用JAVA加密软件包生成用于加密/解密的对称密钥。这需要双方交换公钥

客户端共享的公钥是1024位十六进制字符串,应使用该字符串计算共享密钥。如何将此字符串转换为编码密钥格式(ASN.1 SubjectPublicKeyInfo结构)以创建PublicKey对象

考虑一个示例公钥字符串。参数p和g被输入inputDHParameterSpec对象

示例实现: 自动生成密钥对:

KeyPairGenerator clientKpairGen=KeyPairGenerator.getInstance(“DiffieHellman”);
clientKpairGen.initialize(InputdParameterSpec);
KeyPair clientKpair=clientKpairGen.generateKeyPair();
字节[]clientPubKeyEnc=clientKpair.getPublic().getEncoded();
X509EncodedKeySpec testPubKeySpec=新的X509EncodedKeySpec(clientPubKeyEnc);
KeyFactory KeyFactory=KeyFactory.getInstance(“DiffieHellman”);
PublicKey clientPubKey=keyFactory.generatePublic(testPubKeySpec);
十六进制公钥-失败:

String testPublicKey=“85F04DD00345642AD12B65BD1A7C38728BFF0B8E281DDB6AC4F2739E82A02145DAABF23D173C933913B1F844059710E9125591569DE427EAD269ACCBFA3305069DEB7622D1DA3AD9820D11BD24FDCCE5381D2DF99BDA314394738DFCBE210EAE247B1303E797FF746CD919E189F6A5776E624C8900DEF38F159072DE”;
X509EncodedKeySpec testPubKeySpec=新的X509EncodedKeySpec(hexStringToByteArray(testPublicKey));
KeyFactory KeyFactory=KeyFactory.getInstance(“DiffieHellman”);
PublicKey clientPubKey=keyFactory.generatePublic(testPubKeySpec)//在这里失败
在第一个代码块中创建的字节[]具有ASN.1编码格式的公钥,但hexStringToByteArray(testPublicKey)仅将十六进制转换为字节[]。因此,在标记行上获取以下错误

Exception in thread "main" java.security.spec.InvalidKeySpecException: Inappropriate key specification
    at com.sun.crypto.provider.DHKeyFactory.engineGeneratePublic(DHKeyFactory.java:85)
    at java.security.KeyFactory.generatePublic(KeyFactory.java:334)
    at MWK_DHGen.main(MWK_DHGen.java:87)
Caused by: java.security.InvalidKeyException: Error parsing key encoding
    at com.sun.crypto.provider.DHPublicKey.<init>(DHPublicKey.java:178)
    at com.sun.crypto.provider.DHKeyFactory.engineGeneratePublic(DHKeyFactory.java:78)
    ... 2 more
线程“main”java.security.spec.InvalidKeySpecException中的异常:不适当的密钥规范 位于com.sun.crypto.provider.DHKeyFactory.EngineeGeneratePublic(DHKeyFactory.java:85) 位于java.security.KeyFactory.generatePublic(KeyFactory.java:334) 在MWK_DHGen.main(MWK_DHGen.java:87) 原因:java.security.InvalidKeyException:解析密钥编码时出错 在com.sun.crypto.provider.DHPublicKey上。(DHPublicKey.java:178) 位于com.sun.crypto.provider.DHKeyFactory.EngineeGeneratePublic(DHKeyFactory.java:78) ... 还有两个
有人能帮我把这个十六进制转换成需要的格式吗?还鼓励使用此十六进制字符串来获取密钥的不同实现。

如果您已经拥有域参数(p,g)和公钥的整数值,则可以使用A而不是
X509EncodedKeySpec

String testPublicKey = "85f04dd00345642ad12b65bd1a7c38728bff0b8e281ddb6ac4f2739e82a02145daabf23d173c933913b1f844059710e9125591569de427eae1d269accbfa3305069deb7622d1da3ad9820d11bd24fdcce5381d2df99bda314394738dfcbe210eae247b1303e79297ff746cd919e189f6a5776e6ecc24c8900de0f38f159072de";
BigInteger publicKeyInteger = new BigInteger(testPublicKey, 16);
KeyFactory keyFactory = KeyFactory.getInstance("DiffieHellman");
PublicKey clientPubKey = keyFactory.generatePublic(new DHPublicKeySpec(publicKeyInteger, g, p));