22.09.2019 19:30
Occul
 
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().




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

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




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

Реализация
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)
Тут все предельно просто, и думаю, что дополнительных комментариев приводить не нужно.

p.s. Обязательно почитайте про концепцию алгоритма по ссылкам и разберитесь с математикой функции MixColums(), там достаточно несложно.

Про получение таблицы для функции SubBytes() хорошо написано в википедии.

Форум на базе vBulletin®
Copyright © Jelsoft Enterprises Ltd.
В случае заимствования информации гипертекстовая индексируемая ссылка на Форум обязательна.