Исходное значение encryptedHelloWorld=
равно , а не , правильно закодировано в Base-64.
Последний «d» содержит дополнительный бит, который игнорируется при извлечении в этом контексте, где он происходит непосредственно перед заполнением . Более строгий декодер Base-64 может корректно выдать ошибку.
Минимальные ошибочные входные регистры включают rld=
или abq=
. Актуальна только последняя часть с дополнением, как описано ниже.
Учтите, что каждый выходной символ символа base-64 представляет 6 бит каждый .
Таким образом, информация кодируется в rld=
:
r
- 6 бит l
- 6 бит d
- 6 бит (4 соответствующих = "c" + 2 дополнительных) =
- н / д
Это должно быть извлечено в 2 байта (8 + 8 = 16 бит).
Однако, 6 + 6 + 6 = 18 бит и составляет не , кратное 8. Есть 2 дополнительных бит, которые отличают "c" от "d" в начальное значение base-64 , которое не отражает фактическую кодированную информацию .
Во время декодирования реализация декодера. NET тихо отбрасывает два дополнительных бита в «д», так как им некуда go. (Это также верно для таких случаев, как abq=
как "q"> "c"; обратите внимание, что заглавные буквы располагаются первыми в выходном пространстве base-64, поэтому "Q" <"c".) </p>
В обычном случае без заполнения, каждые 4 символа base-64 декодируются равномерно в 3 байта, поэтому эта конкретная проблема присутствует только в конце строки base-64, которая не кратна четырем основным -64 символа (исключая символы заполнения).