Шифрование и дешифрование файлов с помощью Python
Шифрование — это процесс кодирования информации, позволяющий только авторизованным сторонам получить к ней доступ.
Хотим поделиться с вами, как можно шифровать файлы, используя Python с помощью библиотеки cryptography, построенной на основе алгоритма AES. Возможно кому-то, также как и нам, такой способ покажется более простым для шифрования файла с данными.
В данном примере используется симметричное шифрование. Тот же ключ, который применяется для шифрования данных, можно использовать для их дешифрования.
Итак, установим библиотеку cryptography:
pip install cryptography
Открываем новый файл Python:
from cryptography.fernet import Fernet
Создаем ключ и сохраняем его в файл, например, crypto.key:
def write_key(): # Создаем ключ и сохраняем его в файл key = Fernet.generate_key() with open(‘crypto.key’, ‘wb’) as key_file: key_file.write(key)
Внимание! Сгенерированный ключ crypto.key необходимо хранить в надежном месте. В случае его потери невозможно будет расшифровывать данные, которые были зашифрованы этим ключом.
Этот ключ уникален, и нет необходимости генерировать ключ каждый раз, когда потребуется зашифровать что-либо.
Создадим функцию для загрузки этого ключа:
def load_key(): # Загружаем ключ ‘crypto.key’ из текущего каталога return open(‘crypto.key’, ‘rb’).read()
Далее понадобится создать функцию для шифрования файла:
def encrypt(filename, key): # Зашифруем файл и записываем его f = Fernet(key)
После инициализации объекта Fernet с заданным ключом прочитаем этот файл:
with open(filename, ‘rb’) as file: # прочитать все данные файла file_data = file.read()
После этого, зашифровываем данные:
# Зашифровать данные encrypted_data = f.encrypt(file_data)
Запишем зашифрованный файл с тем же именем, чтобы он переопределил оригинал:
# записать зашифрованный файл with open(filename, ‘wb’) as file: file.write(encrypted_data)
Теперь создадим функцию расшифровки файла:
def decrypt(filename, key): # Расшифруем файл и записываем его f = Fernet(key) with open(filename, ‘rb’) as file: # читать зашифрованные данные encrypted_data = file.read() # расшифровать данные decrypted_data = f.decrypt(encrypted_data) # записать оригинальный файл with open(filename, ‘wb’) as file: file.write(decrypted_data)
И, наконец, проверим это на конкретном файле, разместив шифруемый файл и ключ в текущем каталоге.
Например, для шифрования файла с именем ‘report.csv’вызываем созданную функцию encrypt():
# раскомментируйте следующую строку, если запускаете код впервые, чтобы сгенерировать ключ # write_key() # загрузить ключ key = load_key() # имя шифруемого файла file = ‘report.csv’ # зашифровать файл encrypt(file, key)
После шифрования будет видно, что размер файла ‘report.csv’увеличился, и мы не сможем прочитать содержимое этого файл.
Чтобы вернуть файл ‘report.csv’в исходную форму, вызовем функцию decrypt ():
# расшифровать файл decrypt(file, key)
Получаем исходный файл ‘report.csv’вместо ранее зашифрованного.
Обратите внимание на то, что при применении данного кода, размер файла не должен превышать объем оперативной памяти.
Применение этого несложного кода Python даст возможность надежно защитить данные от несанкционированного доступа к ним и соблюсти требования кибербезопасности при работе с критически важной информацией. При этом установки какого-либо специального программного обеспечения не требуется.
Шифрование с помощью DES Python
Криптография — это один из главных инструментов обеспечения безопасности. В предыдущей статье я рассказывал про шифрование в Python с помощью библиотек Cryptography и PyCryptodome. Сегодня поговорим про блочный шифр DES.
Шифрование с помощью DES Python
DES — это блочный шифр это означает, что текст для шифрования должен быть кратным восьми, поэтому вам нужно добавить пробелы в конце текста, который вы хотите зашифровать, чтобы получить восемь символов. Работа шифровального API происходит следующим образом:
Сначала создается экземпляр объекта шифра, вызвав функцию new ( ) из соответствующего модуля шифрования с использованием следующего синтаксиса: Crypto . Cipher . DES . new ( ) . Первый параметр — это криптографический ключ, и его длина зависит от используемого шифра. Вы можете передать дополнительные параметры, специфичные для шифра или режима работы.
Для шифрования данных вызовите метод encrypt ( ) объекта шифра с текстом. Метод возвращает зашифрованный фрагмент текста.
Для дешифрования данных вызовите метод decrypt ( ) объекта шифра с шифротекстом. Метод возвращает фрагмент обычного текста.
Следующий сценарий шифрует и имя пользователя, и сообщение, симулирует прием учетных данных сервером, а затем отображает расшифрованные данные:
Шифр Цезаря в Python – руководство по шифрованию
В этом руководстве мы рассмотрим один из методов шифрования в Python, называемый Caesar Cipher. Это часть криптографии.
Вступление
В этом методе каждый символ заменяется буквой с определенной фиксированной числовой позицией, которая находится после или перед буквой. Например, буква B заменяется на стоящую двумя позициями дальше D. D становится F и так далее. Этот метод назван в честь Юлия Цезаря, который использовал его для общения с официальными лицами.
Для реализации шифра Цезаря в Python используется алгоритм. Давайте в нем разберемся.
Особенность алгоритма шифрования Цезаря
Этот алгоритм состоит из нескольких функций, которые приведены ниже.
- Метод довольно прост в применении.
- Каждый текст заменяется фиксированным номером позиции вниз или вверх по алфавиту.
- Это простой тип заменяющего шифра.
Для определения каждой последней части текста, который был перемещен вниз, требуется целочисленное значение. Это целочисленное значение также известно как сдвиг.
Мы можем представить эту концепцию с помощью модульной арифметики, сначала преобразовав букву в числа в соответствии со схемой: A = 0, B = 1, C = 2, D = 3 …… .. Z = 25.
Следующая математическая формула может использоваться для сдвига буквы n.
Как расшифровать?
Расшифровка такая же, как и шифрование. Мы можем создать функцию, которая выполнит сдвиг по противоположному пути, чтобы расшифровать исходный текст. Однако мы можем использовать циклическое свойство шифра под модулем.
Эту же функцию можно использовать для расшифровки. Вместо этого мы изменим значение сдвига так, чтобы сдвиг = 26 – сдвиг.

