为了账号安全,请及时绑定邮箱和手机立即绑定

如何将十六进制公钥转换为 ASN.1 主题公共密钥信息结构,用于迪菲-赫尔曼密钥交换?

如何将十六进制公钥转换为 ASN.1 主题公共密钥信息结构,用于迪菲-赫尔曼密钥交换?

繁星点点滴滴 2022-09-22 10:13:48

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


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


考虑一个示例公钥字符串。参数 p 和 g 被馈送到输入DH参数规格对象中。


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


    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);

十六进制公钥 - 失败:


    String testPublicKey = "85f04dd00345642ad12b65bd1a7c38728bff0b8e281ddb6ac4f2739e82a02145daabf23d173c933913b1f844059710e9125591569de427eae1d269accbfa3305069deb7622d1da3ad9820d11bd24fdcce5381d2df99bda314394738dfcbe210eae247b1303e79297ff746cd919e189f6a5776e6ecc24c8900de0f38f159072de";

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

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

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

在第一个代码块中创建的byte[] 具有 ASN.1 编码格式的公钥,但十六进制字符串到字节数组(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

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


查看完整描述

1 回答

?
慕雪6442864

TA贡献1486条经验 获得超5个赞

如果您已经拥有域参数(p,g)并且只有公钥的整数值,那么DHP公共密钥规格而不是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));




查看完整回答
反对 回复 5天前

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信