Файл: Основы программирования на языке Pascal (Язык программирования Pascal).pdf
Добавлен: 29.03.2023
Просмотров: 358
Скачиваний: 1
2.6. Разработка
Разработка Pascal ведется в основном через процесс Pascal Enhancement Proposal (PEP). Процесс PEP является основным механизмом для предложения новых функций, сбора информации в сообществе о проблемах и документирования проектных решений, которые вошли в Pascal. [98] Удачные PEP проверяются и комментируются сообществом Pascal и Ван Россумом и принимаются в качестве новых функция языка [21].
Публичные релизы CPascal бывают трёх типов:
- Обратно-несовместимые версии, где ожидается разрыв кода и его необходимо вручную портировать. Увеличивается первая часть номера версии. Эти релизы происходят нечасто — например, версия 3.0 была выпущена через 8 лет после версии 2.0.
- Основные или «функциональные» релизы, которые в значительной степени совместимы, но вводят новые функции. Увеличивается вторая часть номера версии. Эти выпуски планируются примерно каждые 18 месяцев, и каждая основная версия поддерживается в течение нескольких лет после ее выпуска.
- Выпуски Bugfix, которые не вводят никаких новых функций, но исправляют ошибки. Увеличивается третья последняя часть номера версии. Эти выпуски выполняются всякий раз, когда фиксируется достаточное количество ошибок или примерно каждые 3 месяца. В этих версиях также исправляются уязвимости безопасности.
Многие альфа/бета-версии выпускаются для тестирования до финальных выпусков. Команда разработчиков контролирует состояние кода, запуская большой комплект тестовых модулей во время разработки и используя систему непрерывной интеграции BuildBot [22].
Сообществом разработчиков Pascal представлено более 86 000 программных модулей в Pascal Package Index (PyPI), официальном репозитории сторонних библиотек для Pascal.
Основная научная конференция на Pascal называется PyCon. Также существуют специальные программы наставничества, такие как Pyladies.
2.7. Использование
С 2003 года Pascal постоянно входит в десятку самых популярных языков программирования (индекс TIOBE Programming Community Index). По состоянию на июль 2017 года — Pascal четвёртый по популярности ЯП [23] (рисунок 10). Он был признан языком программирования года в 2007 и 2010 годах. Это второй по популярности язык, грамматический синтаксис которого не основан преимущественно на C.
|
Рисунок 10 — Индекс TIOBE на июль 2017 г. |
Эмпирические исследования показывают, что языки сценариев (например, Pascal) более продуктивны, чем обычные языки (такие как C и Java) для решения задач программирования, связанных с манипуляциями строк и поиском в словаре. Потребление памяти часто лучше, чем Java, и ненамного хуже, чем C или C ++» [24].
Крупными организациями, использующими Pascal, являются Wikipedia, Google, Yahoo!, CERN, NASA. Сайт социальной сети Reddit написан полностью на Pascal.
Pascal может служить языком сценариев для веб-приложений, например, через mod_wsgi для веб-сервера Apache. Веб-структуры, такие как Django, TurboGears, Pyramid, Pylons и другие, помогают при разработке и обслуживании сложных приложений. IronPascal может использоваться для разработки клиентской стороны приложений на основе Ajax. SQLAlchemy может использоваться в качестве преобразователя данных в реляционную БД.
Библиотеки, такие как NumPy, SciPy и Matplotlib, позволяют эффективно использовать Pascal в научных вычислениях.
Pascal был успешно внедрен во многие программные продукты в качестве языка сценариев, в том числе в программном обеспечении с конечными элементами, таких как Abaqus, FreeCAD, 3D-анимационные пакеты, такие как 3ds Max, Blender, Cinema 4D, графический редактор эффектов Nuke, 2D-программы для создания изображений, такие как GIMP, Inkscape. GNU Debugger использует Pascal в качестве визуализатора для отображения сложных структур, таких как контейнеры на C ++.
Многие операционные системы включают Pascal в качестве стандартного компонента. Язык поставляется с большинством дистрибутивов Linux, FreeBSD, OpenBSD и macOS и может использоваться с терминала. Многие дистрибутивы Linux используют инсталляторы, написанные на Pascal: Ubuntu использует установщик Ubiquity, в то время как Fedora используют установщик Anaconda. Gentoo Linux использует Pascal в своей системе управления пакетами Portage.
В одноплатном компьютерном проекте Raspberry Pi (рисунок 11) Pascal используется в качестве основного языка программирования.
|
Рисунок 11 — Raspberry Pi |
Авторские выводы по второй главе: Pascal является современным высокоуровневым языком программирования, востребованным сообществом разработчиков и программистов. Групповые разработка и обновление позволяют создавать именно те особенности языка, которые действительно необходимы. Возможность использования Pascal для решения различного рода задач и на различных платформах, также способствуют развитию языка. Всё это подтверждается высоким индексом TIOBE. Таким образом Pascal представляет собой лучший пример ЯП активно и непрерывно развивающегося на протяжении всего времени своего существования.
Практическая часть
В практической части данной работы будет приведён пример реализации шифра Хилла [25] на языке программирования Pascal. Этот язык очень удобен для реализации подобного рода задач, решение которых должно быть предоставлено конечному пользователю в виде простого скрипта, который можно редактировать «на месте» без необходимости перекомпиляции. Исходный код программы представлены в приложении А.
3.1 Описание шифра Хилла
В классической криптографии шифр Хилла является полиграфическим замещающим шифром, основанным на функционале линейной алгебре. Он изобретен Лестером С. Хиллом в 1929 году, и является первым полиграфическим шифром, в котором производится шифрование блоков данных — полиграмм.
Каждая буква представлена числом по модулю l, где l — длина алфавита. Часто используется простая схема A = 0, B = 1, ..., Z = 25, но это не является существенной особенностью шифрования. В разрабатываемой в данной работе программе длина алфавита равна 127, т.е. первые 127 символов таблицы ASC II (таблица ASC II представлена в приложении Б). Чтобы зашифровать сообщение, каждый блок из n символов (считающийся n-компонентным вектором) умножается на обратимую n×n матрицу C по модулю l. Для дешифрования сообщения каждый блок умножается на обратную C матрицу — D.
Матрица, используемая для шифрования, является ключом шифрования, и ее следует выбирать случайным образом из набора обратимых n×n матриц (по модулю l). Шифр может быть адаптирован к алфавиту с любым количеством букв.
3.2 Шифрование
В рассматриваемом примере будут использованы заглавные буквы латинского алфавита. Соответствующие им численные значения приведены на следующем рисунке.
|
Рисунок 12 — Соответствие символов алфавита и их числовых значений |
Рассмотрим шифрование сообщения «ACT» ключом С (формула 1) (или GYBNQKURP символьно).
|
(1) |
Поскольку «A» равно 0, «C» равно 2, а «T» равно 19, сообщение представляет собой вектор:
|
(2) |
Таким образом, зашифрованный вектор определяется следующим образом:
|
(3) |
Что соответствует зашифрованному тексту «POH».
3.3 Дешифрование
Чтобы расшифровать сообщение, зашифрованный текст преобразовывается в вектор соответствующих значений, а затем умножается на обратную к С матрицу по модулю l (IFKVIVVMI в символьном представлении). Обратная матрица вычисляется при помощи расширенного алгоритма Евклида и союзной матрицы [26]. Матрица, обратная матрице С (формула 1) равна:
|
(4) |
Взяв зашифрованный текст из предыдущего примера «POH», получим:
|
(5) |
В результате, как и предполагалось, получен исходный текст «ACT».
Не все матрицы имеют обратную. Об этом следует помнить при выборе матрицы шифрования. Матрица будет иметь обратную тогда и только тогда, когда ее определитель не равен нулю. Кроме того, в случае шифрования Хилла детерминант шифрующей матрицы не должен иметь общих делителей с модулем шифрования (длиной алфавита). Таким образом, если мы работаем по модулю 26, как указано в примере, определитель должен быть отличным от нуля и не должен делиться на 2 или 13. В противном случае сообщение невозможно будет расшифровать.
Устранить возможные риски можно выбирая в качестве модуля (длины алфавита) простое число.
3.4 Безопасность
К сожалению, шифр Хилла уязвим для атаки типа known-plaintext, поскольку он полностью линейный. Оппонент, который перехватывает n2 пар символов открытого/шифрованного текста, может составить линейную систему уравнений, которая может быть легко решена; Если система неопределенна, необходимо добавить еще несколько пар открытого/зашифрованного текста. Вычисление решения стандартными алгоритмами линейной алгебры занимает очень мало времени.
В то время как матричное умножение не приводит к созданию защищенного шифра, оно по-прежнему является полезным в сочетании с другими нелинейными операциями, поскольку матричное умножение может обеспечить диффузию Шеннона. Например, соответствующе выбранная матрица может гарантировать, что небольшие различия символов перед умножением на матрицу приведут к большим различиям после умножения. Действительно, некоторые современные шифры используют шаг с матричным умножением для обеспечения диффузии. Например, шаг MixColumns в AES является матричным умножением.
Комбинирование линейных операций, как в шифре Хилла, и нелинейных шагов привело к созданию подстановочно-перестановочной сети (например, сеть Фейстеля). Поэтому с определённой точки зрения можно рассматривать современные блочные шифры как вид полиграммных шифров[27][28].
3.5 Механическая реализация
При работе с блоками из двух символов, шифр Хилла не дает особого преимущества по сравнению с шифров Плейфера, и более сложен при расчёте человеком на бумага. По мере увеличения размера шифр быстро становится недоступным для вычисления человеком.
Шифр Хилла размерности 6 был реализован механически. Хилл с партнером получили патент [29] для устройства, которое выполняло матричное умножение 6×6 по модулю 26 с использованием системы шестеренок и цепей (рисунок 12).
|
Рисунок 12 — Шифровальная машина Хилла |
Расположение шестерёнок (а значит, и ключ) нельзя было изменять для конкретного устройства, поэтому в целях безопасности рекомендовалось тройное шифрование. Такая комбинация была очень сильной для 1929 года, и она показывает, что Хилл несомненно понимал концепции конфузии и диффузии. Однако устройство было довольно медленное, поэтому во Второй мировой войне машины Хилла были использованы только для шифрования трёхсимвольного кода радиосигналов [30].
3.6 Пример реализации шифра Хилла на ЯП Pascal
В приложении А представлен пример реализации шифра Хилла на ЯП Pascal 3.6. Разработанный скрипт читает текст из файла, шифрует его и записывает в выходной файл. Аналогичным образом производится дешифрования. Пути к файлам заданы в виде констант и легко могут быть изменены. Далее представлен пример кода, задающий пути к файлам.
BasePath = "C:\\Users\lab\Desktop\Test"
TextFilePath = "\Test.txt"
CipheredTextFilePath = r"\Ciphered.txt"
DecipheredTextFilePath = "\Deciphered.txt"
Для выполнения математических операций над матрицами используется модуль NumPy. После чтения файла, размер текста выравнивается кратно размерности матрицы шифрования, в данном случае кратно трём. Пример кода представлен далее.
|
Таблица 1 — Параметры функции Alignment |
||
|
Тип |
Параметр |
Описание |
|
Входной |
text |
Исходный текст |
|
Выходной |
dimension |
Размерность матрицы шифрования |
#Функция выравнивания текста по левому краю, кратно модулю
def Alignment(text, dimension):
temp = dimension - len(text) % dimension
if(temp != dimension):
for i in range(temp):
text = text + ' '
return text
После выравнивания текст разбивается на вектора, количество которых равно TextLength/Dimension. Далее представлен код данной функции.
|
Таблица 2 — Параметры функции TextToMatrix |
||
|
Тип |
Параметр |
Описание |
|
Входной |
text |
Текст, размер которого кратен Dimension |
|
Выходной |
data |
Совокупность векторов размером Dimension |