Почему меняется размер закодированного сообщения
Перейти к содержимому

Почему меняется размер закодированного сообщения

  • автор:

Почему меняется размер закодированного сообщения

О Unicode и UTF-8

  1. Два байта 10yyyyyy yxxxxxxx не только обозначают символ с номером yyyyyy yxxxxxxx , но и меняют текущий алфавит на yyyyyy y0000000 (т.е. запоминаем все биты, кроме младших 7 бит);
  2. Один байт 0xxxxxxx это символ текущего алфавита. Его нужно просто сложить с тем смещением, которое мы запомнили на шаге 1. Пока алфавит мы не меняли, смещение равно нулю, так что совместимость с ASCII мы сохранили.
  1. Три байта 110yyyyy yxxxxxxx xxxxxxxx обозначают символ с номером yyyyyy yxxxxxxx xxxxxxxx , меняют текущий алфавит на yyyyyy y0000000 00000000 (запомнили всё, кроме младших 15 бит), и ставят флажок, что мы теперь в длинном режиме (при смене алфавита обратно на двухбайтовый этот флажок мы сбросим);
  2. Два байта 0xxxxxxx xxxxxxxx в длинном режиме это символ текущего алфавита. Аналогично, мы складываем его со смещением из шага 1. Вся разница только в том, что теперь мы читаем по два байта (потому что мы переключились в такой режим).

Посмотрим на те блоки Юникода, которые требуют трёх байт сейчас. В основном, как уже было сказано, это китайские иероглифы — но с ними трудно что-то сделать, их 21 тысяча. Но ещё туда улетела хирагана с катаканой — а их уже не так много, меньше двухсот. И, раз уж мы вспомнили про японцев — там же лежат эмодзи (на самом деле они много где раскиданы в Юникоде, но основные блоки в диапазоне 0x1F3000x1FBFF ). Если подумать о том, что сейчас существуют эмодзи, которые собираются из сразу нескольких кодовых точек (например, эмодзи ‍‍‍ состоит аж из 7 кодов!), то становится совсем жалко тратить на каждую по три байта (7×3 = 21 байт ради одного значка, кошмар же).

1011xxxx xxxxxxxx

Отлично: вышеупомянутый эмодзи ‍‍‍, состоящий из 7 кодовых точек, в UTF-8 занимает 25 байт, а мы уместили его в 14 (ровно по два байта на каждую кодовую точку). Кстати, Хабр отказался его переваривать (как в старом, так и в новом редакторе), так что пришлось вставить его картинкой.

Альтернативные решения: SCSU, BOCU-1

  • Если ваши строки достаточно длинные (от 100-200 символов). В таком случае стоит задуматься о применении алгоритмов сжатия вроде deflate.
  • Если вам необходима ASCII transparency, то есть вам важно, чтобы в закодированных последовательностях не возникали ASCII-коды, которых не было в исходной строке. Потребности в этом можно избежать, если при взаимодействии со сторонними API (например, работая с БД) вы будете передавать результат кодирования как абстрактный набор байт, а не как строки. В противном случае вы рискуете получить непредвиденные уязвимости.
  • Если вы хотите иметь возможность быстро находить границы символов по произвольному смещению (например, при повреждении части строки). Это можно делать, но только просканировав строку от начала (или применив доработку, описанную в предыдущем разделе).
  • Если вам нужно быстро делать операции над содержимым строк (сортировать их, искать в них подстроки, конкатенировать). Для этого строки требуется сначала декодировать, поэтому UTF-C будет медленнее UTF-8 в этих случаях (но быстрее алгоритмов сжатия). Поскольку одна и та же строка всегда кодируется одинаково, точное сравнение декодирования не требует, его можно производить побайтово.

140 символов (правда, отмечу, что сравнение проводилось на одном тексте; для других языков результат может отличаться).
Сравнение UTF-C и LZW

Например: Файл размером 1500 байт в Base64 будет занимать 2000 байт (т.е. на 1/3 больше).

После кодирования размер данных увеличивается

