Журнал «Компьютерра» № 8 от 27 февраля 2007 года - Компьютерра Журнал 619 5 стр.


Ни одного ключа устройства на сегодняшний день, насколько известно, публично не скомпрометировано. До появления работы Arnezami все успешные случаи обхода защиты AACS так или иначе были связаны с отысканием ключа названия в оперативной памяти компьютера при воспроизведении фильма программным плеером (WinDVD). Понятно, что подобные атаки весьма замысловаты с технической точки зрения. А для человека, далекого от анализа дампов памяти, единственная возможность сделать резервную копию HD-диска сводилась к поиску в Сети уже вскрытого и опубликованного кем-то title key для данного фильма.

Но затем появился Arnezami, который придумал иной ход — анализировать не память, а канал обмена информацией между HD DVD-приводом и компьютером. Arnezami справедливо предположил, что в таком канале информационная избыточность намного меньше, чем в оперативной памяти, а значит, легче выявить и формируемые при обработке ключи. Чтобы длинная история стала покороче, Arnezami применил общедоступную программу-сниффер для анализа передач по USB-каналу (SniffUSB.exe) и действительно сумел выделить сгенерированный плеером processing key для имевшегося у него фильма (King Kong). Но главное — попутно, с помощью соратников по форуму, неожиданно выяснилось, что этот же ключ обработки подходит и для всех остальных фильмов, выпущенных на дисках HD DVD. А также и для всех проверенных фильмов на дисках Blu-ray. Что, вообще говоря, из спецификаций AACS следовать не должно.

Согласно этим спецификациям, каждый плеер имеет уникальный набор из нескольких сотен device keys, на основе которых может быть вычислено несколько миллиардов ключей обработки. В принципе, processing keys вполне могут совпадать для разных плееров, но при столь внушительном их числе каждый конкретный ключ обработки по законам теории вероятностей должен совпадать лишь у небольшой доли плееров по всему миру. А каждый конкретный фильм, в свою очередь, имеет на диске список идентификаторов тех ключей обработки, которые могут расшифровать контент, — то есть любого из перечисленных processing key достаточно для расшифровки title key и доступа к контенту.

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

Понятно, что теперь сообщество ожидает реакцию со стороны AACS-консорциума — блокирования скомпрометированных ключей/устройств или чего-то еще в этом роде. Однако общий уровень знаний о хитростях работы AACS уже успел вырасти настолько, что, как выразился один из комментаторов, теперь очень сложно будет «затолкать выдавленную пасту обратно в тюбик».

ТЕМА НОМЕРА: История, порезанная тонкими ломтиками: Языки программирования. Вдоль и поперек

Интересное свойство всех или почти всех мэйнстримовых языков — они находятся в русле одной традиции, которую можно проследить вплоть до ассемблера и машинных кодов (выполнение инструкций по порядку, оперирование с именованными ячейками памяти — то, что называется императивным программированием). Такой способ написания программ естественным образом вытекает из самой фон-неймановской архитектуры — как литературный классицизм, построенный на «стройности и логичности самого мироздания», строго блюдущий традиции, зародившиеся еще в античности.

В оппозиции к «классицистическим» языкам всегда находились языки программирования, авторы которых основывались на собственных концепциях, не желая ограничиваться «естественными для компьютера» условиями; зачастую (но не всегда) идеологическая стройность ставилась выше практичности и вообще применимости к реальным задачам. Такие, условно говоря, «модернистские» языки (Smalltalk, Lisp, Haskell, Prolog) выглядят непривычно для «традиционного» программиста, их изучение требует определенных усилий [Интересно, кстати, что существует довольно распространенное среди программистов мнение: «профессиональный программист легко и быстро освоит любой новый язык, потому что все языки, в общем-то, похожи». Как правило, к этому мнению склонны именно программисты «классицистической» школы, и в ее рамках оно действительно верно; в противоположность этому изучение совершенно незнакомого модернистского языка обычно требует немалых усилий и времени], но и значительно расширяет кругозор и заставляет изменить взгляд на программирование как таковое. «Модернистский» подход предлагает «взгляд на программирование с другой стороны» — который, как предполагается, дает программисту возможности совершенно иного уровня. Благодаря своей непривычности и концептуальной новизне, «модернистские» языки участвуют в «общем прогрессе индустрии» опосредованно: в мэйнстрим, как правило, проникают не сами языки, а их отдельные концепции и подходы.

Диффузия идей модернистских языков в программистское сообщество происходит с двух направлений — через постепенное изменение «классицистических» языков и через появление языков абсолютно новых, которые можно назвать постмодернистскими [Мы не станем дальше углубляться в искусствоведческую метафору: определения программистского рококо, романтизма, экспрессионизма, кубизма и абстракционизма оставим в качестве развлечения для читателя] (OCaml, Python, Ruby, Scala). «Постмодернистские» языки выходят за рамки стилей и парадигм, смешивая старые и новые идеи в разных пропорциях; зачастую жертвуют концептуальной целостностью ради выразительности и поливариантности возможностей. На уровне отдельных «фраз» многие из постмодернистских языков выглядят просто и понятно любому программисту, отчего их проникновение в мэйнстрим идет куда легче, чем у «более идейных» предшественников. А тем временем и сами мэйнстримовые языки стремительно впитывают новые идеи: подобно миру искусства, в мире программирования широкое наступление постмодернизма характеризуется смешением стилей и парадигм до их полной неразделимости.

