Как создать программу шифрования

В этой статье я попробую рассказать вам, дорогие читатели блога, об одной из своих первых попыток написания самодельной программы шифрования файлов и показать вполне рабочий пример простого алгоритма шифрования.

А что это будет за алгоритм и как будет организована программа вы узнаете далее…

На написание данной программы меня подтолкнула книга Брюса Шнайера «Прикладная криптография», которая содержит очень много интересных и доступных для понимания алгоритмов шифрования с подробным анализом как их механизмов работы, так и возможных слабостей. В одной из глав этой замечательной книги описывается интересный алгоритм под названием RC4, который, прежде всего, заинтересовал меня своей простотой и даже, можно сказать, некоторой прямолинейностью. Именно эти обстоятельства подтолкнули к испытанию RC4 в связке с нашей любимой графической библиотекой QtE5.

Создадим простой dub-проект с минимальными указаниями и отсутствием внешних зависимостей, назовем его simplecrypt. Далее, берем из исходников QtE5 файл qte5.d и переносим его в папку simplecrypt/source проекта.

Как сделать свой скрипт для шифрования (+ задачка)

В simplecrypt мы сделаем простой и минималистичный интерфейс: текстовое поле с кнопкой для выбора файла, который будет шифроваться/дешифроваться, текстовое поле с кнопкой для выбора файла, содержащего ключ, а также несколько кнопок: «Зашифровать», «Расшифровать», «Сгенерировать файл ключа» и «О программе» (кнопка-заглушка, на которую можно повесить генерацию отладочной информации). Все это чудо будет выглядеть примерно так:

simplecrypt

Этот интерфейс поместим в файл gui.d. Также очевидно, что потребуется четыре «переходника» под события всех кнопок, что все вместе выглядит следующим образом:

extern(C) < void onLoadFile(MainForm* mainFormPointer) < (*mainFormPointer).runLoadFile; >void onLoadKeyFile(MainForm* mainFormPointer) < (*mainFormPointer).runLoadKeyFile; >void onEncryptFile(MainForm* mainFormPointer) < (*mainFormPointer).runEncryptFile; >void onDecryptFile(MainForm* mainFormPointer) < (*mainFormPointer).runDecryptFile; >void onGenerateKeyFile(MainForm* mainFormPointer) < (*mainFormPointer).runGenerateKeyFile; >void onAbout(MainForm* mainFormPointer) < (*mainFormPointer).runAbout; >> // псевдонимы под Qt’шные типы alias WindowType = QtE.WindowType; // основное окно class MainForm : QWidget < private < QVBoxLayout mainBox, vertical0; QHBoxLayout horizontal0, horizontal1, horizontal2, horizontal3; QGroupBox box0, box1, box2; QPushButton button0, button1, button2, button3, button4, button5; QLineEdit edit0, edit1; QAction action0, action1, action2, action3, action4, action5; >this(QWidget parent, WindowType windowType) < super(parent, windowType); setMaximumSize(500, 250); setFixedWidth(500); setFixedHeight(250); setWindowTitle(«RC4 Crypter»); mainBox = new QVBoxLayout(this); horizontal0 = new QHBoxLayout(this); edit0 = new QLineEdit(this); edit0.setReadOnly(true); button0 = new QPushButton(«Select. «, this); action0 = new QAction(null, connects(button0, «clicked()», action0, «Slot()»); horizontal0 .addWidget(edit0) .addWidget(button0); box0 = new QGroupBox(this); box0.setText(«File for encryption/decription:»); box0.setMaximumHeight(55); box0.setLayout(horizontal0); horizontal1 = new QHBoxLayout(this); edit1 = new QLineEdit(this); edit1.setReadOnly(true); button1 = new QPushButton(«Select. «, this); action1 = new QAction(null, connects(button1, «clicked()», action1, «Slot()»); horizontal1 .addWidget(edit1) .addWidget(button1); box1 = new QGroupBox(this); box1.setText(«Key file:»); box1.setMaximumHeight(55); box1.setLayout(horizontal1); vertical0 = new QVBoxLayout(this); horizontal2 = new QHBoxLayout(this); button2 = new QPushButton(«Encrypt», this); action2 = new QAction(null, connects(button2, «clicked()», action2, «Slot()»); button3 = new QPushButton(«Decrypt», this); action3 = new QAction(null, connects(button3, «clicked()», action3, «Slot()»); horizontal2 .addWidget(button2) .addWidget(button3); horizontal3 = new QHBoxLayout(this); button4 = new QPushButton(«Generate key file», this); action4 = new QAction(null, connects(button4, «clicked()», action4, «Slot()»); button5 = new QPushButton(«About. «, this); action5 = new QAction(null, connects(button5, «clicked()», action5, «Slot()»); horizontal3 .addWidget(button4) .addWidget(button5); vertical0 .addLayout(horizontal2) .addLayout(horizontal3); box2 = new QGroupBox(this); box2.setText(«Crypting option:»); box2.setLayout(vertical0); mainBox .addWidget(box0) .addWidget(box1) .addWidget(box2); setLayout(mainBox); >

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

