Как зашифровать текст на питоне
Перейти к содержимому

Как зашифровать текст на питоне

  • автор:

Как работает шифрование и дешифрование строки 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 — внутренний размер блока алгоритма хеширования в байтах.

Более подробно можете ознакомиться в документации .

Как шифровать текст в python?

Я знаю, как кодировать текст в base64 на python. Но мне нужно именно шифрование, и способ расшифровки должен быть непопулярным. Как это можно осуществить на питоне?
P.S. я не буду использовать библиотеки по типу pyAesCrypt

  • Вопрос задан 12 мар. 2023
  • 490 просмотров

1 комментарий

Простой 1 комментарий

MixaPro1971 @MixaPro1971
Всё просто — используйте одноразовый блокнот.
Решения вопроса 0
Ответы на вопрос 4

AgentSmith

Николай Савельев @AgentSmith
Это мой правильный ответ на твой вопрос

способ расшифровки должен быть непопулярным.

А вот это уже смешно. Чем тебя не устраивают популярные способы типа RSA?
Ты, видимо, не слышал о термине Security through obscurity , на котором обожглись многие и ты хочешь повторить их путь

Ответ написан 12 мар. 2023
Нравится 12 10 комментариев
whoiam_frontend @whoiam_frontend Автор вопроса
Устраивают, но на популярные шифровки полно дешифраторов, хочу избежать этого

AgentSmith

Николай Савельев @AgentSmith

whoiam_frontend, ЧЕГОООО.
Дешифратор для RSA, не зная приватного ключа?
Мальчик, да ты только что разрушил всю основу криптографии! Можно смело забыть про HTTPS и банковские переводы. whoiam_frontend умеет взламывать то, что хакеры поломать не могут.
И запомни — чем более открытый алгоритм шифрования, тем он более безопасен. Закрытые алгоритмы самые взламываемые

AgentSmith

Николай Савельев @AgentSmith

whoiam_frontend, Вот тебе зашифрованное реальное сообщение с помощью популярного RSA, зашифрован 2048-битным ключом (это тебе подсказка), зашифровал сам только что
Алгоритм RSA открыт и широко всем известен, в нём нет никакого секрета. На, читай, но знание алгоритма тебе не поможет https://ru.wikipedia.org/wiki/RSA

i/SLZ5IVrrHqZvboJQQzQC5RWqHUD+TmcJph0lWpg5CkvVmj+mF49WvYDqD2lltnu6gAwymlN59mrkFzpMgpZIdAJOuAfDYU/Y8VqJg4kCa/bMVpaiv9LF2SNWYAyveXRuOGqRG9yXVEQuX3euOOBuzWL6Sm0iiNCwOCEXa14jMSL8uWDtlTuOtHOTfH9fkkpj3F5pwu81i7KDXNUiyyEGJkUp4n1sUT7+urmIEE9/HDO3ewitkw9kBQU6tpq/yp9o5OW99Ey+eDPZIYqxIUKM51YaBDocU0MaBheuQ2A31a5YSrguk9r05hVBQ1LOnjsU4z3uYCLJRZC+UZ93Aeagk09uOIToS52H4IMNzANkUcVGHXA8qGLe29XJBJDBq0y/3vS8yG/KfET6YMzhdVm/dTST+GFdcUZffwr5J+NXBnQXkJt4zhDP6IJPiwuopq9Tn/ngISC/0271pOJ7I4gkPTPtyObZ7J9cgzVQlPW21Ej99y6cVaJ1Ivft74GoKhQEXZG5rPxhtbNy3vwc62RTeSh0VeAeNV5GFJi73QvMcpVIyW469LEGnJbkpZb3wWHp4hg3EjDYUcVBPi71Zz9NVB2cnLpC/PxDoT9NNvO6//1KIFHW/qIGr+Nq96qiSQSiMzAVYWxBAEc9tc4HawGanE1VEJ4USQTqLMWrUBZFd8WI2DoSdmDlVyb58x9kLcCqt/5crI9Rbq4ZJnCoPsT+PdKQIQZZytkCVFsYdhAZyqWfy5jO6UVjdjggfCHOP/6bYRdnilbqCLuMgasJq9c6w7w8ffi/m6R1SfnYc3FitBFhJN24J6KF88+f1iyI94+IgKTw9vuDM4iBHocQX0sOAL2z9MF8IS4cCndkd1htJtbV8x3b4YOOWOcNERyUn2+uUJ3/iOJislfDRFp6abVsrG5Xv20zwUlTm2SBPx4YlPFicP9K8D7xgp1kNTJI6c7Oyrg7NxB2ZUcZkSKBnNunY8NS7iGo8r/vvHOql32j6eW+wlbRaSjfg1TU199BBWnIclYAxBPw4EXpetItgvX8Rf7NNdWIdlhORT74y7l0ZuvbrtX17xRWSbaKy1R9H0roSZ5hLovqJvyaOpJzYtWnQy2TAttd5x4Es0d1MW2Qw/98m1RGmJaGXrBTJtQAE65nBwOWs07aOB6O9O9FXetSedXK5k+DlX4X1iX5Vc0qzIsF7vObIEzBCGqOlxHLXVnhMiEPp1JU8zkyAYCPWj7cYaz932MBL1q91YTX4kOvwBGBauq1vDeIewOkX11OyH4AkyMxDLSIGY8CVkmAOFeDcMUoU5iXe+F90hUQUK+C30fI/TslEj39LlJD7J+IWW+KeHrCPYs/6MwUKM5D1NplGsbIf1KngBNj29rlR4iyWGEdRiSGOFgtH1Anql7bdyqtdGmSkl6URLr9tWXiWgJIC1Cw+WKXR/Rlz8tz7HSDl60WBxsLPhrcYK1MZ+9EEh2pmEKdGBFXbUVbKBOt4B/rEkzpp9iGEZwPJcb72t74OnvPChTHGci47Mdb0Sc+BzorY=

Вперёд, ломай.
Если осилишь — тебе математики памятник поставят.
Можешь использовать это: «на популярные шифровки полно дешифраторов»

Шифрование сообщений в 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
  • Программирование

Шифрование и дешифрование файлов с помощью 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 даст возможность надежно защитить данные от несанкционированного доступа к ним и соблюсти требования кибербезопасности при работе с критически важной информацией. При этом установки какого-либо специального программного обеспечения не требуется.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *