首页 > 解决方案 > 在代码中硬编码公钥而不是从 public.der 中挑选它

问题描述

我创建public.derprivate.der使用了 openssl。我需要将生成的公钥硬编码到代码中,而不是从public.der文件中读取该密钥。当我将文件中的密钥读入 byte[] 并打印该字节数组时,我会得到类似"[B@74a14482". 我可以通过从文件中读取密钥来运行程序,但是执行需要时间,所以我想将密钥直接硬编码到程序中。我有以下功能

public PublicKey readPublicKey(String filename) throws IOException, NoSuchAlgorithmException, InvalidKeySpecException, URISyntaxException {
    String str = "[B@74a14482";
    byte[] b = str.getBytes();
    X509EncodedKeySpec publicSpec = new X509EncodedKeySpec(b);
    KeyFactory keyFactory = KeyFactory.getInstance("RSA");

    return keyFactory.generatePublic(publicSpec);
}

但它给了我错误

java.security.spec.InvalidKeySpecException: java.security.InvalidKeyException: IOException: Detect premature EOF

我提到了这个 并运行,但我得到了同样的错误。

打印字节数组的代码:

public byte[] readFileBytes(String filename) throws IOException, URISyntaxException {

    return ByteStreams.toByteArray(ResourceLoader.loadFile(filename));
}

public PublicKey readPublicKey(String filename) throws IOException, NoSuchAlgorithmException, InvalidKeySpecException, URISyntaxException {
    System.out.println(readFileBytes(filename));
    String str = "[B@74a14482";

    byte[] keyBytes;
    keyBytes = (new BASE64Decoder()).decodeBuffer(str);
    X509EncodedKeySpec publicSpec = new X509EncodedKeySpec(keyBytes);
    KeyFactory keyFactory = KeyFactory.getInstance("RSA");

    return keyFactory.generatePublic(publicSpec);
}

你能帮我解决这个问题吗?我要去哪里错了。

标签: java-8rsa

解决方案


正如@michalk 所指出的,您打印的是toString()应用于字节数组的方法的结果。此方法不打印数组的内容。

另一个问题是并非所有字节都可以转换为可打印字符。

我建议使用Base64重新设置密钥,这将为您提供密钥的可打印版本。然后你可以在使用它之前解码这个字符串。

打印文件内容

byte [] keyBytes = readFileBytes(filename);
String keyString = Base64.getEncoder().encodeToString(key);
System.out.println(keyString);

从字符串中解码密钥

byte[] keyBytes = Base64.getDecoder().decode(keyString);

(而不是keyBytes = (new BASE64Decoder()).decodeBuffer(str);


推荐阅读