Объект исследования темы этого номера — языки программирования, которые в разное время и в разных условиях предлагались и предлагаются как альтернатива привычному, мэйнстримовому, и общепринятому; их судьба, свойства и шансы. В первой обзорной статье вкратце описывается история самого мэйнстрима — без понимания перипетий смены одного языка другим рассмотрение «альтернативы» бессмысленно. Вторая статья посвящена языкам модернистским, а третья — постмодернистским. Каждая из трех частей отслеживает развитие соответствующей ветки истории; таким образом, должна получиться некая общая картина сегодняшнего состояния дел (возможно, несколько перекошенная, и наверняка неполная).

И последнее. В соответствии с главным принципом киберпанка «будущее уже здесь, просто оно неравномерно распределено» — разные течения в программировании очень трудно разделить хронологически; первый модернистский язык программирования — Lisp — один из старейших (1958 год, из общеизвестных старше только Fortran), да и очевидно постмодернистский Perl скоро справит двадцатилетний юбилей. Поэтому деление языков программирования (и темы номера) на «классицизм», «модернизм» и «постмодернизм» происходит скорее «вдоль» истории, нежели «поперек».

С этим и начнем.

Генеральная линия: От Fortan до C#

Проблемы со структурой программ на Фортране (вкратце: структуры не было) привели к разработке языка Algol (1958). Судьба его весьма показательна: совместная разработка американских и европейских ученых, к которой приложили руку многие «легенды» IT; в процессе работы над Алголом были разработаны концепции структурного программирования (логические структуры для ветвления кода; разбиение программы на процедуры, положившее начало созданию библиотек кода для повторного использования, и т. п.); следующие тридцать лет Алгол будет де-факто стандартом для описания алгоритмов. При этом уклон авторов Алгола в «теорию» (эффективного компилятора нет; стандартных операторов ввода-вывода нет) привел к тому, что использование этого языка в промышленном программировании было мизерным.

Из первоязыков еще стоит упомянуть Cobol (1959), чудовищный как язык, но крайне успешный как платформа для создания бизнес-приложений. Что показательно.

Следующее десятилетие — эпоха экспериментов на ниве создания «самого лучшего языка». В широком использовании продолжают царствовать Fortran/Cobol, к ним добавляются языки класса «все-все-все-в-одном» PL/I и CPL [В этот же период созданы Lisp и Snobol, речь о которых — в следующей статье], тяжелые и для изучения, и для реализации. В районе 70-х происходит первая «большая чистка»: парк компьютеров растет лавинообразно, возникает необходимость в языках простых и практичных, которые легко выучить, легко реализовать под различные аппаратные платформы, легко писать и читать код; при этом возрастает количество «программ-ради-программ», не решающих некую бизнес-задачу, а облегчающие работу с самим компьютером.

Си вкупе с Unix; разномастные Бейсики как встраиваемые языки для первых домашних (и мелких недомашних) компьютеров; Pascal в Apple II/Apple III, чуть позже Паскали от фирмы Borland для простого написания программ под DOS, Windows — все это языки весьма простые [Basic, в частности, настолько прост, что даже структурного программирования в нем не было. Зато это давало возможность сделать крайне нетребовательную к ресурсам реализацию языка, что поспособствовало его распространению на «несерьезных» компьютерах. С ростом ресурсов этих компьютеров (и запросов программистов) структурность в Бейсике появилась (в середине 80-х)] и практичные; это, по большому счету, те языки, с которыми программирование стало действительно массовым занятием.

По мере расширения круга задач, решаемых на «простых» языках, количества повторно используемых библиотек и «времени жизни» этих библиотек стали возникать концепции более сложного структурирования кода. Самая популярная из них — объектно-ориентированное программирование; совмещение концепций «набора процедур и данных (модуля)» и «типа данных со сложной внутренней структурой» дало понятие «класса» и «объекта» [Большая часть концепций классического ООП была разработана в середине 60-х в рамках работы над языком Simula (Ole-Johan Dahl, Kristen Nygaard). Судьба его достаточно близка к судьбе Алгола: разработанные концепции были приняты и воплощены во многих успешных проектах, но сам язык использовался весьма ограниченно]. Мэйнстримовая разновидность ООП [О более радикальном наборе концепций с тем же названием — в следующей статье.9 Интересно, что другая разновидность «объектно-ориентированного C», известная под именем Objective C и зачастую воспринимаемая как забавный курьез, была языком вполне постмодернистским, смешавшим концепции классического C и модернистского Smalltalk. Распространение этого (и других «странных») языков исключительно в мире Apple весьма показательно] — естественное эволюционное развитие структурно-императивного подхода. Неудивительно, что и объектно-ориентированные языки, принятые «широкими массами», были естественным развитием все тех же C, Pascal, Basic — Visual Basic, C++ [Интересно, что другая разновидность «объектно-ориентированного C», известная под именем Objective C и зачастую воспринимаемая как забавный курьез, была языком вполне постмодернистским, смешавшим концепции классического C и модернистского Smalltalk. Распространение этого (и других «странных») языков исключительно в мире Apple весьма показательно], Object Pascal (позже Delphi).

Назад Дальше