用Java解码Base64 JKS信任库

问题描述

我有64个JKS信任存储库字符串,我正在尝试对其进行解码。 当我使用此site解码文件时,我将获得具有以下详细信息的可下载文件

enter image description here

当我与-Djavax.net.ssl.trustStore = path-to-file

一起使用时,此文件可以工作

现在,我正在尝试使用Java自己解码文件并将其写入文件

byte[] decoded = Base64.getDecoder().decode(data);
FileOutputStream fos = new FileOutputStream(new File(basePath));
fos.write(decoded);

这样,我得到了诸如����之类的不可读字符。

我还尝试将字节数组转换为String:

StringBuilder sbHexDump = new StringBuilder();
for (byte b : decoded) {
    sbHexDump.append(String.format("%02x",b));
}

这样,我将获得与从网站下载的内容相同的hexdump,但没有空格和换行符。 两种方式都出现以下错误

java.io.IOException: Invalid keystore format
    at sun.security.provider.JavaKeyStore.engineLoad(JavaKeyStore.java:663)
    at sun.security.provider.JavaKeyStore$JKS.engineLoad(JavaKeyStore.java:56)
    at sun.security.provider.KeyStoreDelegator.engineLoad(KeyStoreDelegator.java:224)
    at sun.security.provider.JavaKeyStore$DualFormatJKS.engineLoad(JavaKeyStore.java:70)
    at java.security.KeyStore.load(KeyStore.java:1445)

感谢您的帮助

解决方法

这样,我得到了诸如����之类的不可读字符。

是的,那又如何呢? JKS是二进制格式。并非所有字节都映射到可打印字符。只要keytool可以读到它就很好。

,

除了了解base 64编码方案(https://en.wikipedia.org/wiki/Base64)外,您可能还需要了解有关字节放置的所有大端问题。编码只是采用前8位,将其中的6位编码,将后8位连接到其余2位,然后对6位进行编码,将后8位连接到其余4位,然后对6位进行编码,然后对最后6位进行编码。在3字节组中间击中eof时,有一个=填充系统对此进行编码。

唯一的窍门是从正确的一端取下您的钻头,然后在正确的一端连接您的钻头。如果要像整数一样对二进制非字节数据进行编码,则必须让big-endian知道它们是如何编码的,因为整数的低字节可能分别为little或big endian编码的第1或第4字节。 / p>

添加空格或换行符等只是为了使其更适合文本编辑器,屏幕查看,电子邮件,人工等。