Добавил:
ivanov666
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз:
Предмет:
Файл:Практическая криптография алгоритмы и их программирование
.pdf
Глава 5. Дешифрование современных шифров 181
30. H. Feistel, W. Notz, and J. L. Smith, Some Cryptographic Techniques for Machine-to-Machine DataCommunications, Proceedings of the IEEE, 63 (1975), pp.
1545—1554.
31. J. A. Maiorana, A Class of Bent Functions, R41 Technical Paper, June 1971.
32. S. Mister, Notes on Maiorana Functions and S-Box Design.
33. K. Nyberg, Perfect Nonlinear S-boxes. Advances in Cryptology — Proceedings
of EUROCRYPT '91, Springer-Verlag, Berlin, 1991, pp. 378—385.
34. B. Preneel, W. Van Leekwijck, L. Van Linden, R. Govaerts, and J. Vandewalle,
Propagation characteristics of boolean functions, Advances in Cryptology: Proceedings
of EUROCRYPT '90, Springer-Verlag, Berlin, 1991, pp. 161—173.
35. O. S. Rothaus, On 'Bent' Functions, Journal of Combinatorial Theory, 20(A),
1976, pp. 300—305.
36. A. F. Webster and S. E. Tavares, On the Design of S-Boxes, Advances in Cryptology: Proceedings of CRYPTO '85, Springer-Verlag, New York, 1986, pp. 523—534.
37. A. Youssef, S. Tavares, S. Mister, C. Adams, Linear Approximation of Injective
S-boxes, Electronics Letters, Vol. 31 No. 25, Dec. 7, 1995, pp. 2165—2166.
38. Д. Кнут. Искусство программирования для ЭВМ. Получисленные алгоритмы.
Т.2. — М.: Мир, 1977. 700 с.
39. Н. П. Бусленко, Д. И. Голенко, И. М. Соболь и др. Метод статистических испытаний (Метод Монте-Карло). — М.: Физматгиз, 1962. 337 с.
40. Левитан Ю. Л., И. М. Соболь. О датчике псевдослучайных чисел для ПК, Математическое моделирование. 1990. — Т. 2, ¹ 8. — С. 119 — 126.
41. А. В. Потий, А. К. Пестерев. Принципы системного подхода к сертификации
генераторов псевдослучайных чисел в системах защиты информации. Радиотехника.
Всеукраинский межведомственный научно-технический. сб. 1997. Вып. 104. С.
163—172.
42. Security requirements for Cryptographic Modules. FIPS 140-1. — U.S. Department of Commerse. 1994.
43. J. Soto Randomness Testing of the Advanced Encryption Candidate Algorithms. — NIST, 1999.
44. A. K. Leung, S. E. Tavares. Sequence Complexity as Test for Cryptographic Systems. — Advances in Cryptology — CRYPTO'84. Proc. LNCS, Vol. 196 — Springer-Verlag.
45. Alfred Menezes, et. al. Handbook af Applied Cryptography — CRC Press, 1997.
46. M. Abramowitz and I. Stegun, Handbook of Mathematical Functions, Applied
Mathematics Series. Vol. 55, Washington: National Bureau of Standards, 1964; reprinted
1968 by Dover Publications, New York.
47. T. Cormen, C. Leiserson, & R. Rivest, Introduction to Algorithms. Cambridge,
MA:The MIT Press, 1990.
48. Gustafson et al., «A computer package for measuring strength of encryption algorithms,» Journal of Computers & Security. Vol. 13, No. 8, 1994, pp. 687—697.
49. U. Maurer, «A Universal Statistical Test for Random Bit Generators», Journal of
Cryptology. Vol. 5, No. 2, 1992, pp. 89—105.
50. A. Menezes, et al., Handbook of Applied Cryptography. CRC Press, Inc., 1997.
51. W. Press, S. Teukolsky, W. Vetterling, Numerical Recipes in C : The Art of Scien
tific Computing, 2nd Edition. Cambridge University Press, January 1993.
-

