Найти в Дзене

AES шифрование

Advanced Encryption Standard, также известный как Rijndael — симметричный алгоритм блочного шифрования, принятый в качестве стандарта шифрования правительством США по результатам конкурса AES. Этот алгоритм хорошо проанализирован и сейчас широко используется. Он был разработан бельгийскими криптографами Винсентом Райменом и Джоано Дэйменом еще в 1998 году. Национальный институт стандартов и технологий (NIST) открыл для криптографов конкурс на разработку алгоритма замены популярного до сих пор стандарта (DES) в связи с ненадлежащим уровнем его защиты, с повышением уровня вычислительной мощности выросла уязвимость от атак брутфорсом из-за ограниченного выбора ключей шифрования. Брутфорс - это метод взлома,путем подбора. Требования NIST к конкурсу были следующими: Rijndael стал победителем и в 2000 году было предложено стать новым стандартом. В 2002 году Rijndael(AES) был утвержден, как стандарт. AES для шифрования 128-, 192- и 256-битные ключи. АНБ использует его для хранения до

Advanced Encryption Standard, также известный как Rijndael — симметричный алгоритм блочного шифрования, принятый в качестве стандарта шифрования правительством США по результатам конкурса AES. Этот алгоритм хорошо проанализирован и сейчас широко используется.

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

Национальный институт стандартов и технологий (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().

-2

Далее по каждую функцию я не буду рассматривать,так как очень долго. Подробнее по всей концепции вы можете почитать на 1)https://habr.com/ru/post/212235/ или в официальной документации 2)https://csrc.nist.gov/csrc/media/publications/fips/197/final/documents/fips-197.pdf

Реализация

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

import pyAesCrypt
import os

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)

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