Что случилось с различными схемами шестнадцатеричного кодирования?

752
TheFuzzyFish

Так что я работаю с криптографией около года, изучая как можно больше обо всем, что могу. Многие вещи, с которыми я сталкивался (например, шестнадцатеричный [не слово, а тсс] закодированный главный ключ тома LUKS или модуль ключа RSA), кодируются в шестнадцатеричном формате. Я понимаю, что десятичное - это причудливый способ обозначить основание 10, а шестнадцатеричное - это причудливый способ обозначить основание 16, и я понимаю, как оно работает с точки зрения чисел, но есть несколько вещей, которые я не могу полностью обернуть вокруг:

  1. Как можно кодировать ASCII или UTF-8 (или обычный открытый текст) в системе с нумерацией ?
  2. Я заметил 2 разных вида схем кодирования на моих предприятиях. Есть еще версии? Зачем?

Два, которые я заметил (при декодировании мастер-ключей LUKS и декодировании модулей RSA), странные. Мастер LUKS, ключ, я повторяю ключ, отправляя его в «xxd -r -p», и он выплевывает фактический ключ, который можно поместить в файл и использовать для разблокировки тома без использования слотов ключей. Другая версия, которую я видел, это когда я передаю модуль RSA с вложением «ibase = 16;» в «bc». Любая другая шестнадцатеричная последовательность, которую я отправил в BC с «ibase = 16;», содержит только цифры, без букв. "xxd -r -p", кажется, выводит традиционный ASCII.

Почему BC выводит числа, а xxd выводит текст ASCII?

Я прошу прощения за то, что это такой повсеместный вопрос, но, как я уже говорил ранее, я слишком запутался в этой теме, чтобы быть нормальным.

-1

2 ответа на вопрос

0
TOOGAM

«Фактический ключ» - это двоичные символы. Однако то, что вы обычно помещаете в файл, представляет собой шестнадцатеричное представление.

xxd выводит текст ASCII вместо шестнадцатеричных представлений благодаря ключу -r. Наличие реальных символов - это то, что man-страница подразумевает под «двоичным».

