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() хорошо написано в .