Convert.ToBase64String / Convert.FromBase64String не возвращает исходное значение строки - PullRequest
0 голосов
/ 28 февраля 2020
"encryptedHelloWorld=" ==
      Convert.ToBase64String(
         Convert.FromBase64String("encryptedHelloWorld="))

Это утверждение возвращает false

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

return "encryptedHelloWorlc="

Есть идеи почему?

1 Ответ

3 голосов
/ 28 февраля 2020

Исходное значение 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 символа (исключая символы заполнения).

...