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

Практическая криптография алгоритмы и их программирование

.pdf
Скачиваний:
0
Добавлен:
08.09.2026
Размер:
2 Мб
Скачать
Глава 5. Дешифрование современных шифров 181
30. H. Feistel, W. Notz, and J. L. Smith, Some Cryptographic Techniques for Mac­hine-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 Crypto­logy: 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. Depart­ment of Commerse. 1994.
43. J. Soto Randomness Testing of the Advanced Encryption Candidate Algo­rithms. — NIST, 1999.
44. A. K. Leung, S. E. Tavares. Sequence Complexity as Test for Cryptographic Sys­tems. — Advances in Cryptology — CRYPTO'84. Proc. LNCS, Vol. 196 — Springer-Ver­lag.
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 algo­rithms,» 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/~rit­ter/
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 Informa­tion Processing Standards Publication 140-1. U.S. Department of Commerce/NIST, Nati­onal 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 In­formation 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. Таблица частот символов в строке «АААБВГ»
Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]