我正在尝试生成一个公共/私有密钥对用于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
@符号后的字符串不断变化,但我不相信它实际上是私钥。
提前感谢任何帮助人员!
编辑:我很抱歉,我实际上并没有问我的问题,我只是说出了我的问题。 我的完整问题是:如何将私钥作为常规字符串访问?
答案 0 :(得分:3)
您可以将私钥转换为正确的实现类型,在本例中为RSAPrivateKey
(甚至RSAPrivateCrtKey
),然后提取单个BigInteger组件并以您需要的任何方式格式化它们。
示例:
KeyPair test = keyGen.genKeyPair();
RSAPrivateKey priv = (RSAPrivateKey) test.getPrivate();
System.out.println(priv.getModulus());
System.out.println(priv.getPrivateExponent());
答案 1 :(得分:2)
使用对象作为参数调用System.out.println();
在该对象上调用toString()
并返回该字符串。 Object
中的默认toString()
实现返回一个类似于"fully.qualified.ClassName@objectID"
的字符串。这就是你所看到的。它只是意味着toString()
未在类sun.security.rsa.RSAPrivateCrtKeyImpl
中覆盖。
答案 2 :(得分:0)
要将完整的私钥保存到文件中,例如 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();