Основы Шифрования за 5 минут — Asymmetric Cryptography — #ityoutubersru


setMaximumSize(500, 250); setFixedWidth(500); setFixedHeight(250);

Теперь напишем обработчики нажатия кнопок, и прежде всего выбор файла для обработки нашим шифровальным приложением, а также выбор файла ключа:

void runLoadFile() < QFileDialog fileDialog = new QFileDialog(‘+’, null); string filename = fileDialog.getOpenFileNameSt(«Open file for encryption/decryption», «», «*.*»); edit0.setText(filename); >void runLoadKeyFile()

Эти обработчики, помещенные в класс окна, просто получают путь до соответствующего файла и отображают его в нужное текстовое поле, предварительно защищенное от записи данных со стороны пользователя. Также, мы устанавливаем ограничение на расширение файла, разрешаем следующий набор: *.key, *.keyfile, *.rc4.

Далее определим другой обработчик, который обсчитывает нажатие кнопки «Сгенерировать ключ». По моей задумке, эта кнопка генерирует случайный файл ключа, помещая в него набор из 256 случайных байтов, выбранных из источника псевдослучайных чисел. Реализация этой идеи довольно простая, но нам также требуется уникальное имя файла, и такое, чтобы оно внезапно не совпало с некоторым уже существующим. Необходимое имя файла можно получить вводом соглашения об именовании файла ключа: пусть имя файла ключа будет начинаться с префикса key_ за которым последует дата его создания с точностью до секунд.

Таким образом, наш обработчик выглядит примерно так:

void runGenerateKeyFile() < import std.datetime; import std.random; import std.stdio; import std.string; auto filename = Clock.currTime .toString .replace(«:», «») .replace(«-«, «_») .replace(«.», «_») .replace(» «, «_»); try < File file; file.open(«key_%s.rc4».format(filename), «wb»); Random random = Random(unpredictableSeed); for (int i = 0; i < 256; i++) < file.write(cast(char) uniform(0, 256, random)); >file.close; msgbox( «File key_%s.rc4 has been generated».format(filename), «RC4 Key Generation», QMessageBox.Icon.Information ); > catch < msgbox( «Key file generation failed», «RC4 Key Generation», QMessageBox.Icon.Critical ); >>

Для выполнения введенного соглашения используем получение текущего времени и заменим некоторые символы строки времени на более корректные, приводящие к вполне читаемому и удобному имени файла. Также, введем страховочный механизм, который в случае невозможности создания файла ключа выведет окно с сообщением об ошибке, и это не приведет к краху всего приложения. В случае успешного создания файла ключа, программа выдаст окно о том, что нужный файл создан и покажет его название.

Остальные два обработчика на время оставим в покое, поскольку они потребуют уже подготовленного кода, который мы сейчас рассмотрим.

Прежде всего, напишем сам алгоритм RC4 (описание и механизм работы я приводить не буду, он есть в упомянутой мной книге или в википедии), реализуя его в виде такого класса:

module simplecrypt.rc4; private < import std.string; >class RC4 < private < ubyte[256] S_Box; ubyte[256] Key; // перестановка элементов void exchange(ref ubyte[256] s, int i, int j) < ubyte tmp = s[j]; s[j] = s[i]; s[i] = tmp; >// инициализация перестановочной таблицы auto initializeSBox() < foreach (i, ref e; S_Box) < e = cast(ubyte) i; >auto j = 0; foreach (i; 0..256) < j = (j + S_Box[i] + Key[i]) % 256; exchange(S_Box, i, j); >> > this()<> // ввести 256-байтный ключ auto adjustKey(ubyte[256] key) < Key = key; initializeSBox; >// зашифровать поток битов ubyte[] encrypt(inout(ubyte[]) bytes) < auto i = 0; auto j = 0; auto S = S_Box; ubyte[] accumulator; foreach (unit; bytes) < i = (i + 1) % 256; j = (j + S[i]) % 256; exchange(S, i, j); int t = (cast(int) S[i] + cast(int) S[j]) % 256; ubyte k = S[t]; accumulator ~= unit ^ k; >return accumulator; > // зашифровать строку string encrypt(string text) < string accumulator; foreach(unit; this.encrypt(text.representation)) < accumulator ~= cast(char) unit; >return accumulator; > >

