Base64解码错误 最后一个单位没有足够的有效比特位

7

我收到了厂商发来的一个 .p7b 文件,里面有一个证书。我需要从中提取出这个证书。因此我在命令行上运行了以下命令:

openssl pkcs7 -inform DER -outform PEM -in in.p7b -print_certs > cer_bundle.cer

我打开了cer_bundle.cer文件,看到其中有三个证书。前两个证书看起来没问题。但是最后一个证书在经过Base64.getDecoder().decode(myCert)处理后会出现错误。
java.lang.IllegalArgumentException: Last unit does not have enough valid bits\n\tat 
java.util.Base64$Decoder.decode0(Base64.java:734)\n\tat 
java.util.Base64$Decoder.decode(Base64.java:526)\n\tat 
java.util.Base64$Decoder.decode(Base64.java:549)\n\t
...

然后我将证书内容复制到终端中并执行以下操作

CERT=MIIFDj...
base64 --decode <<< $CERT

我在控制台上看到一个输出,没有错误。

Java 的 Base64 解码器正在进行什么操作?


你能分享一下base64编码数据的最后几个字符吗?(也许是8个) - Erik
@Erik,这是给你的:wt35Lcw= - Saturnian
1个回答

7

Base 64编码使用四个字符来编码三个字节,因此长度应该是四个字符的倍数。如果输入是三个字节的倍数,则不需要填充,否则会添加=。会有一或两个“剩余”字节。

  • 一个“剩余”字节时,尾部四个字符为XY==,其中X编码六位,Y编码两位。
  • 两个“剩余”字节时,尾部四个字符为XYZ=,其中X编码六位,Y编码第一个字节的两位和第二个字节的四位,Z编码第二个字节的四位。

您遇到的错误表明最后四个字符实际上是X===(可以省略=),这在Base 64编码中没有意义。


我进行了逐字检查,结果发现在去除换行符时漏掉了一个字符 - 难怪要解码的“位”数较少。 - Saturnian

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接