【问题标题】:Printing an RSA private key doesn't actually return it打印 RSA 私钥实际上并没有返回它
【发布时间】:2014-01-16 15:45:03
【问题描述】:

我正在尝试在 Java 中生成用于 SSH 的公钥/私钥对,这只是一个测试类,以确保我生成了正确类型的密钥。

但是,当我将私钥打印到控制台时,它不会打印完整的私钥。

这是我的源代码:

import java.security.KeyPair;
import java.security.KeyPairGenerator;
import java.security.NoSuchAlgorithmException;
import java.security.NoSuchProviderException;
import java.security.spec.InvalidKeySpecException;

public class Crypto
{
    public static void main(String[] args) throws NoSuchAlgorithmException, NoSuchProviderException, InvalidKeySpecException
    {
        KeyPairGenerator keyGen = KeyPairGenerator.getInstance("RSA");

        keyGen.initialize(1024);

        KeyPair test = keyGen.genKeyPair();

        System.out.println(test.getPrivate());
        System.out.println(test.getPublic());
    }
}

我正在运行 Java JDK 1.7_45,这是在 eclipse 中运行时的完整控制台输出:

sun.security.rsa.RSAPrivateCrtKeyImpl@2bd00
Sun RSA public key, 1024 bits
  modulus: <removed because it's so long>
  public exponent: 65537

@ 符号后面的字符串一直在变化,但我不相信它实际上是私钥。

提前感谢大家的帮助!

编辑:对不起各位,我实际上并没有问我的问题,我只是陈述了我的问题。 我的完整问题是:如何将私钥作为常规字符串访问?

【问题讨论】:

  • @ 符号后面的字符串(本质上)是一个内存地址... PrivateKey 实现似乎没有覆盖toString

标签: java rsa


【解决方案1】:

您可以将私钥转换为正确的实现类型,在本例中为 RSAPrivateKey(甚至是 RSAPrivateCrtKey),然后提取各个 BigInteger 组件并以您需要的任何方式对其进行格式化。

例子:

KeyPair test = keyGen.genKeyPair();
RSAPrivateKey priv = (RSAPrivateKey) test.getPrivate();
System.out.println(priv.getModulus());
System.out.println(priv.getPrivateExponent());

【讨论】:

    【解决方案2】:

    使用对象作为参数调用System.out.println(); 在该对象上调用toString() 并返回该字符串。 Object 中的默认 toString() 实现返回一个类似于 "fully.qualified.ClassName@objectID" 的字符串。这就是你所看到的。它只是意味着toString() 不会在sun.security.rsa.RSAPrivateCrtKeyImpl 类中被覆盖。

    【讨论】:

    • 好的,我明白了,谢谢你的解释。那么我将如何(例如)将完整的私钥打印到文件中?
    【解决方案3】:

    要将完整的私钥保存到文件中,例如 priv.pem,请尝试将以下行添加到 Pres J K Polk's answer

    var benc = Base64.getEncoder().encodeToString(priv.getEncoded)));
    var bpk = "-----BEGIN PRIVATE KEY-----\n";
    var epk = "\n-----END PRIVATE KEY-----\n";
    var pemk = bpk + benc.replaceAll("(.{64})", "$1\n") + epk;
    var fw = new FileWriter("priv.pem");
    fw.write(pemk);
    fw.close();
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-04
      相关资源
      最近更新 更多