Давайте разберемся в следующем примере –
def encypt_func(txt, s): result = "" # transverse the plain txt for i in range(len(txt)): char = txt[i] # encypt_func uppercase characters in plain txt if(char.isupper()): result += chr((ord(char) + s - 64) % 26 + 65) # encypt_func lowercase characters in plain txt else: result += chr((ord(char) + s - 96) % 26 + 97) return result # check the above function txt = "CEASER CIPHER EXAMPLE" s = 4 print("Plain txt : " + txt) print("Shift pattern : " + str(s)) print("Cipher: " + encypt_func(txt, s))
Plain txt : CEASER CIPHER EXAMPLE Shift pattern : 4 Cipher: HJFXJWsHNUMJWsJCFRUQJ
Приведенный выше код проходил символ за раз. Он передавал каждый символ по правилу в зависимости от процедуры шифрования и дешифрования текста.
Мы определили несколько конкретных наборов позиций, которые генерируют зашифрованный текст.
Нарушение алгоритма шифрования Цезаря
Взломать зашифрованный текст можно разными способами. Один из способов – это метод грубой силы, который включает в себя проверку всех возможных ключей дешифрования. Этот прием не такой сложный и не требует больших усилий.
msg = 'rGMTLIVrHIQSGIEWIVGIEWIV' #encrypted msg LETTERS = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' for k in range(len(LETTERS)): transformation = '' for s in msg: if s in LETTERS: n = LETTERS.find(s) n = n - k if n < 0: n = n + len(LETTERS) transformation = transformation + LETTERS[n] else: transformation = transformation + s print('Hacking k #%s: %s' %(k, transformation))
Hacking k #25: rHNUMJWrIJRTHJFXJWHJFXJW
Транспонирующий шифр
Алгоритм шифрования транспонирования – это метод, при котором алфавитный порядок в открытом тексте перестраивается для формирования зашифрованного текста. Этот алгоритм не поддерживает настоящие текстовые алфавиты.
Давайте разберемся с этим алгоритмом на примере.
Мы возьмем простой пример под названием столбчатый шифр транспозиции, в котором мы пишем каждый символ текста по горизонтали с указанной шириной алфавита. Вертикально написанные тексты являются зашифрованными, что создает совершенно непохожий на зашифрованный текст.
Давайте возьмем простой текст и применим технику простого столбчатого транспонирования, как показано ниже.

