"encryptedHelloWorld=" ==
Convert.ToBase64String(
Convert.FromBase64String("encryptedHelloWorld="))
此语句返回错误的
Convert.ToBase64String(Convert.FromBase64String("encryptedHelloWorld="))
返回"encryptedHelloWorlc="
知道为什么吗?
encryptedHelloWorld=
的原始值未正确地进行base-64编码。
最后一个"d"包含一个在此上下文中提取时被忽略的额外位,它出现在填充之前。更严格的base-64解码器可以有效地抛出错误。
最小的失败输入情况包括rld=
或abq=
。只有带有填充的最后一部分是相关的,如下所述。
考虑以64为基的每个输出字符表示每个6位。
因此,rld=
中编码的信息是:
r
-6位l
-6位d
-6位(4个相关="c"+2个额外(=
-不适用
必须将其提取为2个字节(8+8=16位(。
然而,6+6+6=18位,并且不是8的倍数。有2个额外的位,它们在初始基64值中区分"c"one_answers"d",它们不反映实际的编码信息。
在解码过程中,.NET解码器实现无声地丢弃"d"中的两个额外位,因为它们无处可去。(对于abq=
作为"q">"c"的情况也是如此;请注意,大写字母在64进制输出空间中首先排序,因此"q"<"c"。(
在没有填充的正常情况下,每4个base-64字符平均解码3个字节,这就是为什么这个特定问题只出现在base-64字符串的末尾,该字符串不是4个base六十四字符的偶数倍(不包括填充字符(。