У меня есть текстовые данные в формате XML, и их длина составляет около 816814 байт. Он содержит некоторые данные изображения, а также некоторые текстовые данные. Мы используем алгоритм ZLIB для сжатия, и после сжатия длина сжатых данных составляет 487239 байт.

После сжатия мы кодируем данные с помощью BASE64Encoder. Но после кодирования сжатых данных размер увеличивается и длина закодированных данных составляет 666748 байт.

Почему после кодирования размер данных увеличивается? Существуют ли другие лучшие методы кодирования?

С уважением, Сиддеш.

2 ответы

Как уже отмечалось, когда вы кодируете двоичные 8-битные байты с 256 возможными значениями в меньший набор символов, в данном случае 64 значения, вы обязательно увеличите размер. Для набора n разрешенных символов, коэффициент расширения для случайного двоичного ввода будет log(256)/log(n), минимум.

Если вы хотите уменьшить это влияние, используйте больше символов. Скорее всего, какой бы носитель вы ни использовали, он может прозрачно обрабатывать более 64 символов. Узнайте, сколько их, просто отправив все 256 возможных байтов, и посмотрите, какие из них пройдут. Тщательно протестируйте набор кандидатов, а затем, в идеале, найдите документацию носителя, которая поддерживает этот набор. n <256.

Когда у вас есть набор, вы можете использовать простой запрограммированный арифметический код для преобразования набора 256 в набор n и назад.

ответ дан 14 дек ’12, 16:12

Это совершенно нормально.

Base64 требуется, если ваш передающий носитель не предназначен для передачи двоичных данных, а только текстовых данных (например, XML)

Таким образом, ваш zip-файл получает кодировку base64.

Проще говоря, требуется, чтобы транскодер изменил «не-ASCII» буквы в форму ASCII, но при этом помнил, как вернуться назад.