Класс RC4 работает следующим образом: сначала создается объект класса, затем методом adjustKey устанавливается 256-байтный ключ (задается в виде массива байтов), а затем по необходимости, методом encrypt шифруется или дешифруется набор байтов или строка. Стоит заметить, что метода обратного encrypt нет и расшифровывание файла выполняется с помощью того же самого метода encrypt на вход которому подается зашифрованный блок (а по необходимости повторяется процедура установки ключа). Сам класс RC4 мы помещаем в файл rc4.d.

Чтобы пойти дальше, нам потребуется принять тот факт, что исходный файл и файл ключа не должны быть изменены нашей программой, и что пользователь сам должен решить что делать с незашифрованным файлом. Понимаю, что это один из неразумных шагов с моей стороны, однако, я пока не знаю, как уничтожить исходный файл безопасным образом. Кроме того, неизменность обоих файлов в начале процесса обработки их через simplecrypt вполне надежная гарантия успешной работы алгоритма. Стало быть файлы должны быть read-only, т.е. доступны только для чтения.

Читайте также:
Что значит программа обучения в вузе

Реализуем свою абстракцию «защиты файлов» в файле readonlyfile.d:

module simplecrypt.readonlyfile; private < import std.file; import std.path; import std.range; import std.stdio; import std.string; >class ReadOnlyFile < private < void[] fileContent; >this()<> auto open(string filepath) < if (filepath.exists) < if (filepath.isFile) < fileContent = std.file.read(filepath); if (fileContent.length == 0) < throw new FileException(«File %s is empty».format(filepath)); >> else < throw new FileException(«Filesystem’s object %s is not a file».format(filepath)); >> else < throw new FileException(«Filesystem’s object %s does not exists».format(filepath)); >> void[] read() < if (fileContent.empty) < throw new FileException(«Trying of access to unopened file»); >else < return fileContent; >> void close() < if (fileContent.empty) < throw new FileException(«Trying of access to unopened file»); >else < fileContent = []; >> ~this() < if(!fileContent.empty) < fileContent = []; >> >

Как видно из приведенного выше фрагмента кода, мы постарались учесть все возможные преграды на пути извлечения из файлов информации в виде байтового потока, снабдив наш класс блоками генерации исключительных ситуаций с подробной информацией о возникших проблемах.

Теперь можно описать процедуру, которая применяет алгоритм RC4 к некоторому файлу:

module simplecrypt.encrypt; private < import std.algorithm; import std.range; import std.stdio; import simplecrypt.rc4; import simplecrypt.readonlyfile; >auto encryptFile(string sourceFileName, string keyFileName, string targetFileName) < ReadOnlyFile sourceFile = new ReadOnlyFile; sourceFile.open(sourceFileName); auto text = cast(ubyte[]) sourceFile.read; sourceFile.close; ReadOnlyFile keyFile = new ReadOnlyFile; keyFile.open(keyFileName); ubyte[256] key = (cast(ubyte[]) keyFile.read).array; keyFile.close; RC4 rc4 = new RC4; rc4.adjustKey(key); auto result = rc4.encrypt(text); File file; file.open(targetFileName, «wb»); result .map!(a =>cast(char) a) .each!(a => file.write(a)); file.close; >

Идея кода проста: открываем исходный файл и файл ключа, считываем их в байтовые массивы, инициализируем класс RC4 и заполняем его массивом байтов ключа, применяем алгоритм шифрования. Далее, открываем новый файл (его имя задается третьим аргументом функции encryptFile, первые два — это имя исходного и ключевого файла соответственно), переводим байтовое представление в символьное и записываем в открытый файл, после чего производим его закрытие.

Помещаем всю процедуру в файл encrypt.d, и возвращаемся к файлу gui.d, в который мы теперь можем дописать два обработчика. Первый обработчик, который срабатывает по кнопке «Зашифровать» делает следующее: получает пути нужных нам файлов из текстовых полей, затем проверяет введенные данные, и в случае их корректности, вызывает процедуру encryptFile и записывает полученный от нее поток байтов в новый файл, который имеет тоже имя что и старый, однако, расширение сменено на *.crypted:

