Java:只拥有PrivateKey来恢复公钥?可能?

-1 java recover private-key generate

来源: 如何从byte []数组中恢复RSA公钥?

这是我的KeyPair生成方法:

    try {
        KeyPairGenerator keyGen = KeyPairGenerator.getInstance("ECDSA", "BC");
        SecureRandom random = SecureRandom.getInstance("SHA1PRNG");
        ECGenParameterSpec ecSpec = new ECGenParameterSpec("prime192v1");
        // Initialize the key generator and generate a KeyPair
        keyGen.initialize(ecSpec, random); // 256 bytes provides an
                                            // acceptable security level
        KeyPair keyPair = keyGen.generateKeyPair();
        // Set the public and private keys from the keyPair
        privateKey = keyPair.getPrivate();
        publicKey = keyPair.getPublic();


        System.out.println("Private and public keys:");
        System.out.println("PRIVATE: " + StringUtil.getStringFromKey(this.privateKey));
        System.out.println("PUBLIC: " + StringUtil.getStringFromKey(this.publicKey));

    } catch (Exception e) {
        throw new RuntimeException(e);
    }
Run Code Online (Sandbox Code Playgroud)

Tho*_*nin 5

通常,私钥包含足够的信息来重建公钥(相反,从公钥计算私钥,这是有希望的不可行).对于Java中的普通RSA私钥,您将使用java.lang.security.KeyFactory.getKeySpec()获取的java.security.spec.RSAPrivateCrtKeySpec实例,其中包含modulus(getModulus())和public exponent(getPublicExponent()),即公钥的两个元素.

当然,现在,您的代码不是 RSA密钥对的生成器,而是椭圆曲线密钥对,这是一个完全不同的动物.但是,私钥又包含足够的信息来重新计算公钥.然而,这涉及椭圆曲线乘法,这是一种可行的操作(这是签署或验证ECDSA签名时使用的操作类型),但我不确定Java中是否有现成的API.

在任何情况下,当你生成私钥,你居然生成密钥同时与私钥和公钥.如果您将公钥的副本与私钥一起存储,则无需担心重新计算公钥.