Java:仅使用私钥恢复公钥?可能的

Java:仅使用私钥恢复公钥?可能的,java,private-key,recover,generate,Java,Private Key,Recover,Generate,资料来源: 这是我的密钥对生成方法: try { KeyPairGenerator keyGen = KeyPairGenerator.getInstance("ECDSA", "BC"); SecureRandom random = SecureRandom.getInstance("SHA1PRNG"); ECGenParameterSpec ecSpec = new ECGenParameterSpec("prime192v1");

资料来源:

这是我的密钥对生成方法:

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

通常,私钥包含足够的信息来重建公钥(相反,从公钥计算私钥,这是不可行的)。对于Java中的普通RSA私钥,可以使用
Java.lang.security.KeyFactory.getKeySpec()
来获取
Java.security.spec.RSAPrivateCrtKeySpec
实例,该实例包含模数(
GetModule()
)和公共指数(
getPublicExponent()
),即公钥的两个要素

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


在任何情况下,当您生成私钥时,您实际上生成了一个包含私钥和公钥的密钥对。如果您将公钥的副本与私钥一起存储,则无需担心重新计算公钥。

在尝试在代码中执行此操作之前,您应该询问此操作是否可行。顺便说一句,您的代码似乎不使用RSA,而是椭圆曲线。不回答密码部分:是的,它是可行的。您需要使用在密钥生成过程中用于计算公钥的相同过程(椭圆曲线上的标量乘法)。@Kayaman从公共到私有将是一个漏洞。从私有到公共是可以的。Bouncy Castle API(与其说是提供者)现在包含了一个非常好的EC API,当然可以处理乘法(它在过去经过了大量重构)。毕竟,它是一家只提供软件的供应商。