簡體   English   中英

如何將十六進制公鑰轉換為 ASN.1 SubjectPublicKeyInfo 結構以進行 Diffie-Hellman 密鑰交換?

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

我正在嘗試實現 Diffie-Hellman 密鑰交換以使用 JAVA 加密包生成用於加密/解密的對稱密鑰。 這需要兩方之間進行公鑰交換。

客戶端共享的公鑰是1024位的16進制字符串,用於計算共享密鑰。 如何將此字符串轉換為編碼的密鑰格式(ASN.1 SubjectPublicKeyInfo 結構)以創建 PublicKey 對象。

考慮一個示例公鑰字符串。 參數pg被送入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);

十六進制公鑰 - 失敗:

    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.<init>(DHPublicKey.java:178)
    at com.sun.crypto.provider.DHKeyFactory.engineGeneratePublic(DHKeyFactory.java:78)
    ... 2 more

有人可以幫助如何將此十六進制轉換為所需的格式嗎? 還鼓勵使用此十六進制字符串來獲取密鑰的不同實現。

如果您已經有域參數 (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