Мы разместили простой текст по горизонтали, и зашифрованный текст создается с вертикальным форматом: hotnejpt.lao.lvi. Чтобы расшифровать это, получатель должен использовать ту же таблицу для расшифровки текста.
def split_len(sequence, length): return [sequence[i:i + length] for i in range(0, len(sequence), length)] def encode(k, plaintxt): order = < int(val): n for n, val in enumerate(k) >ciphertext = '' for index in sorted(order.ks()): for part in split_len(plaintxt, len(k)): try:ciphertext += part[order[index]] except IndexError: continue return ciphertext print(encode('3214', 'HELLO'))
В приведенном выше коде мы создали функцию с именем split_len(), которая выдавала текстовый символ, размещенный в формате столбцов или строк.
Метод encode() создал зашифрованный текст с ключом, определяющим количество столбцов, и мы распечатали каждый зашифрованный текст, прочитав каждый столбец.
Примечание. Техника транспонирования призвана значительно улучшить криптобезопасность. Криптоаналитики замечают, что повторное шифрование зашифрованного текста с использованием того же шифра транспозиции показывает лучшую безопасность.
Как работает шифрование и дешифрование строки python
Есть ряд библиотек, позволяющие нам шифровать данные на Python, например cryptography :
from cryptography.fernet import Fernet key = Fernet.generate_key() f = Fernet(key) token = f.encrypt(b"Это секретное сообщение.") # шифрование данных token # . f.decrypt(token) # дешифрование данных 'Это секретное сообщение.'
Подробнее можно почитать в документации библиотеки Cryptography .
Также можете обратить внимание на Simple Crypt , Cryptocode и RSA .
Стоит также упомянуть про hashlib , который входит в стандартную библиотеку и реализует общий интерфейс для множества различных безопасных алгоритмов хеширования и дайджеста сообщений.
Конструкторы для алгоритмов хэширования, которые всегда присутствуют в этом модуле являются md5() , sha1() , sha224() , sha256() , sha384() , и sha512() . Если вам нужны хеш-функции adler32 или crc32 , то они доступны в модуле zlib .
import hashlib hash = hashlib.sha256() hash.update(b"Nobody inspects") hash.update(b" the spammish repetition") hash.hexdigest() # '031edd7d41651593c5fe5c006fa5752b37fddff7bc4e843aa6af0c950f4b9406' hash.digest_size # 32 hash.block_size # 64
1) hash.update() обновляет хеш-объект с помощью байтового объекта. Повторные вызовы эквивалентны одиночному вызову с объединением всех аргументов: m.update(a); m.update(b) эквивалентно m.update(a+b) ;
2) hash.hexdigest() возвращает дайджест как значение строки шестнадцатеричных данных;
3) hash.digest_size - размер полученного хеша в байтах;
4) hash.block_size - внутренний размер блока алгоритма хеширования в байтах.
Более подробно можете ознакомиться в документации .