182 Глава 5. Дешифрование современных шифров
52. T. Ritter, «Randomness Tests and Related Topics», http://www.io.com/~ritter/
53. American National Standards Institute: Financial Institution Key Management
(Wholesale), American Bankers Association, ANSI X9.17 — 1985 (Reaffirmed 1991).
54. FIPS 140-1, Security Requirements for Cryptographic Modules, Federal Information Processing Standards Publication 140-1. U.S. Department of Commerce/NIST, National Technical Information Service, Springfield, VA, 1994.
55. FIPS 180-1, Secure Hash Standard, Federal Information Processing Standards
Publication 180-1. U.S. Department of Commerce/NIST, National Technical Information
Service, Springfield, VA, April 17, 1995.
56. FIPS 186, Digital Signature Standard (DSS), Federal Information Processing
Standards Publication 186. U.S. Department of Commerce/NIST, National Technical Information Service, Springfield, VA, May 19, 1994.

Глава 6
Кpиптогpафическое сжатие
In most on-line retrieval systems, large files which are stored in
secondary memory are frequently accessed. These files should
be stored in compacted form, not only to save space, but also
to reduce the respouse-time.
Y. Choueka
В реальной жизни многие задачи не являются столь тривиальными, как, например, задача зашифрования одного файла. Очень часто требуется не только и
не столько зашифровать данные, сколько еще и сделать их хранение и передачу
как можно более эффективной. В программных приложениях активно используются алгоритмы сжатия, а периферийные устройства на аппаратном уровне поддерживают работу методов обеспечения целостности хранимых и передаваемых
данных.
Поскольку речь в книге идет о программных задачах криптографии, невозможно было пройти мимо такой темы, как взаимодействие сжатия и криптографии. На практике задача сжать и зашифровать файл решается обычно, что называется, «в лоб» — сначала данные сжимаются каким-нибудь известным способом
(например, LZW), а затем уже шифруются ГОСТ или другим блочным шифром.
Удачные алгоритмы сжатия (или, как еще говорят, компрессии) позволяют не
только эффективно хранить конфиденциальные данные, но и, например, значительно уменьшить размер программы, которую за один прием можно загрузить в память и исполнить. Существует не меньше дюжины различных упаковщиков исполнимых файлов. Некоторые из них содержат реализации алгоритмов шифрования с целью усложнить жизнь потенциальным хакерам. Но ни в одной из них
алгоритм шифрования никак не связан с алгоритмом сжатия. Они реализованы
как отдельные алгоритмы и используются раздельно.
Возможно, что раздельное существование алгоритмов сжатия и шифрования
связано с существованием своего рода конкуренции целей сжатия и зашифрования. Сжатие — это процесс устранения избыточности представления информации. Шифрование же, наоборот, стремится увеличить энтропию выходных данных с тем, чтобы криптоаналитик не имел возможности использовать статистические зависимости шифротекста для проведения успешного криптоанализа. Тем не
менее может статься, что более удобным и практичным способом сжатия и зашифрования данных будет применение некоторого единого алгоритма, выполняющего функции и зашифрования и сжатия одновременно. Его созданием мы и займемся.
Существует три способа организовать совместное сжатие и зашифрование
данных. Два из них различаются преимущественно тем, какой из алгоритмов —
сжатия или криптографического преобразования данных — применяется к данным первым, а какой вторым.

184 Глава 6. Кpиптогpафическое сжатие
Если сначала применять алгоритм криптографического преобразования данных, то окажется, что алгоритм сжатия не может эффективно работать на шифротекстах хороших криптоалгоритмов. Сжать шифротекст весьма тяжело по той
простой причине, что криптографическая система должна любыми доступными
способами избавлять шифротекст от очевидных внутренних зависимостей, а потому его энтропия будет весьма высокой и уж точно намного выше, чем у открытого текста. Представить себе алгоритм сжатия, который бы хорошо сжимал зашумленные данные, довольно тяжело. Ведь даже интуитивно понятно, что сжатие всецело базируется на избыточности информации в тексте. Шифрование эту
избыточность устраняет, а вместе с ней устраняет и возможность сжать текст.
Можно попытаться применить к данным сначала алгоритм сжатия, а затем
уже зашифровать результат. Теоретически данный метод хорош, но на практике
оказывается, что многие алгоритмы сжатия чрезвычайно структурированы, что
позволяет применять некоторые криптоатаки даже там, где для открытого текста
их применение было бы попросту неоправданным и неэффективным.
Дополнительно отрицательным свойством такого способа является то, что
время применения обоих алгоритмов обычно довольно велико. Неплохо было бы
зашифровывать и сжимать текст одновременно. В этом случае мы могли бы конструктивно устранить структурированность выхода алгоритма и заметно сократить время обработки данных за счет одновременного убиения двух зайцев. Но
для этого нам понадобятся более точные знания о том, как работают алгоритмы
сжатия данных.
Алгоритмы сжатия данных
Сжимаемые данные могут называться по-разному — строка, файл, текст или
двоичные данные, или оцифрованный сигнал. С точки зрения теории предполагается, что данные производятся источником и предоставляются компрессору в
виде символа над некоторым алфавитом. Раньше весь процесс сжатия называли
кодированием источника, поскольку оно призвано удалить избыточность в данных на основе их предсказуемости путем иного представления данных, то есть их
кодирования. За два последних десятилетия картина несколько изменилась. Первой ласточкой стала идея разделить процесс сжатия на два взаимосвязанных процесса — кодирование, непосредственно воспроизводящее сжатый поток символов, и моделирование, предоставляющее всю необходимую для кодирования информацию.
Понятно, что, чем больше знает кодировщик о данных, тем больше он сможет
их сжать. То есть чем лучше модель исходных данных, тем лучше справиться кодировщик со своей задачей и тем лучше будет коэффициент сжатия. Сам коэффициент сжатия выражает отношение длины сжатого текста к длине исходного. В терминах криптографии мы бы назвали исходный текст открытым, а сжатый — шифротекстом. Для коэффициента сжатия можно использовать много разных величин
измерения. Правда, их разнообразие сильно затpудняет сравнение экспериментальных результатов. Наилучшей с точки зрения теории, нашедшей применение на

Глава 6. Кpиптогpафическое сжатие 185
практике, является величина, которая бы не зависела от представления входных
данных. Пожалуй, наиболее удобным с этой точки зрения является измерение
бит/символ (бит на символ). Другие варианты, например, в виде процентов сжатия или сокращения зависят от представления данных на входе кодировщика.
На сегодняшний день существуют сотни различных алгоритмов сжатия без
потерь с адаптивными и статическими моделями представления данных. Их все
можно разбить на непересекающиеся классы или семейства по способу кодирования данных. Каждое семейство призвано сжать текст определенной структуры с
определенной степенью эффективности и быстродействия, в зависимости от того,
что важнее в приложении — скорость или коэффициент сжатия.
Самые первые алгоритмы сжатия не учитывали в полной мере характеристик
текста и потому представляют собой очень простые для реализации алгоритмы.
Таков, например, алгоритм RLE (Run Length Encoding), который еще называют
методом повторений и методом кодиpования длин тиpажей, — это самый простой
и самый быстрый из методов упаковки информации. Эффективно работает он только в том случае, когда сжимаемый текст состоит из часто повторяющихся последовательностей одного символа. Например, в обычном тексте форматирование
абзацев зачастую выполняют добавлением пробелов перед и между словами. Налицо явная избыточность, которую можно устранить следующим образом. Первым символом (обычно это стандартный восьмибитовый байт) сжатого текста кодировщик записывает некоторый «флажок», обозначающий, что далее идет служебная информация, состоящая из двух символов. Понятно, что в теории этот
флажок не должен совпадать ни с одним из символов текста.
Следующим символом в служебной триаде кодировщик записывает количество повторяемых символов. Ну и соответственно третий символ — это экземпляр
того, что нужно повторить (рис. 6.1).
До сжатия (мы можем сжать пять подряд идущих символов 0x14, записав их
всего тремя символами: 0xFF 0x05 0x14, при этом нет смысла сжимать два символа 0x00 в самом начале)
0x00 0x00 0xF0 0x14 0x14 0x14 0x14 0x14 0x00 0xF0 0xFF 0x56 0x67
После сжатия (дополнительно приходится указывать на наличие в исходном тексте служебного символа 0xFF)
0x00 0x00 0xF0 0xFF 0x05 0x14 0x00 0xF0 0xFF 0x01 0xFF 0x56 0x67
Ðèñ. 6.1. Структура кода RLE
На практике, поскольку в тексте используются все символы и «свободных»
символов попросту нет, в качестве флажка используют какой-либо редко используемый символ, например, в случае, когда символы представлены восьмибитовыми байтами, этим символом можно выбрать значение 0xFF, что мы, собственно
говоря, и сделали. В то же время в самом тексте в процессе сжатия нам встретился 0xFF. Оставив его без изменения, мы собьем с толку декодировщик, который

