-1

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

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

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

1 回答 1

5

一般来说,私钥包含足够的信息来重建公钥(相反,从公钥计算私钥,希望这是不可行的)。在 Java 中的普通 RSA 私钥的情况下,您将使用java.lang.security.KeyFactory.getKeySpec()来获取一个java.security.spec.RSAPrivateCrtKeySpec实例,其中包含模数 ( getModulus()) 和公共指数 ( getPublicExponent()),即公钥的两个元素。

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

无论如何,当您生成私钥时,您实际上会生成一个包含私钥和公钥的密钥。如果您将公钥的副本与私钥一起存储,那么您不必担心重新计算公钥。

于 2018-01-30T14:16:24.037 回答