void runEncryptFile() < auto sourceFileName = edit0.text!string; auto keyFileName = edit1.text!string; if ((sourceFileName != «») (keyFileName != «»)) < try < auto targetFileName = sourceFileName ~ «.crypted»; setWindowTitle(«RC4 encrypting . «); encryptFile(sourceFileName, keyFileName, targetFileName); setWindowTitle(«Done.»); Thread.sleep(250.msecs); setWindowTitle(«RC4 Crypter»); msgbox( «File %s has been encrypted».format(edit0.text!string), «RC4 Encryption», QMessageBox.Icon.Information ); >catch < msgbox( «Unable to crypt file %s».format(edit0.text!string), «RC4 Encryption», QMessageBox.Icon.Critical ); >> else < msgbox( «File for encryption and/or key file not found», «RC4 Encryption», QMessageBox.Icon.Critical ); >>

Нетрудно заметить, что предприняты меры предосторожности на случай некорректных данных, а также специально введено замедление процесса для того, чтобы отобразить информацию о ходе процесса шифрования.

Обработчик кнопки «Расшифровать» выглядит почти идентично (процедура расшифровки та же самая, что и для зашифровки), но в ходе своей работы он убирает расширение *.crypted:

void runDecryptFile() < auto sourceFileName = edit0.text!string; auto keyFileName = edit1.text!string; if((sourceFileName != «») (keyFileName != «»)) < try < auto targetFileName = sourceFileName.replace(«.crypted», «»); setWindowTitle(«RC4 decrypting . «); encryptFile(sourceFileName, keyFileName, targetFileName); setWindowTitle(«Done.»); Thread.sleep(250.msecs); setWindowTitle(«RC4 Crypter»); msgbox( «File %s has been decrypted».format(edit0.text!string), «RC4 Decryption», QMessageBox.Icon.Information ); >catch < msgbox( «Unable to crypt file %s».format(edit0.text!string), «RC4 Decryption», QMessageBox.Icon.Critical ); >> else < msgbox( «File for decryption and/or key file not found», «RC4 Encryption», QMessageBox.Icon.Critical ); >>

Теперь наш небольшой проект готов к сборке, а также ко всевозможным интересным экспериментам…

Например, однажды мне почти удалось зашифровать саму программу шифровальщик, что привело к весьма занятным результатам и выводам: при попытке запуска программы с включенным антивирусом можно получить блокировку приложения, т.к. как антивирус считает, что у нас в системе запущен полиморфный вирус.

На этом прекрасном моменте, я заканчиваю свой рассказ и прилагаю к этой статье полный код всего проекта с примерами сгенерированных ключей.

Источник: lhs-blog.info

Как создать инструмент PGP-шифрования на основе Python

Как создать инструмент PGP-шифрования на основе Python

PGP (англ. Pretty Good Privacy) — это широко известная программа для операций шифрования. Она создает цифровые подписи, зашифровывает/расшифровывает большие объемы данных и повышает безопасность электронной переписки.

PGP-шифрование задействует последовательную комбинацию хеширования, сжатия данных, криптографию с симметричным и открытым ключом. На каждом этапе применяется один из поддерживаемых алгоритмов. Каждый открытый ключ привязан к имени пользователя и адресу электронной почты.

К счастью, большинство протоколов PGP-шифрования доступно для разработчиков через открытую библиотеку Python pgpy . Обнаружив эту библиотеку, я на досуге изучил ее открытый исходный код и создал небольшой апплет — инструмент командной строки для PGP-шифрования.

Далее мы рассмотрим основные этапы создания базового апплета в инструменте командной строки для PGP-шифрования. Требуются знания файловых потоков и программирования.

Создание апплета командной строки

Сначала мы напишем код 5 базовых функций, играющих важную роль в создании задуманного ПО. Они обеспечат следующие возможности: получение и установка ключа, чтение и запись его в специальный файл и генерация ключа.

Поскольку получение, установка, чтение и запись являются базовыми функциями, в нижеуказанном фрагменте кода они представлены без пояснений. А вот функция genKey вызывает немного больший интерес. И хотя она не что иное, как шаблонный код pgpy , мы рассмотрим ее повнимательнее.

Строка 42 генерирует пару “открытый-закрытый” ключ размером 4096, используя протокол RSA. Последующая команда в строке 45 привязывает их к вымышленной электронной почте — в данном случае Abraham Lincoln .

Строка 50 позволяет указать весь спектр пользовательских случаев (шифрование электронной почты, шифрование диска и т. д.) и предопределенные хэши, шифры, алгоритмы сжатия, применяемые для шифрования документов. Никакие параметры или флаги не были удалены в следующем примере:

import pgpy
import fcntl, os, sys

global g_key

def setKey(key):
«»»
Функция, устанавливающая g_key для ключа.
«»»

g_key = key

def getKey():
«»»
Получает ключи.
«»»

return g_key

def saveKey(name):
«»»
Сохраняет ключ в новом файле.
«»»

f = open(name, «w»)
f.write(g_key)

def openKey(name):
«»»
Открывает ключ из файла.
«»»

f = open(name, «r»)
setKey(f.read())

def genKeys():
«»»
Функция, генерирующая открытый и закрытый ключи.
«»»

key = pgpy.PGPKey.new(PubKeyAlgorithm.RSAEncryptOrSign, 4096)

# Теперь у нас есть материал ключа. Однако поскольку у нового ключа отсутствует ID пользователя, то к работе он пока не готов!
uid = pgpy.PGPUID.new(‘Abraham Lincoln’, comment=’Honest Abe’, email='[email protected]’)

# Мы должны добавить ключу новый ID пользователя и указать на этом этапе все установочные параметры,
# поскольку на данный момент PGPy не имеет встроенных установочных параметров ключей по умолчанию.
# Этот пример похож на предустановленные настройки GnuPG 2.1.x, без срока действия и предпочитаемого сервера ключей
key.add_uid(uid, usage=,
hashes=[HashAlgorithm.SHA256, HashAlgorithm.SHA384, HashAlgorithm.SHA512, HashAlgorithm.SHA224],
ciphers=[SymmetricKeyAlgorithm.AES256, SymmetricKeyAlgorithm.AES192, SymmetricKeyAlgorithm.AES128],
compression=[CompressionAlgorithm.ZLIB, CompressionAlgorithm.BZ2, CompressionAlgorithm.ZIP, CompressionAlgorithm.Uncompressed])
setKey(key)
return key

Следующий этап работы заключается в сочетании команд шифрования pgpy и вызовов файловых потоков Python. Потребуются 4 функции: pgp_encrypt — для шифрования текста; pgp_decrypt — для расшифровки; encrypt_file и decrypt_file . Функции, связанные с шифрованием и расшифровкой файлов, будут комбинированно использовать команды шифрования и функциональность файловых потоков, как показано ниже:

def pgpy_encrypt(key, data):
«»»
Зашифровывает данные с помощью ключа.
«»»

Читайте также:
Как удалить программу нортон

message = pgpy.PGPMessage.new(data)
enc_message = key.pubkey.encrypt(message)
return bytes(enc_message)

def pgpy_decrypt(key, enc_data):
«»»
Расшифровывает данные с помощью ключа.
«»»

message = pgpy.PGPMessage.from_blob(enc_data)
return str(key.decrypt(message).message)

def encryptFile(path, key):
«»»
Функция зашифровывает содержимое файла по пути path,
используя
шифр, указанный в переменной шифрования.
«»»

f = open(«D:\myfileswelcome.txt», «w»)
data = f.read()
enc = pgpy_encrypt(g_key, data)
f.write(enc)

def dencryptFile(path, key):
«»»
Функция расшифровывает содержимое файла по пути path,
применяя
шифр, указанный в переменной шифрования.
«»»

f = open(«D:\myfileswelcome.txt», «w»)
data = f.read()
denc = pgpy_encrypt(g_key, data)
f.write(denc)

Теперь объединяем все вместе в основной команде __main__ , как показано ниже, и получаем работающую программу шифрования:

if __name__ == «__main__»:
print(«Welcome to Text File Encryptor.»)
keyState = input(«Generate a new Key(Y/N)»)

# Получает ключи
if (keyState == «Y»):
setKey(genKeys)
saveKey(getKey())
else:
path = input(«What is the key file path?»)
openKey(path)

state = input(«Are you encrypting or decrypting?»)
if (state == «encrypt»):
encryptFile(input(«Path to the file to encrypt?»), getKey())
else:
dencryptFile(input(«Path to the file to encrypt?»), getKey())

print(«Task complete.»)

Несмотря на то, что данная статья дает всего лишь представление о PGP, она может стать увлекательной отправной точкой для начинающих программистов и тех, кто интересуется кибербезопасностью и шифрованием.

Изучая открытое ПО и создавая с ним небольшие интересные проекты, вы начинает намного лучше разбираться в предмете. Поэтому всем любителям криптографии и кибербезопасности настоятельно рекомендую взять этот принцип на вооружение и разрабатывать собственные проекты.

  • Работа с панелью индикаторов. Руководство программиста Python. Часть 3
  • Как создать аналитический сайт на Python с нуля
  • Взломщик captcha на Python

Источник: nuancesprog.ru

Создание программ в среде Delphi для шифрования текстовой информации

Шурыгина Светлана Владимировна

Данная исследовательская работа была с успехом представлена на межшкольной конференции г. Самара «Я — Исследователь». Ее отметили как лучшую работу и она получила номинацию «Исследовательское мастерство». На заочном Всероссийском конкурсе исследовательских работ «Шаги в науку» ей присвоили лауреатство II степени.

В работе рассматривается вопрос шифрования информации. Ученик запрограммировал три широко известных шифра: шифр Атбаш, шифр Цезаря, шифр с помощью ключа. Он также придумал свой шифр простой замены и запрограммировал его. К работе прилагается автореферат, презентация защиты работы и написанные программы. Эти программы учителя могут использовать для объяснения соответствующей темы на уроках.

Скачать:

ВложениеРазмер
Package iconnikitin_vadim_samara_gimnaziyano1.zip 1.2 МБ

Предварительный просмотр:

ИССЛЕДОВАТЕЛЬСКИХ РАБОТ УЧАЩИХСЯ

Создание программ в среде Delphi

для шифрования текстовой информации

ученик 7В класса

МБОУ гимназия №1 г.о. Самара

г. Обнинск, 20014/2015 учебный год

Введение

На уроках информатики изучаются такие темы, как шифрование и кодирование информации. Я думаю, что большинству учащихся эти темы очень интересны. Я – не исключение. Меня они тоже очень заинтересовали. Я решил изучить поглубже тему шифрование информации, а за одно применить знания по программированию для создания шифрующих компьютерных программ.

Во все века и времена существовала информация, которую определенная группа лиц не хотела бы разглашать. Для таких ситуаций введены специальные понятия: государственная тайна, военная тайна, коммерческая тайна и т.д. В таком случае имеются законные пользователи, которым необходимо обмениваться информацией, а также существует противник, который стремится овладеть этой информацией. Наука, которая занимается защитой информации как раз и рассматривает такую ситуацию. Эта наука называется Криптологией.

Я решил написать программы, которые позволили бы автоматически, разными способами шифровать сообщения.

Цель работы: разработать алгоритмы и написать программы, с помощью которых можно зашифровать сообщения.

  1. Рассмотреть наиболее распространенные методы шифрования и дешифрования информации.
  2. Продумать алгоритмы и написать программы в системе программирования Delphi для наиболее распространенных методов шифрования. С помощью которых можно будет шифровать и дешифровать сообщения.
  3. Для того, чтобы написать алгоритмы пункта №2, овладеть необходимыми приемами обработки текстовой информации.

Я понимаю, что выбранная мною тема очень популярна и если покопаться в интернете то, скорее всего, можно найти готовые алгоритмы шифрования и, возможно даже, не одним способом. Но моя цель – написать и отладить программы самостоятельно, так как я ХОЧУ НАУЧИТЬСЯ ПРОГРАММИРОВАТЬ и прилагаю для этого много усилий.

Поэтому приложенные к данной работе программы вы нигде в Интернете не найдете, я их писал и отлаживал самостоятельно. Возможно, что они у меня получились не очень профессиональные, а в каких-то программах использовался не очень рациональный алгоритм. Но я хожу на кружки по программированию и постоянно узнаю что-то новое. Так что в будущем рассчитываю писать более качественные и сложные программы.

Теоретическая часть

Криптология в древнем мире

Проблема защиты информации путем её преобразования, исключающего её прочтение посторонним лицом, волновала человеческий ум с давних времен. История криптологии (kryptos — тайный, logos — наука) — ровесница истории человеческого языка.

Большинство современных исследователей связывают появление криптографии с появлением письменности, указывая, что эти процессы произошли почти одновременно. Методы секретной переписки были изобретены независимо в различных государствах древнего Востока, таких как Египет, Китай и Шумер, хотя сегодня очень трудно судить об уровне развития криптологии в этих обществах. Клинопись, рисуночное и иероглифическое письмо само по себе было крайне сложно и требовало длительного обучения, так что вопрос о шифровании сообщений часто попросту не поднимался, так как круг грамотных лиц был весьма ограничен.

Нельзя судить и о широте распространения различных криптографических систем и тайнописи, так как число дошедших до нас памятников очень невелико. Всю сложность данного вопроса иллюстрирует один пример: найдено множество глиняных табличек с клинописными знаками, записанными в несколько слоев (первоначальная запись замазывалась глиной и поверх нее наносилась новая). Подобные действия могли быть вызваны как применением тайнописи, так и просто удобством использования. Так или иначе, в древневосточных государствах, основу письменности которых составляли сложные системы клинописи, иероглифов и других условных обозначений, а круг грамотных лиц был ограничен, применение криптографии если и было, то скорее всего на весьма примитивном уровне.

Однако с развитием фонетического письма и значительным упрощением письменности, криптология получает значительный стимул к развитию. Развитию этой области знаний способствовали и развитие торговли, военного дела и дипломатической деятельности, которые создавали необходимый спрос на «продукцию» криптографов. Наибольшее развитие в это время криптография получает в Древней Греции, а позже в Риме. Это было обусловлено и своеобразным общественно-политическим строем этих обществ, так как при тирании любое сообщение, которое попытались бы скрыть криптографическими методами негосударственные органы, само по себе могло рассматриваться как преступление против государства, от которого ничто не должно скрыться.

Основные криптографические системы, многие из которых используются вплоть до наших дней были разработаны в Древней Греции и получили широкое практическое применение в Риме. В Древней Греции использовались как шифры замены, так и шифры перестановки. Так наиболее распространенным и получившим широкую известность в античном мире шифром замены является так называемый шифр Цезаря. Для того чтобы зашифровать сообщение, каждую его букву заменяли на другую букву латинского алфавита, но со сдвигом влево или вправо. Цезарь в своих посланиях к сенату заменял все буквы на три отстоящие слева, Август применял тот же шифр, но со сдвигом в четыре знака. Класс шифров, к которым относится и шифр Цезаря, называется шифрами замены .

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

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

Читайте также:
Remoteapp не удалось открыть программу или файл нет доступа

Отметим, что в этом шифре преобразование открытого текста в шифрованный заключается в определенной перестановке букв открытого текста. Поэтому класс шифров, к которым относится и шифр «Сцитала», называется шифрами перестановки .

Существовали и другие способы «механизации» криптографического дела, связанные прежде всего с именем древнегреческого полководца Энея Тактики. Он создал так называемый «диск Энея», получивший в Древней Греции широкое применение.

В небольшом диске высверливались отверстия, соответствующие буквам алфавита, через которые продевалась нить, в соответствии с буквами шифруемого текста. Для расшифровки нить вытягивали, получая обратную последовательность букв. Этот крайне примитивный на первый взгляд способ шифрования, был весьма эффективен, так как противнику, перехватившему сообщение было неизвестно, какая буква соответствует каждому отверстию. Кроме того, если возникала опасность перехвата сообщения, нить можно было легко порвать, тем самым уничтожив его.

Существовала также и «линейка Энея», использовавшая тот же принцип, что и диск. Значительным вкладом Энея стал и изобретенный им так называемый «книжный шифр», активно использовавшийся вплоть до ХХ века. В своем трактате «Об обороне укрепленных мест», Эней предлагал прокалывать малозаметные дырки над буквами текста какой-либо книги.

Сложив вместе отмеченные буквы адресат получал исходное сообщение. Римляне усовершенствовали диск Энея, создав первую многодисковую шифрующую систему. На общую ось одевали два диска с хаотичным расположением букв. Каждой букве первого диска соответствовала буква второго, что и составляло шифр. [2]

Криптология на современном этапе

Криптология разделяется на два направления — криптографию и криптоанализ. Цели этих направлений прямо противоположны.

Криптография занимается поиском и исследованием методов шифрования информации. Она даёт возможность преобразовывать информацию таким образом, что её прочтение (восстановление) возможно только при знании ключа.

Сфера интересов криптоанализа — исследование возможностей расшифровки информации без знания ключей.

Ключ — информация, необходимая для беспрепятственного шифрования и дешифрования текста.

Основные направления использования этих методов — передача конфиденциальной информации по каналам связи (например, по электронной почте), установление подлинности передаваемых сообщений, хранение информации (документов, баз данных) на носителях в зашифрованном виде.

Проблема использования криптографических методов в современных информационных системах становится в настоящее время особенно актуальной.

С одной стороны, расширилось использование телекоммуникационных сетей, по которым передаются большие объёмы информации государственного, коммерческого, военного и частного характера, не допускающего возможность доступа к ней посторонних лиц.

С другой стороны, появление новых мощных аппаратных и программных средств, эффективных технологий дешифрования снизило надёжность криптографических систем, ещё недавно считавшихся практически нераскрываемыми.

Еще раз заметим, что задача шифрования возникает только для информации, которая нуждается в защите. Обычно в таких случаях говорят, что информация содержит тайну или является защищаемой, приватной, конфиденциальной, секретной . Для наиболее типичных, часто встречающихся ситуаций такого типа введены даже специальные понятия:

  • государственная тайна;
  • военная тайна;
  • коммерческая тайна;
  • юридическая тайна;
  • врачебная тайна и т.д.

Далее мы будем говорить о защищаемой информации, имея в виду следующие признаки такой информации:

  • имеется какой-то определенный круг законных пользователей , которые имеют право владеть этой информацией;
  • имеются незаконные пользователи , которые стремятся овладеть этой информацией с тем, чтобы обратить ее себе во благо, а законным пользователям во вред.

Для простоты мы вначале ограничимся рассмотрением только одной угрозы — угрозы разглашения информации.

Теперь мы можем изобразить ситуацию, в которой возникает задача ТП, следующей схемой.

Здесь A и B — удаленные законные пользователи защищаемой информации; они хотят обмениваться информацией по общедоступному каналу связи. П — незаконный пользователь ( противник ), который может перехватывать передаваемые по каналу связи сообщения и пытаться извлечь из них интересующую его информацию. Эту схему можно считать моделью типичной ситуации, в которой применяются криптографические методы защиты информации.

Таким образом, шифрование — это способ сокрытия исходного смысла сообщения или другого документа, обеспечивающей искажение его первоначального содержимого. Преобразование обычного, понятного содержимого в код называется кодированием. При этом подразумевается, что имеется взаимное однозначное соответствие между символами текста и кода – в этом и заключается основополагающее отличие кодирования от шифрования. Часто кодирование и шифрование ошибочно принимают за одно и тоже, забыв о том, что для восстановления закодированного сообщения, достаточно знать правило замены, в то время как для расшифровки уже зашифрованного сообщения помимо знания правил шифрования, требуется ключ к шифру. Под ключом в данном случае подразумевается конкретное секретное состояние параметров алгоритмов шифрования и дешифрования. [6]

Многие шифры, не отличающиеся сложным алгоритмом, могут быть расшифрованы специалистами и без наличия ключа, для этого существуют некоторые специальные методы, называемые методами криптоанализа. Один из таких способов — это частотный анализ.

Этот метод предполагает, что каждая буква алфавита того или иного языка в довольно длинном тексте встречается с определенной частотой, к примеру, для русского языка известно, что буквы «О», «П», «Р» встречаются очень часто, а вот «Й», «Ъ» — редко. Как же работает данный метод? К примеру, имеется зашифрованный текст, полученный методом какой-либо перестановки букв по определенному алгоритму, и аналитикам требуется его расшифровать. Для этого берется открытый текст, желательно довольно длинный, затем подсчитывается в нем частота каждой буквы, причем, чем больше будет текст, тем точнее получится расшифровка.

Следующий шаг – то же самое проделывается с зашифрованным текстом, подсчитывается частота каждого символа. Собственно говоря, весь процесс расшифровки сводится к тому, что сопоставляются частоты двух текстов. Например, в открытом тексте буква «О» встречается с частотой 33%, то есть от общего количества букв текста, буква «О» составляет 33%, а в зашифрованном тексте с частотой 33% встречается буква «П», значит, с большей вероятностью под буквой «П» подразумевается «О».

Диаграмма частот букв русского языка

Стоит отметить, что, чем больше будут оба текста, тем точнее получится расшифровка текста. Однако, нельзя сказать, что это эффективный метод – существует множество таблиц распределения частот, но ни одна из них не является самой точной – в зависимости от стиля текста будет своя частотная диаграмма.

Имеется ли возможность использовать обыкновенные шифры, но не опасаться, что зашифрованное сообщение будет рассекречено? Да, можно, частотный анализ можно обмануть, причем довольно просто. Для этого используются шифры-омофоны, где одной букве исходного текста соответствует целый набор букв шифра. Количество символов в этом наборе равно частоте исходной буквы, при шифровании необходимо просто выбрать один символ из набора. Этот простой метод сведет пользу частотного анализа к нулю.

Кстати, некоторые методы частотного криптоанализа основываются не только на подсчете букв, но и буквосочетаний. Например, «ся» в русском языке встречается гораздо чаще, чем «ац», а «оь» вообще не встречается.

Практическая часть

После первых попыток написать алгоритмы к таким программам, я понял, что даже для самых простых шифров, они получаются достаточно сложными. Поэтому я решил для начала остановиться на шифрах замены, шифре Цезаря, шифре Атбаш и на шифровании с помощью ключа.

Итак, если имеются два человека, которые хотели бы обмениваться секретными сообщениями, то они могли бы взять одну из моих программ, описанных ниже. Одна и та же программа шифрует сообщение и дешифрует его.

Если информация действительно секретная, то ее шифровать лучше с помощью ключа. Так как шифр Цезаря и Атбаш легко поддадутся взламыванию.

Шифр Атбаш

Один из наиболее простых способов шифрования. Первая буква алфавита заменяется на последнюю, вторая – на предпоследнюю и т.д.

Пример: Криптология = Хпчрнсфсьча

Программа шифрования и дешифрования:

procedure TForm1.Button1Click(Sender: TObject);

Источник: nsportal.ru

Рейтинг
( Пока оценок нет )
Загрузка ...
EFT-Soft.ru