简体   繁体   English

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

[英]How to convert hex public key to ASN.1 SubjectPublicKeyInfo structure for Diffie-Hellman key exchange?

I am trying to implement Diffie-Hellman key exchange to generate the symmetric key for encryption/decryption using JAVA cryptography packages.我正在尝试实现 Diffie-Hellman 密钥交换以使用 JAVA 加密包生成用于加密/解密的对称密钥。 This requires a public key exchange between the two parties.这需要两方之间进行公钥交换。

The public key shared by the client is 1024 bit hexadecimal string, which should be used to calculate the shared secret key.客户端共享的公钥是1024位的16进制字符串,用于计算共享密钥。 How to convert this string into an encoded key format (ASN.1 SubjectPublicKeyInfo structure) to create a PublicKey object.如何将此字符串转换为编码的密钥格式(ASN.1 SubjectPublicKeyInfo 结构)以创建 PublicKey 对象。

Considering a sample public key string.考虑一个示例公钥字符串。 Parameters p and g are fed into inputDHParameterSpec object.参数pg被送入inputDHParameterSpec对象。

Sample implementation: AutoGen keypair:示例实现: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 - failing:十六进制公钥 - 失败:

    String testPublicKey = "85f04dd00345642ad12b65bd1a7c38728bff0b8e281ddb6ac4f2739e82a02145daabf23d173c933913b1f844059710e9125591569de427eae1d269accbfa3305069deb7622d1da3ad9820d11bd24fdcce5381d2df99bda314394738dfcbe210eae247b1303e79297ff746cd919e189f6a5776e6ecc24c8900de0f38f159072de";
    X509EncodedKeySpec testPubKeySpec = new X509EncodedKeySpec(hexStringToByteArray(testPublicKey));
    KeyFactory keyFactory = KeyFactory.getInstance("DiffieHellman");
    PublicKey clientPubKey = keyFactory.generatePublic(testPubKeySpec);//Failing here

byte[] created in first code block has public key in ASN.1 encoded format, but hexStringToByteArray(testPublicKey) merely converts the hex to byte[].在第一个代码块中创建的 byte[] 具有 ASN.1 编码格式的公钥,但hexStringToByteArray(testPublicKey)只是将十六进制转换为 byte[]。 Getting the below error on the marked line, due to this.因此,在标记线上出现以下错误。

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

Can someone help on how to convert this hex to the requried format here?有人可以帮助如何将此十六进制转换为所需的格式吗? A different implementation that would use this hex string to arrive at the secret key is also encouraged.还鼓励使用此十六进制字符串来获取密钥的不同实现。

If you already have the domain parameters (p, g) and just the integer value of the public key then a DHPublicKeySpec rather than an X509EncodedKeySpec is the way to go:如果您已经有域参数 (p, g) 和公钥的整数值,那么DHPublicKeySpec而不是X509EncodedKeySpec是要走的路:

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

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM