Добавил:
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

2-1 Криптография / ЛБ_2 / ЛБ4 МОКр Исследование способов представления информации

.pdf
Скачиваний:
2
Добавлен:
31.01.2021
Размер:
590.46 Кб
Скачать

МАТЕМАТИЧЕСКИЕ ОСНОВЫ КРИПТОЛОГИИ

Лабораторная работа №4

Исследование способов представления информации в

криптографических системах

Цель работы: исследовать обратимые сжимающие преобразования, используемые для предварительной обработки исходных текстов, и освоить методику сравнения их эффективности.

Задание:

1.Исследовать представления символов в кодировках ASCII и UNICODE, а также способы преобразования строк символов в числа.

2.Исследовать различные порядки следования байтов в машинных словах и зафиксировать их отличия для слов различного размера.

3.Провести кодирование информации с помощью метода равномерного кодирования. Подсчитать количество информации, необходимое для хранения текста, закодированного подобным образом.

4.Провести кодирование информации с помощью метода кодирования по Шеннону-Фано. Подсчитать количество информации, необходимое для хранения текста, закодированного подобным образом.

5.Провести кодирование информации с помощью метода кодирования по Хаффману. Подсчитать количество информации, необходимое для хранения текста, закодированного подобным образом. С помощью программы Huffman.exe проверить результаты и сделать выводы.

6.Исследовать возможности метода арифметического кодирования. Зафиксировать сложности реализации данного метода кодирования.

7.Обосновать методы декодирования информации для каждого из четырех видов кодирования.

Теория:

Код — правило (алгоритм) сопоставления каждому конкретному сообщению строго определённой комбинации символов (знаков) (или сигналов). Кодом также называется отдельная комбинация таких символов (знаков) — слово. Для различия этих терминов, код в последнем значении ещё называется кодовым словом.

Процесс преобразования сообщения в комбинацию символов в соответствии с кодом называется кодированием, процесс восстановления сообщения из комбинации символов называется декодированием. Для наглядного описания кодов используются кодовые деревья.

 

Представление байтов в машинных словах

 

 

Порядок байтов в информатике — метод записи байтов многобайтовых

чисел.

 

 

В общем случае, когда нужно компактно записать число, большее 255

(

— максимальное целое число, записываемое одним байтом (октетом))

необходимо использовать несколько байтов. Число

факторизуется по

основанию 256:

 

Набор чисел ,…, и является последовательностью байтов для записи.

Порядок от младшего к старшему.

Порядок от младшего к старшему или «остроконечный» (англ. little-endian): ,…, , запись начинается с младшего и заканчивается старшим. Этот порядок записи принят в памяти персональных компьютеров с x86-процессорами, в связи с чем, иногда, его называют интеловский порядок байтов (по названию фирмы-создателя архитектуры x86).

Порядок от старшего к младшему.

Порядок от старшего к младшему или «тупоконечный» (англ. big-endian): ,…, , запись начинается со старшего и заканчивается младшим. Этот порядок является стандартным для протоколов TCP/IP, он используется в заголовках пакетов данных и во многих протоколах более высокого уровня, разработанных для использования поверх TCP/IP. Поэтому, порядок байтов от старшего к младшему часто называют

сетевым порядком следования байтов (англ. network byte order).

Этот порядок байтов используется процессорами IBM 360/370/390, Motorola 68000, SPARC (отсюда третье название — порядок байтов Motorola, Motorola byte order).

Порядок байтов от старшего к младшему применяется в многих форматах файлов – например, PNG.

Переключаемый порядок. Многие процессоры могут работать и в порядке от младшего к старшему, и в обратном, например, ARM, PowerPC (но не PowerPC 970), DEC Alpha, MIPS, PA-RISC и IA-64. Обычно порядок байтов выбирается программно во время инициализации операционной системы, но может быть выбран и аппаратно перемычками на материнской плате. В этом случае правильнее говорить о порядке байтов операционной системы. Переключаемый порядок байтов иногда называют англ. bi-endian.

Смешанный порядок. Смешанный порядок байтов (англ. middle-endian) иногда используется при работе с числами, длина которых превышает машинное слово. Производится факторизация числа на машинные слова, которые записываются в формате, естественном для данной архитектуры, но сами слова записываются в обратном порядке.

Классический пример middle-endian — представление 4-байтных целых чисел на 16-битных процессорах семейства PDP-11 (известен как PDP-endian). Для представления двухбайтных значений (слов) использовался порядок little-endian, но 4-хбайтное двойное слово записывалось от старшего слова к младшему.

В процессорах VAX и ARM используется смешанное представление для длинных вещественных чисел.

Сравнение. Существенным достоинством little-endian по сравнению с big-endian порядком записи считается возможность «неявной типизации» целых чисел при

чтении меньшего объёма байт (при условии, что читаемое число помещается в диапазон). Так, если в ячейке памяти содержится число 0x00000022, то прочитав его как int16 (два байта) мы получим число 0x0022, прочитав один байт — число

0x22.

Обратно, считается что у little-endian, по сравнению с big-endian есть «неочевидность» значения байтов памяти при отладке (последовательность байтов (33, 44, 55, 12) на самом деле значит 0x12554433, для big-endian эта последовательность (33, 44, 55, 12) читалась бы «естественным» для арабской записи чисел образом: 0x33445512). Наименее удобным в работе считается middle-endian формат записи; он сохранился только на старых платформах.

Для записи длинных чисел (чисел, длина которых существенно превышает разрядность машины) обычно предпочтительнее порядок слов в числе littleendian (поскольку арифметические операции над длинными числами производятся от младших разрядов к старшим). Порядок байтов в слове — обычный для данной архитектуры.

Кодирование символов в информационных системах

На сегодняшний день используются две основные системы для представления символьной информации в вычислительных машинах: это системы ASCII и UNICODE. Они используются совместно, не конфликтуя, а дополняя друг друга в практических задачах.

ASCII

ASCII (англ. Ameri an Standard Code for Informa on Inter ange —

американский стандартный код для обмена информацией; по-американски произносится *э ски+, тогда как в Великобритании чаще произносится *а ски+; порусски также произносится *а ски]).

ASCII представляет собой 7-битную кодировку для представления десятичных цифр, латинского и национального алфавитов, знаков препинания и управляющих символов. В компьютерах обычно используют 8-битные расширения ASCII.

 

.0

.1

.2

.3

.4

.5

.6

.7

.8

.9

.A

.B

.C

.D

.E

.F

0.

NUL

SOH

STX

ETX

EOT

ENQ

ACK

BEL

BS

TAB

LF

VT

FF

CR

SO

SI

1.

DLE

DC1

DC2

DC3

DC4

NAK

SYN

ETB

CAN

EM

SUB

ESC

FS

GS

RS

US

2.

 

!

"

#

$

%

&

'

(

)

*

+

,

.

/

3.

0

1

2

3

4

5

6

7

8

9

:

;

<

=

>

?

4.

@

A

B

C

D

E

F

G

H

I

J

K

L

M

N

O

5.

P

Q

R

S

T

U

V

W

X

Y

Z

[

\

]

^

_

6.

`

a

b

c

d

e

f

g

h

i

j

k

l

m

n

o

7.

p

q

r

s

t

u

v

w

x

y

z

{

|

}

~

DEL

Национальные варианты ASCII. Стандарт ISO 646 (ECMA-6) предусматривает возможность размещения национальных символов на месте @ * \ ] ^ ` { | } ~. В дополнение к этому, на месте # может быть размещён £, а на месте $ — ¤. Такая система хорошо подходит для европейских языков, где нужны лишь несколько дополнительных символов. Вариант ASCII без национальных символов называется US-ASCII, или «International Reference Version».

Для некоторых языков с нелатинской письменностью (русского, греческого, арабского, иврита) существовали более радикальные модификации ASCII. Одним из вариантов был отказ от строчных латинских букв — на их месте размещались национальные символы (для русского и греческого — только заглавные буквы). Другой вариант — переключение между US-ASCII и национальным вариантом «на лету» с помощью символов SO (Shift Out) и SI (Shift In) — в этом случае в национальном варианте можно полностью устранить латинские буквы и занять всё пространство под свои символы.

Впоследствии оказалось удобнее использовать 8-битные кодировки (кодовые страницы), где нижнюю половину кодовой таблицы (0—127) занимают символы US-ASCII, а верхнюю (128—255) — дополнительные символы, включая набор национальных символов. В UNICODE первые 128 символов тоже совпадают с соответствующими символами US-ASCII.

Верхняя половина таблицы в настоящее время активно используется для представления кириллических символов, и её вариации (КОИ-8, Windows-1251 и другие) доставляют основные проблемы с кодировками.

Кириллица

КОИ-7 — семибитная кодировка для русского языка, основанная на ASCII. КОИ-7 описана вместе с КОИ-8 в ГОСТ 19768-74 (сейчас недействителен). КОИ-7 включает в себя 3 «набора» — Н0, Н1, Н2. Н0 — это просто US-ASCII; в Н1 все латинские буквы заменены на русские; в Н2 заглавные латинские буквы оставлены, а строчные заменены на заглавные русские (наличие только заглавных букв в Н2 не создавало особых проблем, поскольку до начала 90-х гг. существовала традиция использовать в текстах программ только заглавные буквы; большинство печатающих устройств также могло печатать только заглавные буквы). На практике использовался либо набор Н2 сам по себе, либо Н0/Н1 с переключением.

CP866. «Альтернативная кодировка» – основанная на CP437 кодовая страница, где все специфические европейские символы во второй половине заменены на кириллицу, оставляя псевдографические символы нетронутыми. Следовательно, это не портит вид программ, использующих для работы текстовые окна, а также обеспечивает использование в них символов кириллицы.

Исторически существовало много вариантов альтернативной кодировки, но все различия касаются только области 0xF0 — 0xFF (240—255). Использовались всевозможные русификаторы-самоделки, писавшиеся независимо частными

программистами, распространяясь по знакомству и через редкие компьютерные центры.

Окончательным стандартом стала кодировка IBM CP866, поддержка которой была добавлена в MS-DOS версии 6.22. В этой кодировке записываются имена файлов в системе FAT (и короткие имена в VFAT). Поныне является популярной стандартной кодировкой Mi rosoft в среде DOS и OS/2, используется в консоли русифицированных систем семейства Windows NT. Вне среды MS-DOS в Mi rosoft Windows заменена стандартной кодировкой CP1251, а в операционных системах Windows NT и следующих за ней (Windows 2000, Windows XP, Windows

Server 2003, Windows Vista, Windows Server 2008) – кодировкой UNICODE.

Windows CP1251. Windows-1251 – набор символов и кодировка, являющаяся стандартной 8-битной кодировкой для всех русских версий Mi rosoft Windows. Пользуется довольно большой популярностью. Была создана на базе кодировок, использовавшихся в ранних «самопальных» русификаторах Windows в 1990-1991 гг. совместно представителями «Параграфа», «Диалога» и российского отделения Mi rosoft. Первоначальный вариант кодировки сильно отличался от представленного ниже в таблице (в частности, там было значительное число «белых пятен»).

Windows-1251 выгодно отличается от других 8 битных кириллических кодировок (таких как CP866, KOI8-R и ISO 8859-5) наличием практически всех символов, использующихся в русской типографике для обычного текста (отсутствует только знак ударения); она также содержит все символы для близких к русскому языку языков: украинского, белорусского, сербского и болгарского.

UNICODE

нико д, или нико д(англ. Uni ode) — стандарт кодирования символов, позволяющий представить знаки практически всех письменных языков.

Стандарт

предложен в 1991 году некоммерческой организацией

«Консорциум

никода» (англ. Uni ode Consortium, Uni ode In .), объединяющей

крупнейшие IT-корпорации. Применение этого стандарта позволяет закодировать очень большое число символов из разных письменностей: в документах Uni ode могут соседствовать китайские иероглифы, математические символы, буквы греческого алфавита, латиницы и кириллицы, при этом становятся ненужными кодовые страницы.

Стандарт состоит из двух основных разделов: универсальный набор символов (UCS, Universal Character Set) и семейство кодировок (UTF, Unicode Transformation Format). ниверсальный набор символов задаёт однозначное соответствие символов кодам – элементам кодового пространства, представляющим неотрицательные целые числа. Семейство кодировок

определяет машинное представление последовательности кодов UCS.

 

Коды в стандарте

никод разделены на несколько областей.

Область с

кодами от U+0000

до U+007F содержит символы набора

ASCII с

соответствующими кодами. Далее расположены области знаков различных письменностей, знаки пунктуации и технические символы. Часть кодов зарезервирована для использования в будущем. Под символы кириллицы выделены области знаков с кодами от U+0400 до U+052F, от U+2DE0 до U+2DFF,

от U+A640 до U+A69F.

Способы представления. никод имеет несколько форм представления

(англ. Unicode Transformation Format, UTF): UTF-8, UTF-16 (UTF-16BE, UTF-16LE) и UTF-32 (UTF-32BE, UTF-32LE). Была разработана также форма представления UTF-7 для передачи по семибитным каналам, но из-за несовместимости с ASCII она не получила распространения и не включена в стандарт.

В Mi rosoft Windows NT и основанных на ней системах Windows 2000 и Windows XP в основном используется форма UTF-16LE. В UNIX-подобных операционных системах GNU/Linux, BSD и Ma OS X принята форма UTF-8 для файлов и UTF-32 или UTF-8 для обработки символов в оперативной памяти.

UTF-8. UTF-8 – это представление никода, обеспечивающее наилучшую совместимость со старыми системами, использовавшими 8-битные символы. Текст, состоящий только из символов с номером меньше 128, при записи в UTF-8 превращается в обычный текст ASCII. И наоборот, в тексте UTF-8 любой байт со значением меньше 128 изображает символ ASCII с тем же кодом. Остальные символы никода изображаются последовательностями длиной от 2 до 6 байтов (на деле, только до 4 байт, поскольку в никоде нет символов с кодом больше 10FFFF и вводить их в будущем не собираются), в которых первый байт всегда имеет вид 11xxxxxx, а остальные – 10xxxxxx.

UTF-16 — один из способов кодирования символов из Uni ode в виде последовательности 16-битных слов. Символы с кодами меньше 0x10000 ( ) представляются как есть, а символы с кодами 0x10000-0x10FFFE – в виде последовательности двух 16-битных слов, первое из которых лежит в диапазоне 0xD800-0xDBFF, а второе – 0xDC00-0xDFFF. Легко видеть, что имеется как раз

таких комбинаций.

В потоке данных UTF-16 старший байт может записываться либо перед младшим (UTF-16 Big Endian), либо после младшего (UTF-16 Little Endian). Иногда кодировку никода Big Endian (UTF-16BE) называют Юникодом с обратным порядком байтов. Аналогично существует два варианта четырёхбайтной кодировки – UTF-32BE и UTF-32LE.

Способы кодирования информации

Равномерное кодирование. Для алфавита с символами используются кодовые слова с длиной . В этом случае неиспользованными остаются кодовых слов, а остальным проставляются в соответствие символы

первичного алфавита.

Коды переменной длины. Первое правило построения кодов с переменной длиной вполне очевидно. Короткие коды следует присваивать часто

встречающимся символам, а длинные – редко встречающимся. Однако есть другая проблема. Эти коды нужно назначать так, чтобы их было возможно декодировать однозначно, а не двусмысленно. Рассмотрим пример.

Пусть имеются четыре символа , , и . Если они появляются в последовательности данных с равной вероятностью (=0.25 каждая), то им просто присвоим четыре двухбитовых кода 00, 01, 10 и 11. Все вероятности равны, и поэтому коды переменной длины не сожмут эти данные. Для каждого символа с коротким кодом найдется символ с длинным кодом и среднее число битов на символ будет не меньше 2. Избыточность данных с равновероятными символами равна нулю, и строку таких символов невозможно сжать с помощью кодов переменной длины (или любым иным методом).

Символ

Вероятность

Code1

Code2

 

0.49

1

1

 

0.25

01

01

 

0.25

010

000

 

0.01

001

001

Предположим теперь, что эти четыре символа появляются с разными вероятностями, указанными в таблице, т.е. появляется в строке данных в среднем почти в половине случаев, и имеют равные вероятности, а возникает крайне редко. В этом случае имеется избыточность, которую можно удалить с помощью переменных кодов и сжать данные так, что потребуется меньше 2 битов на символ. На самом деле, теория информации говорит нам о том, что наименьшее число требуемых битов на символ в среднем равно 1.57, т.е., энтропии этого множества символов.

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

. Это число весьма близко к теоретическому минимуму. Рассмотрим последовательность из 20 символов

,

в которой четыре символа появляются, примерно, с указанными частотами. Этой строке будет соответствовать кодовая строка кода Code1 длины 37 битов

,

которая для удобства разделена черточками. Здесь требуется 37 битов, чтобы закодировать 20 символов, т.е. в среднем 1.85 битов на символ, что не слишком отличается от вычисленной ранее средней величины (строка является короткой, и для того, чтобы получить результат, близкий к теоретическому, необходимо взять входной файл размером хотя бы несколько тысяч символов).

Однако, если теперь декодировать эту двоичную последовательность, то обнаруживается, что Code1 совершенно не годен. Первый бит последовательности равен 1, поэтому первым символом может быть только , так как никакой другой код в таблице для Code1 не начинается с 1. Следующий

бит равен 0, но коды для ,

и

все начинаются

с 0

и поэтому декодер

должен читать следующий бит. Он равен 1, однако коды

для

и оба имеют в

начале 01. Декодер не знает, как ему поступить. Возможно декодирование строки как …, то есть …, то ли как …, то есть … При этом анализ поступающих позже битов последовательности не поможет исправить положение. Код Code1 является двусмысленным. В отличие от него, код Code2 дает при декодировании всегда однозначный результат.

Code2 имеет одно важное свойство, которое делает его лучше, чем Code1, которое называется свойством префикса. Это свойство можно сформулировать так: если некоторая последовательность битов выбрана в качестве кода какого-то символа, то ни один код другого символа не может иметь в начале эту последовательность (не может быть префиксом). Если строка «1» же была выбрана в качестве целого кода для , то ни один другой код не может начинаться с 1 (то есть, все они должны начинаться на 0). Если строка «01» является кодом для , то другие коды не должны начинаться с 01. Вот почему коды для и должны начинаться с 00. Естественно, они будут «000» и «001».

Значит, выбирая множество кодов переменной длины, необходимо соблюдать два принципа:

1)следует назначать более короткие коды часто встречающимся символам;

2)коды должны удовлетворять свойству префикса.

Следуя этим принципам, можно построить короткие, однозначно декодируемые коды, но не обязательно наилучшие (самые короткие) коды. В дополнение к этим принципам необходим алгоритм, который всегда порождает множество самых коротких кодов (которые в среднем имеют наименьшую длину).

Декодирование. Предположим, что некоторый файл был сжат с помощью кодов переменной длины (префиксных кодов). Для того, чтобы сделать декомпрессию, декодер должен знать префиксный код каждого символа. Эту проблему можно решить тремя способами.

1)Множество префиксных кодов один раз выбрано и используется всеми кодерами и декодерами. Такой метод используется в факсимильной связи.

2)Кодер делает свою работу в два прохода. На первом проходе он читает сжимаемый файл и собирает статистические сведения. На втором проходе происходит собственно сжатие. В перерыве между проходами декодер на основе собранной информации создает наилучший префиксный код именно для этого файла. Такой метод дает замечательные результаты по сжатию, но он, обычно, слишком медлителен для практического использования. Также нужно добавлять таблицу построенных префиксных кодов в сжатый файл, чтобы ее знал декодер. Это ухудшает общую производительность алгоритма.

Такой подход в статистическом сжатии принято называть полуадаптивной компрессией.

3)Адаптивное сжатие применяется как кодером, так и декодером. Кодер начинает работать, не зная статистических свойств объекта сжатия. Поэтому первая часть данных сжимается не оптимальным образом, однако, по мере сжатия и сбора статистики, кодер улучшает используемый префиксный код, что приводит к улучшению компрессии.

Алгоритм Шеннона-Фано . Алгоритм Шеннона-Фано – один из первых алгоритмов сжатия, который впервые сформулировали американские ученые Шеннон и Фано. Данный метод сжатия имеет большое сходство с алгоритмом Хаффмана, который появился на несколько лет позже. Алгоритм использует коды переменной длины.

Основные этапы:

1) Символы первичного алфавита выписывают в порядке убывания вероятностей.

2)Символы полученного алфавита делят на две части, суммарные вероятности символов которых максимально близки друг другу.

3)В префиксном коде для первой части алфавита присваивается двоичная цифра «0», второй части – «1».

4)Полученные части рекурсивно делятся и их частям назначаются соответствующие двоичные цифры в префиксном коде.

Код Шеннона-Фано строится с помощью дерева. Построение этого дерева

начинается от корня. Все множество кодируемых элементов соответствует корню дерева (вершине первого уровня). Оно разбивается на два подмножества с примерно одинаковыми суммарными вероятностями. Эти подмножества соответствуют двум вершинам второго уровня, которые соединяются с корнем. Далее каждое из этих подмножеств разбивается на два подмножества с примерно одинаковыми суммарными вероятностями. Им соответствуют вершины третьего уровня. Если подмножество содержит единственный элемент, то ему соответствует концевая вершина кодового дерева; такое подмножество разбиению не подлежит. Подобным образом поступаем до тех пор, пока не получим все концевые вершины.

Пример: код (частота встречаемости): A (50), B (39), C (18), D (49), E (35), F (24).

Тут вы можете оставить комментарий к выбранному абзацу или сообщить об ошибке.

Оставленные комментарии видны всем.