✍️ Статья AES шифрование

The 146X Project Dublikat Web Studio Avram Lincoln AL Service Navigator Knyaz

Tartuga

💰 Проверенный продавец
Регистрация
19.12.2019
Сообщения
93
AES (Advanced Encryption Standard) - симметричный алгоритм блочного шифрования, который был доработан из конкурсного проекта Rijndael, который был принят в качестве стандарта шифрования правительством США.

Он был разработан бельгийскими криптографами Винсентом Райменом и Джоан Дэймен еще в 1998 году.

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

Требования NIST к конкурсу были следующими:

  • Алгоритм должен был принимать ключи размером 128, 192 и 256 бит
  • Алгоритм должен был быть открытым для публичного анализа
  • Должна была быть высокая вычислительная эффективность и эффективность использования памяти (если алгоритм должен был быть выпущен в качестве стандарта, он должен был быть недорогим)
  • Гибкость и простота реализации
Rijndael стал победителем и в 2000 году было предложено стать новым стандартом. В 2002 году Rijndael(AES) был утвержден, как стандарт.



Концепция
AES для шифрования 128-, 192- и 256-битные ключи. АНБ использует его для хранения документов: вплоть до уровня SECRET применяется шифрование с ключом длиной в 128 бит, информация TOP SECRET требует ключа в 192 или 256 бит. В дополнение к высокой криптостойкости алгоритм базируется на не самой сложной математике(что привело к множеству споров - настолько ли он стойкий).

В начале заполняется массив State входными данными по формуле State[row][col] = input[row + 4col] , где row и col по стандарту равны 4.

AES работает в nr количество раундов шифрования. Каждый раунд представляет собой последовательность из нескольких этапов обработки.

Количество раундов варьируется в зависимости от длины ключа, соответственно 10 раундов для 128-битных ключей, 12 раундов для 192-битных ключей и 14 раундов для 256-битных ключей.

Алгоритм имеет в каждом раунде четыре этапа обработки, каждая из которых своим образом влияет на состояние State и в конечном итоге приводит к результату: SubBytes(), ShiftRows(), MixColumns() и AddRoundKey().

e45e7365eb58568f3b9f2.png

Схема выполнения алгоритма шифрования


Идея дешифровки состоит в следующем: если с тем же ключевым словом выполнить последовательность трансформаций, инверсных трансформациям шифрования, то получится исходное сообщение. Такими инверсными трансформациями являются InvSubBytes(), InvShiftRows(), InvMixColumns() и AddRoundKey().

e8cf3dca8f14b3795b738.png

Схема алгоритма дешифровки

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



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


import pyAesCrypt
import os

def encrypt_or_decrypt(mode, key, file_path):
bufferSize = 64*1024
if mode == 'e': #если введен мод у(encryption), то зашифровываем файл
try:
pyAesCrypt.encryptFile(file_path, file_path+'.crp', key, bufferSize)
os.remove(file_path) #удаляет файл по данному адресу
except FileNotFoundError:
print("file not found!")
else:
print('file encrypt')
else: #если введен мод d(decryption), то расшифровываем файл
try:
pyAesCrypt.decryptFile(file_path, os.path.splitext(file_path)[0], key, bufferSize)
os.remove(file_path)
except FileNotFoundError:
print("file not found!")
except ValueError:
print("key is false!")
else:
print('file decrypt')

if __name__ == '__main__':
mode = input('Write crypt mode e/d: ')
if mode not in ['e', 'd']:
print('Mode is not correct!')
raise SystemExit
key = input('Write key: ')
file_path = input('Write file path: ')
encrypt_or_decrypt(mode, key, file_path)



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

📌 Золотая реклама

AnonPaste

Верх