Всем привет. Сегодня мы с вами напишем программу для шифрования файлов и директорий на Python.
Существует множество опасностей для ваших данных, будь то взлом или потеря телефона, кража личных архивов фотографий, номеров кредитных карт или какой-либо интеллектуальной собственности. И конечно же я не говорю про материалы сохранённые на вашем компьютере, которые могут заинтересовать определённые структуры. Думаю нет смысла рассказывать в какое время мы живём и о пользе шифрования в целом.
Вариантов как зашифровать файлы достаточно много и сегодня мы рассмотрим процесс на примере библиотеки pyAesCrypt которая использует симметричный алгоритм шифрования.
Пишем скрипт шифрования
pip install pyAesCrypt
Создаём файл для шифрования, я назову его encryption.py и импортируем нужные нам модули:
import pyAesCrypt
import os
import sys
Нам понадобятся две функции, одна будет шифровать файлы, а вторая ходить по директориям по указанному нами пути и искать их.
Как Зашифровать и Расшифровать Текст на C++ (Криптография)
Напишем функцию шифрования. В качестве параметров она будет принимать файл и пароль:
# функция шифрования файла
def encryption(file, password):
# задаём размер буфера
buffer_size = 512 * 1024
# вызываем метод шифрования
pyAesCrypt.encryptFile(
str(file),
str(file) + «.crp»,
password,
buffer_size
)
# чтобы видеть результат выводим на печать имя зашифрованного файла
print(«[Файл ‘» + str(os.path.splitext(file)[0]) + «‘ зашифрован]»)
# удаляем исходный файл
os.remove(file)
Теперь напишем функцию обхода по директориям. То есть если по указанному нами пути будут встречаться другие директории, наш шифровальщик будет сканировать их на наличие файлов и зашифровывать всё что видит. Её параметрами будут путь до директории и пароль для шифрования:
# функция сканирования директорий
def walking_by_dirs(dir, password):
# перебираем все поддиректории в указанной директории
for name in os.listdir(dir):
path = os.path.join(dir, name)
# если находим файл, то шифруем его
if os.path.isfile(path):
try:
encryption(path, password)
except Exception as ex:
print(ex)
# если находим директорию, то повторяем цикл в поисках файлов
else:
walking_by_dirs(path, password)
С помощью функции input() запросим наш пароль и вызовем функцию walking_by_dirs():
password = input(«Введите пароль для шифрования: «)
walking_by_dirs(«path», password)
Пишем скрипт дешифровки
Перед испытаниями, давайте сразу создадим файл для дешифровки, decryption.py . Он на 99% будет аналогичен.
Копируем код. Меняем название функции, метод шифрования, на метод расшифровки. Не забываем в функции walking_by_dirs() так же заменить вызываемую функцию:
Как сделать свой скрипт для шифрования (+ задачка)
# функция дешифровки файла
def decryption(file, password):
# задаём размер буфера
buffer_size = 512 * 1024
# вызываем метод расшифровки
pyAesCrypt.decryptFile(
str(file),
str(os.path.splitext(file)[0]),
password,
buffer_size
)
# чтобы видеть результат выводим на печать имя зашифрованного файла
print(«[Файл ‘» + str(os.path.splitext(file)[0]) + «‘ дешифрован]»)
# удаляем исходный файл
os.remove(file)
# функция сканирования директорий
def walking_by_dirs(dir, password):
# перебираем все поддиректории в указанной директории
for name in os.listdir(dir):
path = os.path.join(dir, name)
# если находим файл, то дешифруем его
if os.path.isfile(path):
try:
decryption(path, password)
except Exception as ex:
print(ex)
# если находим директорию, то повторяем цикл в поисках файлов
else:
walking_by_dirs(path, password)
password = input(«Введите пароль для расшифровки: «)
walking_by_dirs(«path», password)
Если вы например шифруете файлы на удалённой машине, то неплохо бы удалить за собой рабочие скрипты. Мы можем сделать это c помощью модуля sys и следующего кода:
# при использовании данного кода, файлы encryption.py и decryption.py будут удалены после исполнения
os.remove(str(sys.argv[0]))
Сохраните свои исполняемые файлы если будете использовать код os.remove(str(sys.argv[0])) , иначе файлы будут удалены безвозвратно.
Как видите, всё просто. Наши скрипты готовы, Enjoy!
На канале Youtube канале PYTHONTODAY ты найдёшь видеоуроки:
- — по созданию ботов
- — парсингу сайтов
- — приложений на смартфон
- — машинному обучению и big data с нуля
Освой сетевую безопасность, и задавай вопросы в клубе.
Вступай в клуб Python разработчиков!
Спасибо, что дочитали до конца. Вы меня очень поддержите, если поставите «Лайк», оставите комментарий или ПОДПИШИТЕСЬ на мой канал 🙂
Источник: dzen.ru
Шифрование сообщений в Python. От простого к сложному. Шифр Цезаря
Мне, лично, давно была интересна тема шифрования информации, однако, каждый раз погрузившись в эту тему, я осознавал насколько это сложно и понял, что лучше начать с чего-то более простого. Я, лично, планирую написать некоторое количество статей на эту тему, в которых я покажу вам различные алгоритмы шифрования и их реализацию в Python, продемонстрирую и разберу свой проект, созданный в этом направлении. Итак, начнем.
Для начала, я бы хотел рассказать вам какие уже известные алгоритмы мы рассмотрим, в моих статьях. Список вам представлен ниже:
- Шифр Цезаря
- Шифр Виженера
- Шифр замены
- Омофонический шифр
- RSA шифрование
Шифр Цезаря
Итак, после небольшого введения в цикл, я предлагаю все-таки перейти к основной теме сегодняшней статьи, а именно к Шифру Цезаря.
Что это такое?
Шифр Цезаря — это простой тип подстановочного шифра, где каждая буква обычного текста заменяется буквой с фиксированным числом позиций вниз по алфавиту. Принцип его действия можно увидеть в следующей иллюстрации:
Какими особенностями он обладает?
У Шифра Цезаря, как у алгоритма шифрования, я могу выделить две основные особенности. Первая особенность — это простота и доступность метода шифрования, который, возможно поможет вам погрузится в эту тему, вторая особенность — это, собственно говоря, сам метод шифрования.
Программная реализация
В интернете существует огромное множество уроков, связанных с криптографией в питоне, однако, я написал максимально простой и интуитивно понятный код, структуру которого я вам продемонстрирую.
Начнем, пожалуй, с создания алфавита. Для этого вы можете скопировать приведенную ниже строку или написать все руками.
alfavit = ‘ABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZАБВГДЕЁЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯАБВГДЕЁЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯ’ # Создаем алфавит
Далее, нам нужно обозначить программе шаг, то есть смещение при шифровании. Так, например, если мы напишем букву «а» в сообщении, тот при шаге «2», программа выведет нам букву «в».
Итак, создаем переменную smeshenie, которая будет вручную задаваться пользователем, и message, куда будет помещаться наше сообщение, и, с помощью метода upper(), возводим все символы в нашем сообщении в верхний регистр, чтобы у нас не было ошибок. Потом создаем просто пустую переменную itog, куда мы буем выводить зашифрованное сообщение. Для этого пишем следующее:
smeshenie = int(input(‘Шаг шифровки: ‘)) #Создаем переменную с шагом шифровки message = input(«Сообщение для шифровки: «).upper() #создаем переменнную, куда запишем наше сообщение itog = » #создаем переменную для вывода итогового сообщения
Итак, теперь переходим к самому алгоритму шифровки. Первым делом создаем цикл for , где мы определим место букв, задействованных в сообщении, в нашем списке alfavit, после чего определяем их новые места (далее я постараюсь насытить код с пояснениями):
for i in message: mesto = alfavit.find(i) #Вычисляем места символов в списке new_mesto = mesto + smeshenie #Сдвигаем символы на указанный в переменной smeshenie шаг
Далее, мы создаем внутри нашего цикла условие if , в нем мы записываем в список itog мы записываем наше сообщение уже в зашифрованном виде и выводим его:
for i in message: mesto = alfavit.find(i) new_mesto = mesto + smeshenie if i in alfavit: itog += alfavit[new_mesto] # Задаем значения в итог else: itog += i print (itog)
Модернизация
Вот мы и написали программу, однако она имеет очень большой недостаток: «При использовании последних букв(русских), программа выведет вам английские буквы. Давайте это исправим.
Для начала создадим переменную lang, в которой будем задавать язык нашего шифра, а так же разделим английский и русский алфавиты.
alfavit_EU = ‘ABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZ’ alfavit_RU = ‘АБВГДЕЁЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯАБВГДЕЁЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯ’ smeshenie = int(input(‘Шаг шифровки: ‘)) message = input(«Сообщение для шифровки: «).upper() itog = » lang = input(‘Выберите язык RU/EU: ‘) #Добавляем возможность выбора языка
Теперь нам надо создать условие, которое проверит выбранный язык и применит его, то есть обратится к нужному нам алфавиту. Для этого пишем само условие и добавляем алгоритм шифрования, с помощью которого будет выполнено шифрование:
if lang == ‘RU’: for i in message: mesto = alfavit_RU.find(i) # Алгоритм для шифрования сообщения на русском new_mesto = mesto + smeshenie if i in alfavit_RU: itog += alfavit_RU[new_mesto] else: itog += i else: for i in message: mesto = alfavit_EU.find(i) # Алгоритм для шифрования сообщения на английском new_mesto = mesto + smeshenie if i in alfavit_EU: itog += alfavit_EU[new_mesto] else: itog += i
Дешифровка сообщения
Возможно это прозвучит несколько смешно, но мы смогли только зашифровать сообщение, а насчет его дешифровки мы особо не задумывались, но теперь дело дошло и до неё.
По сути, дешифровка — это алгоритм обратный шифровке. Давайте немного переделаем наш код (итоговый вид вы можете увидеть выше).
Для начала, я предлагаю сделать «косметическую» часть нашей переделки. Для этого перемещаемся в самое начало кода:
alfavit = ‘ABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZАБВГДЕЁЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯАБВГДЕЁЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯ’ smeshenie = int(input(‘Шаг шифровки: ‘)) message = input(«Сообщение для ДЕшифровки: «).upper() #заменяем слово шифровка, на дешифровка itog = »
Остальное можно оставить так же, но если у вас есть желание, то можете поменять названия переменных.
По большому счету, самые ‘большие’ изменения у нас произойдут в той части кода, где у нас находится алгоритм, где нам нужно просто поменять знак «+» на знак «-«. Итак, переходим к самому циклу:
if lang == ‘RU’: for i in message: mesto = alfavit_RU.find(i) new_mesto = mesto + smeshenie # Меняем знак + на знак — if i in alfavit_RU: itog += alfavit_RU[new_mesto] else: itog += i else: for i in message: mesto = alfavit_EU.find(i) # Меняем знак + на знак — new_mesto = mesto + smeshenie if i in alfavit_EU: itog += alfavit_EU[new_mesto] else: itog += i
Итоговый вид программы
Итак, вот мы и написали простейшую программу для шифрования методом Цезаря. Ниже я размещу общий вид программы без моих комментариев, чтобы вы еще раз смогли сравнить свою программу с моей:
alfavit_EU = ‘ABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZ’ alfavit_RU = ‘АБВГДЕЁЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯАБВГДЕЁЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯ’ smeshenie = int(input(‘Шаг шифровки: ‘)) message = input(«Сообщение для ДЕшифровки: «).upper() itog = » lang = input(‘Выберите язык RU/EU: ‘) if lang == ‘RU’: for i in message: mesto = alfavit_RU.find(i) new_mesto = mesto + smeshenie if i in alfavit_RU: itog += alfavit_RU[new_mesto] else: itog += i else: for i in message: mesto = alfavit_EU.find(i) new_mesto = mesto + smeshenie if i in alfavit_EU: itog += alfavit_EU[new_mesto] else: itog += i print (itog)
Итог
Вы успешно написали алгоритм шифровки и дешифровки сообщения на Python с помощью метода Цезаря. В следующей статье мы с вами рассмотрим Шифр Виженера, а также разберем его реализацию на Python, а пока я предлагаю вам написать в комментариях варианты модернизации программы(код или просо предложения и пожелания). Я обязательно учту ваше мнение.
- Python
- Программирование
Источник: habr.com
Криптография для самых маленьких: шифрование с примерами на Python
Каждый человек, который пользуется компьютером или смартфоном, ежедневно сталкивается с криптографией: начиная от работы в интернете по протоколу HTTPS и заканчивая печально известными вирусами-шифровальщиками. Однако далеко не все понимают, как работает криптография. Давайте попробуем в этом разобраться на конкретных примерах.
Криптогра́фия (от др.-греч. κρυπτός — скрытый и γράφω — пишу) — наука о методах обеспечения конфиденциальности (невозможности прочтения информации посторонним), целостности данных (невозможности незаметного изменения информации), аутентификации (проверки подлинности авторства или иных свойств объекта), а также невозможности отказа от авторства.
Одним из разделов криптографии является наука о шифровании. В процессе шифрования происходит обратимое изменение информации с помощью некоего секрета, что делает информацию недоступной для тех, кто секретом не владеет. Базовые принципы шифрования мы и рассмотрим в этой статье.
Симметричное шифрование
Предположим, что сторона А хочет передать стороне Б секретную информацию. Стоп. А, Б — это всё некрасиво и неудобно. Именно поэтому в криптографии принято называть стороны обмена информацией именами Алиса (Alice) и Боб (Bob).
Итак, как Алиса может передать сообщение, чтобы никто, кроме Боба, не смог прочесть его? Необходимо как-то изменить эти данные по заранее согласованному с Бобом алгоритму. Простейшим способом реализации такой задачи является подстановочный шифр — алгоритм, при котором каждая буква сообщения заменяется на другую букву. Например, вместо первой буквы алфавита («А») Боб c Алисой будут использовать третью («В»), вместо второй («Б») — четвертую («Г») и так далее.
В этом случае алгоритмом шифрования является сдвиг букв алфавита, а ключом — цифра 2 (сдвиг на две позиции). Любой, кто знает алгоритм и ключ, сможет расшифровать сообщение Алисы. Кстати, попробуйте и вы расшифровать это сообщение — стретвоокуф. Вам поможет простой пример на Python 3:
# -*- coding: utf-8 -*- ALPHA = u’абвгдеёжзийклмнопрстуфхцчшщьъэюя’ def encode(text, step): return text.translate( str.maketrans(ALPHA, ALPHA[step:] + ALPHA[:step])) def decode(text, step): return text.translate( str.maketrans(ALPHA[step:] + ALPHA[:step], ALPHA))
Такие алгоритмы шифрования, при которых Алиса и Боб должны заранее придумать и согласовать одинаковый секрет, называются симметричными, а рассмотренный пример является самым простым алгоритмом этой группы и называется шифром Цезаря. Он считается небезопасным, и его не рекомендуется использовать. Наиболее популярными и достаточно криптостойкими симметричными алгоритмами являются 3DES и AES.
Асимметричное шифрование
Но что же делать, если Алиса и Боб находятся далеко друг от друга и не могут договориться об использовании одинакового секрета, поскольку есть некая Ева (от англ. eavesdropper — подслушивающий), которая так и хочет узнать тайны Алисы и Боба? В этом случае Боб может отправить Алисе замок, ключ от которого есть только у него. Алиса положит письмо в коробку и запрёт её на этот замок. Теперь ни Алиса, ни Ева не смогут открыть коробку и прочесть письмо.
Редактор-модератор сообщества по теме Python / Data Science / AI Tproger , Удалённо , От 50 000 ₽
Аналогичный подход используется в асиметричном шифровании, которое также называют криптосистемой с открытым ключом. В примере с Алисой и Бобом секретным ключом Боба будет ключ от замка, а публичным ключом условно можно назвать сам замок. Отправка Алисе замка — это алгоритм согласования ключей.
Наиболее популярным алгоритмом шифрования с открытым ключом является RSA. Вот как выглядит его реализация на языке Python с использованием библиотеки RSA:
# -*- coding: utf-8 -*- import rsa #Боб формирует публичный и секретный ключ (bob_pub, bob_priv) = rsa.newkeys(512) #Алиса формирует сообщение Бобу и кодирует его в UTF8, #поскольку RSA работает только с байтами message = ‘hello Bob!’.encode(‘utf8’) #Алиса шифрует сообщение публичным ключом Боба crypto = rsa.encrypt(message, bob_pub) #Боб расшифровывает сообщение своим секретным ключом message = rsa.decrypt(crypto, bob_priv) print(message.decode(‘utf8’))
Более подробно с алгоритмом RSA можно ознакомиться в другой нашей статье.
Стоит также отметить, что асиметричные алгоритмы работают медленнее, чем симметричные, и очень часто встречается схема, когда по асимметричному алгоритму шифруется симметричный секрет и дальнейший обмен сообщениями происходит по симметричному алгоритму.
Заключение
В этой статье мы рассмотрели лишь один из разделов криптографии — шифрование. Если тема вас заинтересовала, следите за нашими дальнейшими публикациями, а также посмотрите подборку с материалами по криптографии.
Источник: tproger.ru