Файл: Основы программирования на языке Pascal (Язык программирования Pascal).pdf

ВУЗ: Не указан

Категория: Курсовая работа

Дисциплина: Не указана

Добавлен: 29.03.2023

Просмотров: 356

Скачиваний: 1

ВНИМАНИЕ! Если данный файл нарушает Ваши авторские права, то обязательно сообщите нам.

2.6. Разработка

Разработка Pascal ведется в основном через процесс Pascal Enhancement Proposal (PEP). Процесс PEP является основным механизмом для предложения новых функций, сбора информации в сообществе о проблемах и документирования проектных решений, которые вошли в Pascal. [98] Удачные PEP проверяются и комментируются сообществом Pascal и Ван Россумом и принимаются в качестве новых функция языка [21].

Публичные релизы CPascal бывают трёх типов:

  1. Обратно-несовместимые версии, где ожидается разрыв кода и его необходимо вручную портировать. Увеличивается первая часть номера версии. Эти релизы происходят нечасто — например, версия 3.0 была выпущена через 8 лет после версии 2.0.
  2. Основные или «функциональные» релизы, которые в значительной степени совместимы, но вводят новые функции. Увеличивается вторая часть номера версии. Эти выпуски планируются примерно каждые 18 месяцев, и каждая основная версия поддерживается в течение нескольких лет после ее выпуска.
  3. Выпуски 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