"encryptedHelloWorld=" ==
Convert.ToBase64String(
Convert.FromBase64String("encryptedHelloWorld="))
此语句返回 false
Convert.ToBase64String(Convert.FromBase64String("encryptedHelloWorld="))
返回"encryptedHelloWorlc="
知道为什么吗?
"encryptedHelloWorld=" ==
Convert.ToBase64String(
Convert.FromBase64String("encryptedHelloWorld="))
此语句返回 false
Convert.ToBase64String(Convert.FromBase64String("encryptedHelloWorld="))
返回"encryptedHelloWorlc="
知道为什么吗?
的原始值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 字符的偶数倍(不包括填充字符)。