问题描述
我有64个JKS信任存储库字符串,我正在尝试对其进行解码。 当我使用此site解码文件时,我将获得具有以下详细信息的可下载文件: 当我与-Djavax.net.ssl.trustStore = path-to-file
一起使用时,此文件可以工作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>
添加空格或换行符等只是为了使其更适合文本编辑器,屏幕查看,电子邮件,人工等。