186 Глава 6. Кpиптогpафическое сжатие
постарается разжать текст, используя следующие за ним два байта, на самом деле
не имеющие никакого отношения к служебной информации. Поэтому нам не
остается ничего другого, как закодировать его тремя байтами: 0xFF, 0x01, 0xFF
(см. рис. 6.1), чтобы избежать весьма неприятную ситуацию неправильного разжатия текста. Потери информации, конечно, в исправленном нами варианте не
произойдет, но налицо явный промах алгоритма: вместо того чтобы сжимать
текст, он в итоге сделал его еще больше. Однако очевидно, что если в тексте имеется последовательность из более чем трех одинаковых символов, мы прекрасно
сможем ее сжать с помощью нашего простого алгоритма (кстати, его популярность довольно высока — например, он используется по умолчанию для сжатия
данных в карманных компьютерах Palm).
Даже неспециалисту ясно, что RLE не представляется оптимальным алгоритмом сжатия, поскольку он не использует никакой информации о сжимаемом тексте. Чтобы понять, как происходит сжатие, использующее знания о тексте, вернемся к понятиям энтропии и информативности текста (см. раздел «Энтропия»).
Связь между вероятностями и кодами изучается в алгебраической теории кодирования, основной теорией которой является не кто иной, как Клод Элвуд Шеннон.
Его теоремы кодирования источника используются очень активно и здесь.
Поскольку источник генерирует различные символы неравновероятно и, следовательно, одни символы появляются в тексте гораздо чаще других, кодировщик
должен научиться кодировать их так, чтобы более частым символам соответствовал меньший по длине код, а более редким — соответственно более длинный. Таким образом, мы сжимаем форму представления текста, используя коды различной длины для различных символов.
Согласно изобретенным Шенноном основам теории информации, можно получить ожидаемую длину кода, взяв среднее значение вероятности появления
каждого символа, и мы тут же получим формулу энтропии текста:
=
Hpp
∑
ii
i
ãäå p
— это вероятность появления i-го символа в тексте.
i
log
,
Соответственно чем больше зависимостей между элементами-символами
внутри текста, тем меньше потребуется бит, чтобы их закодировать. Понятно, что
для того, чтобы кодировщик строил эффективные коды для символов, ему необходимо как можно больше знать о самом тексте. Для этого могут быть использованы различные методы, самый простой из них — подсчет частот встречаемости
символа в тексте и назначение ему соответствующей вероятности появления, как
n
i
отношения
, ãäå ni— частота встречаемости i-го символа; N — длина в симво-
N
лах всего текста. Здесь и проявляется впервые задача моделирования текста.
В самом простом варианте моделированием является оценка вероятности появления каждого символа. Таблица вероятностей появления каждого символа,
основанная на подсчете частот их встречаемости, называется моделью первого
приближения (или первого порядка). Таблица, учитывающая более сложные зависимости, например появление одного символа после какого-то другого, имеет

Глава 6. Кpиптогpафическое сжатие 187
соответственно второй и более порядки. С помощью этих вероятностей может
быть вычислена энтропия и построен достаточно эффективный код, позволяющий
сжать текст. Наилучшая средняя длина кода и соответственно степень сжатия достигается моделями, в которых оценки вероятности как можно более точны. При
этом следует помнить, что энтропия является неотъемлемым свойством модели и
сжатие базируется на способе ее вычисления. Отсюда возможная неэффективность практической реализации алгоритма сжатия, который «на бумаге» является
идеальным, а в реальных условиях даст лишь приближенное к лучшим значение
степени сжатия.
Разумно в целях упрощения рассматривать модель оценки вероятности появления каждого символа. В ней оцениваемая вероятность символа иногда называется кодовым пространством, выделяемым символу и соответствует некоторому
разбиению отрезка [0, 1]. Чем больше вероятность одного символа, тем больше
пространства отбирается у других символов. Например, если текст, который мы
хотим сжать, состоит только из символов A, Б, В и Г и при этом буквы А и Б
встречаются в тексте в среднем 2 и соответствено 3 раза из 10, а буквы ВиГ—1
и 4 раза, то таблица вероятностей появления каждого символа будет выглядеть
следующим образом (рис 6.2):
Символ À Á Â Ã
Вероятность 0.2 0.3 0.1 0.4
Ðèñ. 6.2. Таблица вероятностей появления символов
Тогда на отрезке [0, 1] пространства символов можно отметить несколько отрезков, которые полностью заполняют все пространство и однозначным образом
соответствуют каждому из символов (рис. 6.3).
À
0.0—0.2
0.0 1.0
Á
0.2—0.5
Ðèñ. 6.3. Разбиение пространства символов
Â
0.5—0.6
Ã
0.6—1.0
Точность оценок зависит от того, что мы знаем о тексте априори, то есть перед тем, как начнем его сжимать. Знание некоторых вероятностей заранее позволяет нам приступить к сжатию сразу, как только поступят данные. Если же мы
ничего не знаем об их структуре и содержании, нам придется выбрать начальные
значения произвольным образом. В таких случаях говорят, что мы не обладаем
контекстуальным знанием. Зато мы можем договориться о какой-то фиксированной начальной таблице и использовать ее для сжатия и декомпрессии текстов.
Если мы знаем хотя бы, что сжимать придется литературный текст на русском
языке, то очевидно, что мы можем заранее посчитать частоты встречаемости символов и соответствующие вероятности модели первого приближения.

