0
"encryptedHelloWorld=" ==
      Convert.ToBase64String(
         Convert.FromBase64String("encryptedHelloWorld="))

此语句返回 false

Convert.ToBase64String(Convert.FromBase64String("encryptedHelloWorld="))

返回"encryptedHelloWorlc="

知道为什么吗?

4

1 回答 1

3

的原始值encryptedHelloWorld=未正确进行base-64 编码。

最后一个“d”包含一个额外的位,在此上下文中提取时会忽略它,它出现在 padding 之前。更严格的 base-64 解码器可能会有效地引发错误。

最少的失败输入案例包括rld=or abq=。如下所述,只有带有填充的最后一部分是相关的。

考虑 base-64 字符的每个输出字符每个代表6 位

因此,编码的信息rld=是:

  • r- 6 位
  • l- 6 位
  • d- 6 位 (4 相关 = "c" + 2 额外)
  • =- 不适用

这必须被提取为 2 个字节(8 + 8 = 16 位)。

但是,6 + 6 + 6 = 18 位并且不是8 的倍数。在初始 base-64 值中,有 2 个额外的位可以区分“c”和“d”,这并不反映实际的编码信息

在解码期间,.NET 解码器实现会默默地丢弃“d”中的两个额外位,因为它们无处可去。(对于像“q”>“c”这样的情况也是如此abq=;请注意,大写字母在 base-64 输出空间中首先排序,因此“Q”<“c”。)

在没有填充的正常情况下,每 4 个 base-64 字符以 3 个字节均匀解码,这就是为什么此特定问题仅出现在 base-64 字符串的末尾,该字符串不是 4 个 base-64 字符的偶数倍(不包括填充字符)。

于 2020-02-28T19:11:12.133 回答