java 16进制公钥_java - 如何将十六进制公钥转换为用于Diffie-Hellman密钥交换的ASN.1 SubjectPublicKeyInfo结构? - SO中文参考 - www.soi...

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

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

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

示例实现:AutoGen密钥对:

KeyPairGenerator clientKpairGen = keyPairGenerator.getInstance("DiffieHellman");

clientKpairGen.initialize(inputDHParameterSpec);

KeyPair clientKpair = clientKpairGen.generateKeyPair();

byte[] clientPubKeyEnc = clientKpair.getPublic().getEncoded();

X509EncodedKeySpec testPubKeySpec = new X509EncodedKeySpec(clientPubKeyEnc);

KeyFactory keyFactory = KeyFactory.getInstance("DiffieHellman");

PublicKey clientPubKey = keyFactory.generatePublic(testPubKeySpec);

Hex PublicKey - 失败:

String testPublicKey = "85f04dd00345642ad12b65bd1a7c38728bff0b8e281ddb6ac4f2739e82a02145daabf23d173c933913b1f844059710e9125591569de427eae1d269accbfa3305069deb7622d1da3ad9820d11bd24fdcce5381d2df99bda314394738dfcbe210eae247b1303e79297ff746cd919e189f6a5776e6ecc24c8900de0f38f159072de";

X509EncodedKeySpec testPubKeySpec = new X509EncodedKeySpec(hexStringToByteArray(testPublicKey));

KeyFactory keyFactory = KeyFactory.getInstance("DiffieHellman");

PublicKey clientPubKey = keyFactory.generatePublic(testPubKeySpec);//Failing here

在第一个代码块中创建的byte []具有ASN.1编码格式的公钥,但hexStringToByteArray(testPublicKey)仅将十六进制转换为byte []。由于这个原因,在标记的行上得到以下错误。

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.(DHPublicKey.java:178)

at com.sun.crypto.provider.DHKeyFactory.engineGeneratePublic(DHKeyFactory.java:78)

... 2 more

有人可以帮助如何将此十六进制转换为所需的格式吗?还鼓励使用此十六进制字符串来获取密钥的不同实现。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值