Почему сгенерированная PowerShell строка base64 содержит точки при декодировании с помощью чего-то другого, кроме PowerShell

У меня есть код вроде:

$x = "This text needs to be encoded"
$z = [System.Text.Encoding]::Unicode.GetBytes($x)
$y = [System.Convert]::ToBase64String($z)
Write-Host("$y")

И в консоль выводится следующее:

VABoAGkAcwAgAHQAZQB4AHQAIABuAGUAZQBkAHMAIAB0AG8AIABiAGUAIABlAG4AYwBvAGQAZQBkAA==

Теперь, если бы я расшифровал этот b64 с помощью powershell, например:

$v = [System.Text.Encoding]::Unicode.GetString([System.Convert]::FromBase64String($y))
Write-Host("$v")

Он будет правильно декодирован, например:

Этот текст нужно закодировать

Однако, если бы я поместил вышеупомянутую закодированную строку b64, скажем, в CyberChef и попытался декодировать ее с помощью рецепта «Из base64», декодированная строка была бы заполнена точками, например:

Этот. .текст. .н.э.д.с. .к. .быть. .e.n.c.o.d.e.d.

Мой вопрос, почему это происходит?

Итак, вам нужно понять, какое кодирование использует CyberChef ... возможно, это [System.Text.Encoding]::UTF8, чтобы вы могли попробовать вместо использования Unicode

Santiago Squarzon 19.10.2022 21:07

Кроме того, не используйте здесь скобки Write-Host("$y"). Вместо этого используйте пробел между командлетом и тем, что вы хотите написать. Write-Host — это командлет, а не объектный метод.

Theo 19.10.2022 21:45
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
3
126
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Сантьяго Скуарзон предоставил важный указатель:

  • Скорее всего, рецепт CyberChef ожидает, что байты, которые кодирует строка Base64, будут основаны на кодировке UTF-8 исходной строки.

  • Напротив, - плохо названная - кодировка [System.Text.Encoding]::Unicode является кодировкой UTF-16LE, где символы представлены (по крайней мере) двумя байтами (с наименее значащим байтом, первый).

    • Символы, чья кодовая точка Unicode меньше или равна 0xFF (255), которая включает в себя весь диапазон ASCII, в который попадают все символы в вашей входной строке, поэтому имеют байт NUL (значение 0x0) в качестве второго байта их двухбайтового представление; например, буква T, закодированная как UTF-16LE, состоит из двухбайтовой последовательности 0x54 0x0, где 0x54 сама по себе представляет букву T в кодировке ASCII — и, следовательно, также в UTF-8, которая является надмножеством ASCII, представляющим (только ) символы, отличные от ASCII, как многобайтовые последовательности.
    • Поэтому двухбайтовая последовательность 0x54 0x0 интерпретируется как два символа в контексте UTF-8: буква T (0x54) и NUL (0x0). NUL не имеет визуального представления как такового (это непечатаемый символ), но принято визуализировать его как ., что вы и видели.

Поэтому создайте строку в кодировке Base64 следующим образом:

$orig = "This text needs to be encoded"
$base64 = 
  [System.Convert]::ToBase64String(
    [System.Text.Encoding]::UTF8.GetBytes($orig)
  )

Note: Even though [System.Text.Encoding]::UTF8 is - up to at least .NET 6 - a UTF-8 encoding with BOM, a BOM is (fortunately) not prepended to the input string by the .GetBytes() method. As an aside: Changing this encoding to be BOM-less altogether is being considered prior to .NET 7.

$base64 затем содержит: VGhpcyB0ZXh0IG5lZWRzIHRvIGJlIGVuY29kZWQ=

Другие вопросы по теме