ASCII - это просто список символов в определенном порядке. Сначала NULL, затем символ начала заголовка, затем символ конца заголовка и т. Д. (См. Диаграмму ASCII . Кодовая страница 437 (см. Страницу Википедии на CP437 показывает их в виде пустого контура смайлика, заполненного смайлик и т. д. 65-й символ в обоих случаях - заглавная буква А.

Если 65-ым символом является заглавная буква A, это означает, что мы можем отслеживать символы на основе их положения в таблице. Таким образом, заглавная буква A - это позиция 65, которая является позицией 41 в шестнадцатеричном формате (часто пишется в формате C, как 0x41). Вы можете увидеть значение «41» в таблице ASCII, которую я упомянул выше.

Как можно кодировать ASCII или UTF-8 (или обычный открытый текст) в системе с нумерацией?

Числа могут быть преобразованы в другие числа, такие как другие базы. например, 0x4169 эквивалентно 0x4100 + 0x69. 41 соответствует заглавной букве H, а 69 соответствует строчной букве i. Я не уверен, почему вы сомневаетесь, что числовой разговор возможен. Если это все еще неясно, пожалуйста, объясните заново (возможно, задав еще один вопрос).

I have noticed 2 different kinds of encoding schemes in my ventures. Are there more versions? Why? 

Конечно. Зачем? Потому что есть несколько программ, разработанных разными людьми. Точно так же, как, почему есть несколько стандартов символов (EBCDIC, ASCII, UTF-8, Unicode). Некоторые из них бесполезны (EBCDIC был очень популярен до того, как 8-битные кодовые страницы, использующие ASCII, стали более популярными), некоторые могут быть проще поддерживать с помощью определенных программных инструментов. Компьютеры теперь достаточно мощные, чтобы не было много технических ограничений, которые обуславливают множество стандартов, но разные программисты делают разные вещи, иногда по разным причинам.

Инструменты конвертации существуют. Отсутствие стандартизации связано именно с тем, что более строгой / более жесткой / лучшей стандартизации не требовалось. Если бы была неоспоримая выгода, больше людей, вероятно, были бы более склонны пытаться приспособиться к более крупным общим тенденциям.

Почему BC выводит числа, а xxd выводит текст ASCII?

bcэто калькулятор. Я ожидал бы числовой вывод. xxd -rвыводит текст ASCII, потому что это то, что задокументировано. Смысл этого программного обеспечения состоит в том, чтобы преобразовывать текст ASCII в (шестнадцатеричные) числовые строки, которые легче набирать, и преобразовывать числовые строки в «двоичные» / ASCII-символы, которые на самом деле более полезны для определенного программного обеспечения. Каждая программа выполняет свои собственные, разные цели.

Я надеюсь, что этот сборник ответов поможет ответить на достаточно ваших вопросов, чтобы все стало более понятным. Я знаю, что вы ссылались на это, но я укажу, что этот вопрос немного губителен, потому что это не очень четкий вопрос, поэтому подумайте над тем, чтобы задавать дополнительные вопросы в новых вопросах. Задавать один реальный вопрос за «страницу с вопросом» на Stack Exchange обычно предпочтительнее.

0
Scott

Части вашего вопроса не имеют особого смысла:

Любая другая шестнадцатеричная последовательность, которую я отправил в BC с «ibase = 16;», содержит только цифры, без букв.

Ну, база вывода по умолчанию для bcдесятичной:

$ echo 'ibase=16; 100' | bc 256  $ echo 'ibase=16; 1000' | bc 4096  $ echo 'ibase=16; 10000' | bc 65536 

так какие буквы вы ожидаете? Если вы хотите bcвывести шестнадцатеричные числа, вы должны установить его выходную базу равной 16. Но если входная база и выходная база одинаковы, ее выход будет таким же, как и вход (с обнулением начальных нулей):

$ echo 'obase=16; ibase=16; 100' | bc 100  $ echo 'obase=16; ibase=16; 007F' | bc 7F  $ echo 'obase=16; ibase=16; CAFE' | bc CAFE  $ echo 'obase=16; ibase=16; FACE' | bc FACE 

Обратите внимание, что если вы хотите выполнить это довольно бессмысленное упражнение, вы должны сказать obase=16; ibase=16или, потому что любые числа, которые вводятся после, интерпретируются как шестнадцатеричные. Если вы говорите, выходная база будет установлена ​​на 22 (16 (шестнадцатеричное) = 10 (шестнадцатеричное)  + 6 (шестнадцатеричное) = 16 + 6 = 22).ibase=16; obase=10ibase=16ibase=16; obase=16

"xxd -r -p", кажется, выводит традиционный ASCII.

Либо вы даете xxdшестнадцатеричное представление «традиционного ASCII» текста, либо у вас есть нестандартное определение «традиционного ASCII». Как говорит TOOGAM, xxd -rвыводит «двоичные» / ASCII символы, что является своеобразной номенклатурой. Обратите внимание, что «диаграмма ASCII», на которую ссылается TOOGAM, идет только вверх через символ 7F, а на странице Википедии в ASCII написано:

… ASCII кодирует 128 указанных символов в семибитные целые числа…

также в диапазоне от 00 до 7F. xxd -rвыводит восьмибитные («двоичные») символы. Это расширенный набор стандартов ASCII. (Термин расширенный ASCII относится к восьмибитным кодировкам, но, вероятно, лучше отказаться от этой фразы, поскольку Unicode пронизывает ландшафт.) Поскольку восьмибитные («двоичные») символы образуют надмножество стандартного ASCII, xxd -r могут выводить традиционные символы ASCII. ; например:

$ echo 464F4F0A | xxd -r -p FOO 

поскольку 46 - шестнадцатеричное представление кода ASCII для F (6-ая буква алфавита), 4F - шестнадцатеричное представление кода ASCII для O (15-я буква алфавита, где F - шестнадцатеричное представление 15), и 0A является шестнадцатеричным представлением кода ASCII для новой строки. Но

echo 000102030405067F | xxd -r -p 

выведет непечатаемые управляющие символы ASCII и

echo 80818283A0A1A2A3 | xxd -r –p 

а также

echo E29885E29FB9F09F98BA0A | xxd -r –p 

будет выводить байты со значениями выше 7F. Поведение (внешний вид) этих персонажей (если есть) определяется вашим терминалом и его настройками.

Похожие вопросы