Convert.ToBase64String/Convert.FromBase64String 不 return 原始字符串值

Convert.ToBase64String/Convert.FromBase64String doesn't return the original string value

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

这个说法return是假的

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

return "encryptedHelloWorlc="

知道为什么吗?

encryptedHelloWorld= 的原始值不是 正确的 base-64 编码。

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

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

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

因此rld=编码的信息是:

  • r - 6 位
  • l - 6 位
  • d - 6 位(4 个相关 = "c" + 2 个额外)
  • = - n/a

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

然而,6 + 6 + 6 = 18 位 不是 8 的倍数。有 2 extra 位区分"c" 来自 "d" 的初始 base-64 值 不反映实际编码信息 .

在解码过程中,.NET 解码器实现 悄悄丢弃 "d" 中的两个额外位,因为它们无处可去。 (对于 abq= 这样的情况也是如此,因为 "q" > "c";请注意,大写字母在 base-64 输出 space 中排在第一位,因此 "Q" < "c".)

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