188 Глава 6. Кpиптогpафическое сжатие
В то же время никто не мешает нам изменять модель приближения уже во
время сжатия. Таким образом, мы как бы изменяем работу кодировщика на новый
лад, подстраиваясь под конкретный текст, который необходимо сжать. Делается
это достаточно просто.
Как уже было сказано, обычный алгоритм сжатия (который называют статичным или статическим алгоритмом сжатия
35
) состоит из двух частей — кодировщика и некоторой части, отвечающей за моделирование текста. Само моделирование выполняется один раз: либо в процессе конструирования алгоритма, либо перед каждым началом процесса сжатия. В любом случае кодировщик получает
фиксированный «снимок» — модель текста, с которой он работает. В процессе кодирования-сжатия модель не изменяется. Понятно, что в этом случае, если мы не
знаем, что за текст мы будем сжимать, мы не сможем предложить модель, которая будет всегда соответствовать тексту. В этом случае кодировщик не сможет
справиться со своей задачей. Следовательно, необходимо либо узнать о тексте
всю возможную информацию заранее, либо изменять модель приближения текста
прямо в процессе сжатия. Первый способ неплох, но для его работы нам понадобится один раз пробежаться по всем данным, чтобы посчитать модель приближения, и затем еще раз, чтобы, собственно, уже их сжимать. Кроме того, он не учитывает локальных характеристик текста, когда, например, в тексте сначала идут
только русские буквы, а затем лишь английские.
Получается, что если мы просто посчитаем таблицу вероятностей появления
символов заранее, то мы не учтем порядок их расстановки в тексте. Кроме этого,
даже посчитав значения таблицы вероятностей перед сжатием, мы должны будем
сохранить или передать саму таблицу вместе со сжатыми данными, чтобы обеспечить правильноe разжатие-декодирование, а это дополнительные накладные расходы. Алгоритм сжатия не гарантирует даже того, что накладные расходы на передачу таблицы вероятностей оправдаются, — длина сжатого текста в конечном
счете может стать даже больше, чем исходного.
Очевидно, решением дилеммы является использование второго варианта
сжатия, при котором модель динамически изменяется в процессе сжатия. Такие
алгоритмы носят название динамических, а также адаптивных.
Общая схема работы адаптивного алгоритма сжатия выглядит так (см. листинг 6.1):
Листинг 6.1
1. Взять некоторую начальную таблицу вероятностей P0.
2. Текущей моделью P сделать P0.
3. Получить символ C текста.
4. Закодировать символ текста в соответствии с моделью P.
5. Модифицировать модельPспомощьюсимвола C.
6. Перейти к п.3 или остановиться, если текст закончился.
35
Следуя принятой терминологии, более правильно называть такие алгоритмы «алгорит
мами с фиксированной моделью приближения текста». Авторы не делают этого в силу своей
природной лени, приступы которой одолевают их при написании длинных названий в одной
строке текста.
-

Глава 6. Кpиптогpафическое сжатие 189
Обновление модели на самом деле реализуется очень просто и заключается
лишь в пересчете таблицы вероятностей появления символов в соответствии с новой частотой появления символа C. Поясним работу адаптивного алгоритма на
примере начальной таблицы, данной на рис. 6.2, и тексте «АААБГВ». Для того
чтобы формулы расчета значений вероятности появления символов были как
можно более просты, будем вести запись значений в таблице не вещественными
числами — записывая вероятности символов, а целыми — записывая частоты их
появления за время работы алгоритма.
Символ À Á Â Ã
Частота появления 2 3 1 4
Ðèñ. 6.4. Начальная таблица вероятностей
Например, вероятность нахождения буквы «А» в тексте оценивается ее двумя
появлениями за десять обработанных символов текста, буквы «Б» — тремя и т. д.
Кодируя текст «АААБГВ», выберем в качестве P0 таблицу на рис 6.4.
Закодировав первый символ А (длина битовой строки, которая для этого по-
надобится, равна
3
−=log ,
11
1299282984
бита), изменим таблицу, прибавив еди-
ничку к счетчику, соответствующему символу А в таблице вероятностей. Его значение будет уже равняться трем. Затем обработаем следующий символ А. Теперь
длина битовой строки составит уже
4
−=log ,
12
1 098612289
бита. Как видно, по-
сле того как «появилась надежда» на то, что символ А является часто встречающимся, длина битовой строки, которая необходима для его кодирования, начала
уменьшаться. После того как мы обработаем символ А в строке в третий раз, дли-
на его битового представления станет равной
5
−=log ,
0 9555114451
13
áèòà. Ïðè
этом длина битовых строк для кодирования других символов соответствующим
образом увеличивалась. Но после того как кодировщик встретит символ Б, длина
его битовой строки уменьшится (равна
4
−=log ,
13
1 466337069
много (и станет равной
до этого), а вот для символа А увеличится, хоть и нена-
5
− log ,
1 029619417
14
4
−=log ,
14
).
1252762969
бита, вместо
В конце процесса получим такую же таблицу, как на рис. 6.5.
Символ À Á Â Ã
Частота появления 5 4 2 5
Ðèñ. 6.5. Адаптивно измененная таблица вероятностей

190 Глава 6. Кpиптогpафическое сжатие
Приглядившись к ошеломляющим своей точностью длинам битовых строк,
возникает еще один вопрос: каким образом кодировщик вообще может закодировать битовую строку нецелой длины?
Кодировщики, работающие с целочисленной точностью, то есть способные
представлять символы битовыми строками целой длины, оказываются неэффективными, поскольку из-за практических ограничений сводится на нет вся теоретическая эффективность сжатия, заключающаяся в точности представления символа в соответствии с энтропией текста.
Кроме того, важно, чтобы значения вероятностей, присваемых моделью, не
были бы нулевыми, поскольку в этом случае длины битовых строк этих символов
будут равны
−=∞log 0
, то есть кодировщик постарается сгенерировать строку
бесконечной длины. Ему это конечно же вряд ли удастся.
Наличие же нулевой вероятности в тексте, вообще говоря, достаточно часто
встречающийся на практике факт, поскольку это означает, что символ не встречался алгоритму на данном шаге еще ни разу. Данную проблему можно обойти,
сразу установив все счетчики в единицу (либо использовав подходящую начальную таблицу, как сделали мы в приведенном выше примере) либо используя для
всех таких символов один дополнительный счетчик.
Пожалуй, самым известным представителем алгоритмов сжатия, использующих информацию о тексте, является метод двоичных деревьев Хаффмана.
Суть данного алгоритма заключается в построении двоичного дерева с узловыми элементами из символов сжимаемого текста. Каждой ветви назначается
«вес» — битовый ноль или единица. Кодирование каждого символа осуществляется проходом по дереву и выбором одной из двух ветвей, начиная с корня
дерева и заканчивая листочком, на котором «сидит» нужный символ. Моделирование для данного алгоритма может быть выбрано любого типа из уже обсужденных нами.
Проще всего можно рассмотреть алгоритм Хаффмана на примере сжатия.
Предположим снова, что нам надо заархивировать нашу уже ставшую старой знакомой строку «АААБГВ». До сжатия эта последовательность занимает 6 символов (пусть это будут байты). Сжатая по методу RLE, строка выглядела бы так же,
поскольку для последовательности символов А невыгодно использовать сжатие — строка от этого меньше не станет.
Алгоритм же Хаффмана может сократить ее почти до двух байтов, и вот как
это происходит. Прежде всего, отметим, что разные символы встречаются в нашем тексте по-разному, то есть, по сути, приступим к моделированию текста. Для
этого можно составить таблицу частот и увидеть, что чаще всего присутствует
буква «A» (рис. 6.6).
Символ À Á Â Ã
Частота появления 3111
Ðèñ. 6.6. Таблица частот символов в строке «АААБВГ»
Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]
