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 字符(不包括填充字符)。
"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 字符(不包括填充字符)。