首页 文章

使用Diffie-Hellman算法的字符串到PublicKey

提问于
浏览
0

我有一个由我的客户端给出的公钥字符串(128字节到十六进制处理) . 我需要使用私钥和客户端提供的公钥生成共享密钥 . 我将String转换为Public键时遇到异常 . 我尝试了 decoding/encoding 字节,没有任何改进 . 我有以下代码 .

//这是一个示例键 .

private static final String PUB_KEY = "0DC1B7102DE3F6785A284ABFCA1822A6B59C947B5F2FAAE" + "672D8EE29C3D801BC153777CD3AF5478FD25C234C50BBABF8CD5215A8F1CB19B0B4A24FD5E9" + "412264646E2A06FCB5929FFBE196A1BD58B9927424C3B3D0388FDDA15FD1FF1C3E7600A629E" + 
"B3F0B38B85CCCE03D44CF8D53B2E4E5EFD54E991CE92E55B10FCCD79F04";

public static void main(String[] argv) throws Exception {   
    PublicKey key = getKey(h2b(PUB_KEY));
}

private static PublicKey getKey(final byte[] pubKey) throws Exception {
    final KeyFactory keyFactory = KeyFactory.getInstance("DH");  
    final X509EncodedKeySpec keySpec = new X509EncodedKeySpec(pubKey);
    return keyFactory.generatePublic(keySpec); // THROWS EXCEPTION
}

private static byte[] h2b(String hex) {
    if ((hex.length() & 0x01) == 0x01)
        throw new IllegalArgumentException();
    byte[] bytes = new byte[hex.length() / 2];
    for (int idx = 0; idx < bytes.length; ++idx) {
        int hi = Character.digit((int) hex.charAt(idx * 2), 16);
        int lo = Character.digit((int) hex.charAt(idx * 2 + 1), 16);
        if ((hi < 0) || (lo < 0))
            throw new IllegalArgumentException();
        bytes[idx] = (byte) ((hi << 4) | lo);
    }
    return bytes;
}

抛出异常 . 有什么帮助解决这个问题?

Exception in thread "main" java.security.spec.InvalidKeySpecException: Inappropriate key specification at com.sun.crypto.provider.DHKeyFactory.engineGeneratePublic(DHKeyFactory.java:87)

1 回答

  • 0

    X509EncodedKeySpec 应包含具有ASN.1 SubjectPublicKeyInfo 结构的字节数组 .

    您的示例中的 PUB_KEY 可能是原始键值(在 javax.crypto.spec.DHPublicKeySpec 中为 y ),这不足以创建keyspec .

    您应该向您的客户端询问ASN.1表单中的正确公钥是否用作 X509EncodedKeySpec 的输入(这是优选的)或 DHPublicKeySpec 所需的 pg 参数 .

相关问题