Как правило, это увеличение размера примерно на 33% ( http://en.wikipedia.org/wiki/Base64#Examples )

Это недостаток base64. Вам лучше использовать протокол, поддерживающий передачу файлов. но для файлов, закодированных в XML, у вас почти нет вариантов.

Это 33% и всегда 33%, относительное увеличение размера не меняется в зависимости от контента — Эсаилия

Не тот ответ, который вы ищете? Просмотрите другие вопросы с метками encoding compression or задайте свой вопрос.

Практикум по курсу информационная безопасность. ИБ512 Модуль 3 Практикум Раздел 3.1 v.11. Автономная некоммерческая организация дополнительного профессионального образования Академия АйТи

Единственный в мире Музей Смайликов

Самая яркая достопримечательность Крыма
Скачать 0.53 Mb.

П Р А К Т И К У М

по программе

Информационная безопасность — 512
Модуль 3
Защита информации с использованием шифровальных (криптографических) средств

Криптографические методы защиты информации

Версия 10 от 17.05.2022

Тема 3.1.2. Криптографические методы защиты информации. (4 ак.ч.) 3

Упражнение № 3.1.2.1. Изучение базовых криптографических операций 3

Задача 3.1.2.1.1. Установка необходимых программ 3

Задача 3.1.2.1.2. Кодирование Base64 3

Задача 3.1.2.1.3. Похищение закрытого ключа шифрования с помощью кодирования Base64 4

Задача 3.1.2.1.4. Кодирование Hex (шестнадцатиричное) 6

Задача 3.1.2.1.5. Изучение операции XOR 7

Задача 3.1.2.1.5. Изучение шифра гаммирования на операции XOR 8

Упражнение № 3.1.2.2. Изучение основных криптографических алгоритмов 10

Задача 3.1.2.2.1. Изучение алгоритмов симметричного шифрования 10

Задача 3.1.2.2.2. Изучение алгоритма асимметричного шифрования RSA 11

Задача 3.1.2.2.3. Изучение алгоритмов хэширования 12

Задача 3.1.2.2.4. Изучение порядка простановки и проверки электронной подписи 12

С помощью технологии виртуальных машин для выполнения лабораторных работ разработана виртуальная машина CCServer. На ней будут проводиться все лабораторные работы.

Для работы используется учётная запись

Pa$$w0rd
В виртуальной машине все необходимые для работы файлы находятся на компакт-диске D:\ и флоппи-дискете A:\.

Тема 3.1.2. Криптографические методы защиты информации. (4 ак.ч.)

Упражнения выполняется на удалённой виртуальной машине

Упражнение № 3.1.2.1.
Изучение базовых криптографических операций

Описание упражнения

Данное упражнение предназначено для практического изучения способов кодирования и операции XOR.

Время выполнения упражнения 90 минут

Задача 3.1.2.1.1. Установка необходимых программ

  1. Присоединитесь к лабораторной машине (см. Введение) и войдите в систему от имени локальной учётной записи Administrator.
  2. Откройте программу Проводник.
  3. Скопируйте папку D:\Temp в диск C:\.
  4. Запустите программу установки приложения CryptoDemo: D:\Install\CryptoDemo\Setup.exe. Согласитесь со всеми параметрами программы установки по умолчанию.

Задача 3.1.2.1.2. Кодирование Base64

  1. Запустите программу cryptography_study, которая располагается по пути C:\Temp\cryptography_study\cryptography_study.exe. Выберете тип кодирования «Преобразование в Base64» как на рисунке.
  1. Данные для кодирования можно ввести в поле ввода «Источник» или загрузить из файла, нажав на кнопку . Введите или загрузите из файла такое сообщение, чтобы сначала были латинские символы, а затем – кириллица, например «Hello world. Привет мир. ». Результат кодирования формируется в нижней части окна «Результат».
  2. Переключите кодировку источника «Текст ASCII»/«Текст UTF-8». Убедитесь, что меняется размер и состав результата.

Необходимы для заполнения строки до надлежащей длины
Почему на каждый третий символ источника, символы «=» изчезают?

Задача 3.1.2.1.3. Похищение закрытого ключа шифрования с помощью кодирования Base64

  1. Создайте текстовый файл на рабочем столе, добавьте в него любой текст и включите шифрование EFS для него. Для этого щёлкните правой кнопкой манипулятора типа «мышь» по файлу. Выберете пункт меню «Свойства». В открывшемся окне свойст во вкладке «Общие» выберете атрибуты «Другие…». В появившемся окне «Дополнительные атрибуты» установите «Шифровать содержимое для защиты данных» и в появившемся окне «Предупреждение при шифровании» выберете «Зашифровать только файл». Далее, нажимая на кнопки «ОК» нужно закрыть все онка.
  1. Для шифрования автоматически будет создан закрытый ключ шифрования и сертификат для учётной записи Администратор. Его нужно сохранить в файл. Для этого нажмите кнопку «Пуск» и выберете пункт меню «Выполнить». В открывшемся окне введите certmgr.msc и нажмите кнопку «ОК». Откроется оснастка управления сертификатами. Раскройте дерево в левой части окна «Сертификаты – текущий пользователь»\«Личное»\«Сертификаты».
  1. Справа в менеджере сертификатов должен отобразиться сертификат «Администратор». Для его сохранения в файл с закрытым ключём нужно нажать по сертификату правой кнопкой манипулятора типа «мышь». В появившемся окне выбрать пункт «Все задачи»\«Экспорт…». В открывшемся окне мастера экспорта сертификатов нажать «Далее >», и в следующем окне обязательно выбрать «Да, экспортировать закрытый ключ» и нажать кнопку «Далее >». В следующем окне ничего не выбирать и нажать кнопку «Далее». Откроется окно ввода нового пароля для сохраняемого ключа. Введите любой пароль, например «1» и нажмите «Далее >». В открывшемся окне с помощью кнопки «Обзор…» выберете имя нового файла и его раположение, например «C:\Temp\» и имя «my» и нажмите кнопку «Далее >». В последнем окне мастера нажмите кнопку «Готово». В указанном расположении появится файл с закрытым ключём. Для примера это будет файл «my.pfx» в директории C:\Temp\.
  1. Запустите программу cryptography_study, которая располагается по пути C:\Temp\cryptography_study\cryptography_study.exe. Она стартует в режиме кадирования «Преобразование в Base64». Выберете загрузку данных из файла «Загрузить как «сырые данные»… » и укажите сохранённый на предыдущем шаге файл.
  1. Кодирование будет выполнено автоматически. Полученные данные нужно сохранить в файл, нажав на кнопку . Выберете имя файла C:\Temp\my.txt.
  1. Закройте программу cryptography_study. Проанализируйте полученный тектовый файл. Это и есть закрытый ключ, который можно распечатать на принтере и вынести за пределы предприятия без использования дисков, дискет и прочих технических средств.

Задача 3.1.2.1.4. Кодирование Hex (шестнадцатиричное)

  1. Запустите программу cryptography_study, которая располагается по пути C:\Temp\cryptography_study\cryptography_study.exe. Выберете тип кодирования «Преобразование в Hex» как на рисунке.

Задача 3.1.2.1.5. Изучение операции XOR

XOR — Сложение по модулю 2 («сумма по модулю 2», «не равно», исключающее «ИЛИ» (ИЛИ с исключением из правила четвёртой комбинации «1,1»), XOR,) — логическая операция (функция), по своему применению максимально приближённая к грамматической конструкции «либо … либо …» или «если операнды не равны, то истинно (1)».
  1. Отредактируйте файл с симметричным ключём C:\Temp\cryptography_study\key.txt при необходимости.
  2. Запустите программу cryptography_study, которая располагается по пути C:\Temp\cryptography_study\cryptography_study.exe. Выберете тип кодирования «xOr шифрование»\«Ключ из файла» как на рисунке. При необходимости отредактируйте текст источника.
  1. Используя кнопку загрузите ключ из файла C:\Temp\cryptography_study\key.txt. Шифрование будет выполнено автоматически. Результат не предназначен для текстового редактирования. Сохраните результат в файл C:\Temp\crypt.dat с помощью кнопки .
  2. Выполните обратное шифрование. Для этого загрузите файл C:\Temp\crypt.dat как источник «Загрузить как ASCII…», нажав на кнопку (в разделе источник) и загрузите ключ из файла C:\Temp\cryptography_study\key.txt, используя кнопку . Убедитесь, что расшифрование произошло корректно.
  1. Измените ключ в файле C:\Temp\cryptography_study\key.txt с «Это ключ шифрования» на «Эт кл ши ов ия» (часть символов заменяется пробелами, длина фразы не меняется!). Выполните расшифрование таким ключём. Проанализируйте результат.

Задача 3.1.2.1.5. Изучение шифра гаммирования на операции XOR

Гаммирование.
  1. Запустите программу cryptography_study, которая располагается по пути C:\Temp\cryptography_study\cryptography_study.exe. Выберете тип кодирования «xOr шифрование»\«Гаммирование» как на рисунке. При необходимости отредактируйте текст источника.
  1. Укажите начальное значение генератора гаммы, например 3. Это начальное значение фактически явяется ключём. Полученный результат сохраните в файл C:\Temp\crypt.dat.
  2. Выполните обратное шифрование. Для этого загрузите файл C:\Temp\crypt.dat как источник «Загрузить как ASCII…», нажав на кнопку (в разделе источник) и укажите то же самое начальное значение генератора гаммы. Убедитесь, что расшиврование производится корректно.
  1. Выберете другое начальное значение генератора гаммы и убедитесь, что расшифрование происходит некорректно.
  2. Закройте все открытые окна.
Сообщите преподавателю о завершении выполнения упражнения

Упражнение № 3.1.2.2.
Изучение основных криптографических алгоритмов

Описание упражнения

Данное упражнение предназначено для практического изучения алгоритмов симметричного и асимметричного шифрования и хэширования.

Почему base64 увеличивает длину строки?

2ord

Потому что на самом деле у вас переход из 256-ричной системы в 64-ричную. Base64 позволяет кодировать любые строки, а не только из 16 символов 0-9,a-f.

Если вы хотите вашу строку интерпретировать как 16 запись, то вам надо ее сначала из hex записи раскодировать. Гуглите HexToBase64, hexToAscii или HexDecode. Какая нибудь такая функция наверняка есть в библиотеке. Или ее можно самостоятельно написать, превращая по 2 символа в 1.

Да, только это все возможно только если у вас длина исходной строки четная.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *