Алгоритм шифрования AES

Автор: Пользователь скрыл имя, 26 Ноября 2011 в 09:27, курсовая работа

Краткое описание

Шифрование — способ преобразования открытой информации в закрытую и обратно. Применяется для хранения важной информации в ненадёжных источниках или передачи её по незащищённым каналам связи. Согласно ГОСТ 28147-89, шифрование подразделяется на процесс зашифровывания и расшифровывания.
В зависимости от алгоритма преобразования данных, методы шифрования подразделяются на гарантированной или временной крипто-стойкости.

Оглавление

Введение 2
История AES 3
Описание AES 4
Программная реализация алгоритма AES 11
Листинг программы 13
Заключение 32
Список использованной литературы 33

Файлы: 1 файл

Курсач.docx

— 365.25 Кб (Скачать)

где , и где bi есть i-ый бит b, а ci — i-ый бит константы c = 6316 = 9910 = 011000112. Таким образом, обеспечивается защита от атак, основанных на простых алгебраических свойствах.

ShiftRows()

 В процедуре  ShiftRows, байты в каждой строке state циклически сдвигаются влево.  Размер смещения байтов каждой строки зависит от её номера

ShiftRows работает  со строками State. При этой трансформации  строки состояния циклически  сдвигаются на r байт по горизонтали,  в зависимости от номера строки. Для нулевой строки r = 0, для первой  строки r = 1 Б и т. д. Таким образом каждая колонка выходного состояния после применения процедуры ShiftRows состоит из байтов из каждой колонки начального состояния. Для алгоритма Rijndael паттерн смещения строк для 128- и 192-битных строк одинаков. Однако для блока размером 256 бит отличается от предыдущих тем, что 2, 3, и 4-е строки смещаются на 1, 3, и 4 байта, соответственно.

MixColumns()

 

 В процедуре  MixColumns, каждая колонка состояния  перемножается с фиксированным  многочленом c(x).

В процедуре MixColumns, четыре байта каждой колонки State смешиваются, используя для этого обратимую  линейную трансформацию. MixColumns обрабатывает состояния по колонкам, трактуя каждую из них как полином четвёртой  степени. Над этими полиномами производится умножение в GF(28) по модулю x4 + 1 на фиксированный  многочлен c(x) = 3x3 + x2 + x + 2. Вместе с ShiftRows , MixColumns вносит диффузию в шифр

AddRoundKey()

В процедуре AddRoundKey, каждый байт состояния объединяется с RoundKey используя XOR operation ().

В процедуре AddRoundKey, RoundKey каждого раунда объединяется со State. Для каждого раунда Roundkey получается из CipherKey используя процедуру KeyExpansion; каждый RoundKey такого же размера, что и State. Процедура производит побитовый XOR каждого байта State с каждым байтом RoundKey.

Алгоритм  обработки ключа

Алгоритм обработки  ключа состоит из двух процедур:

  • Алгоритм расширения ключа
  • Алгоритм выбора раундового ключа (ключа итерации)

Алгоритм  расширения ключа

AES алгоритм, используя  процедуру KeyExpansion() и подавая в  неё Cipher Key, K, получает ключи для  всех раундов. Всего она получает Nb*(Nr + 1) слов: изначально для алгоритма  требуется набор из Nb слов, и каждому  из Nr раундов требуется Nb ключевых  набора данных. Полученный массив  ключей для раундов обозначается  как , . Алгоритм KeyExpansion() показан в псевдо коде ниже.

Функция SubWord() берет  четырёхбайтовое входное слово  и применяет S-box к каждому из четырёх  байтов то, что получилось подается на выход. На вход RotWord() подается слово [a0,a1,a2,a3] которое она циклически переставляет и возвращает [a1,a2,a3,a0]. Массив слов, слов постоянный для данного раунда, , содержит значения [xi − 1,00,00,00], где x = {02}, а xi − 1 является степенью x в (i начинается с 1).

Из рисунка  можно увидеть, что первые Nk слов расширенного ключа заполненны Cipher Key. В каждое последующее слово, w[i], кладётся значение полученное при операции XOR w[i − 1] и , те XOR’а предыдущего и на Nk позиций раньше слов. Для слов, позиция которых кратна Nk, перед XOR’ом к w[i-1] применяется трасформация, за которой следует XOR с константой раунда Rcon[i]. Указанная выше трансформация состоит из циклического сдвига байтов в слове(RotWord()), за которой следует процедура SubWord() — то же самое, что и SubBytes(), только входные и выходные данные будут размером в слово.

Важно заметить, что процедура KeyExpansion() для 256 битного Cipher Key немного отличается от тех, которые применяются для 128 и 192 битных шифроключей. Если Nk = 8 и i − 4 кратно Nk, то SubWord() применяется к w[i − 1] до XOR’а.

KeyExpansion(byte key[4*Nk], word w[Nb*(Nr+1)], Nk)

Псевдокод для Key Expansion

begin

    word temp

    i = 0;

   

    while ( i < Nk)

        w[i] = word(key[4*i], key[4*i+1], key[4*i+2], key[4*i+3])

        i = i+1

    end while

   

    i = Nk 

    while ( i < Nb * (Nr+1))

        temp = w[i-1]

        if (i mod Nk = 0)

            temp = SubWord(RotWord(temp)) xor Rcon[i/Nk]

        else if (Nk > 6 and i mod Nk = 4)

            temp = SubWord(temp)

        end if

        w[i] = w[i-Nk] xor temp

        i = i + 1

    end while

end

Псевдокод для Key Expansion

Расшифрование

Псевдокод для Inverse Cipher

InvCipher(byte in[4*Nb], byte out[4*Nb], word w[Nb*(Nr+1)])

begin

    byte state[4,Nb]

   

    state = in 

    AddRoundKey(state, w[Nr*Nb, (Nr+1)*Nb-1]) 

    for round = Nr-1 step -1 downto 1

        InvShiftRows(state)

        InvSubBytes(state)

        AddRoundKey(state, w[round*Nb, (round+1)*Nb-1])

        InvMixColumns(state)

    end for 

    InvShiftRows(state)

    InvSubBytes(state)

    AddRoundKey(state, w[Nr*Nb, (Nr+1)*Nb-1]) 

    out = state

end 

Алгоритм  выбора раундового ключа

На каждой итерации i раундовый ключ для операции AddRoundKey выбирается из массива  начиная с элемента до . 

Варианты  алгоритма

На базе алгоритма Rijndael, лежащего в основе AES, реализованы альтернативные криптоалгоритмы. Среди наиболее известных — участники конкурса Nessie: Anubis на инволюциях, автором которого является Винсент Рэймен и усиленный вариант шифра — Grand Cru Йохана Борста. 

Криптостойкость

В июне 2003 года Агентство  национальной безопасности США постановило, что шифр AES является достаточно надёжным, чтобы использовать его для защиты сведений, составляющих государственную  тайну (англ. classified information). Вплоть до уровня SECRET было разрешено использовать ключи  длиной 128 бит, для уровня TOP SECRET требовались  ключи длиной 192 и 256 бит.

Программная реализация алгоритма AES

Пример 1

Выберем действие “Шифрование”, затем выберем файл с расширением .txt, нажимаем на кнопку “Шифровать” (также можно выбрать параметры шифрования слева в поле “Выполнение процесса”). Программа создает файл EncodedFile.txt рядом с исходным файлом. 

Рисунок 1. Шифрование. 
 

Пример 2

Выполним обратное действие. В поле исходный файл выберем  созданный ранее программой файл EncodedFile.txt, выберем действие “Дешифровать”. Программа создает файл DecodedFile.txt рядом с исходным файлом.   

Рисунок 2. Дешифрование. 
 
 
 
 
 
 

Листинг программы

unit Main;

interface

uses

  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,

  StdCtrls, Math, Buttons, ExtCtrls, Menus, jpeg, pngimage;

type

  EAESError = class(Exception);

  PInteger  = ^Integer;

  TAESBuffer = array [0..15] of byte;

  TAESKey128 = array [0..15] of byte;

  TAESExpandedKey128 = array [0..43] of longword;

  PAESBuffer =^TAESBuffer;

  PAESKey128 =^TAESKey128;

  PAESExpandedKey128 =^TAESExpandedKey128;

  TForm1 = class(TForm)

    Label1: TLabel;

    Edit1: TEdit;

    OpenDialog1: TOpenDialog;

    Button1: TButton;

    Button2: TButton;

    Label2: TLabel;

    Label3: TLabel;

    Label4: TLabel;

    Label5: TLabel;

    Edit2: TEdit;

    Label_Time: TLabel;

    Label9: TLabel;

    Label_Status: TLabel;

    MemoOut: TMemo;

    ButtonStop: TButton;

    Panel1: TPanel;

    MemoIn: TMemo;

    EditDelay: TEdit;

    RadioGroup1: TRadioGroup;

    CBOpt: TComboBox;

    Label6: TLabel;

    LName: TLabel;

    LPath: TLabel;

    Label10: TLabel;

    MainMenu1: TMainMenu;

    MFile: TMenuItem;

    MFChoose: TMenuItem;

    MHelp: TMenuItem;

    MHHelp: TMenuItem;

    MFExit: TMenuItem;

    Label7: TLabel;

    Label8: TLabel;

    Image1: TImage;

    Label11: TLabel;

    procedure Button1Click(Sender: TObject);

    procedure Button2Click(Sender: TObject);

    procedure ButtonStopClick(Sender: TObject);

    procedure CBOptChange(Sender: TObject);

    procedure FormActivate(Sender: TObject);

    procedure RadioGroup1Click(Sender: TObject);

    procedure MFExitClick(Sender: TObject);

    procedure MFChooseClick(Sender: TObject);

    procedure FormCreate(Sender: TObject);

    procedure MHHelpClick(Sender: TObject);

   private

    { Private declarations }

  public

    { Public declarations }

  end;

var

  Form1: TForm1;

  EncryptedText,Fpath: string;

  flag : boolean; 

// Расширение ключа  для шифрования

procedure ExpandAESKeyForEncryption(const Key: TAESKey128;

  var ExpandedKey: TAESExpandedKey128); overload;

// Блочное шифрование

procedure EncryptAES(const InBuf: TAESBuffer; const Key: TAESExpandedKey128;

  var OutBuf: TAESBuffer);

// Шифрование потока (ECB mode)

procedure EncryptAESStreamECB(Source: TStream; Count: cardinal;

  const Key: TAESKey128; Dest: TStream); overload;

procedure EncryptAESStreamECB(Source: TStream; Count: cardinal;

  const ExpandedKey: TAESExpandedKey128; Dest: TStream); overload;

// Расширение ключа для дешифрования

procedure ExpandAESKeyForDecryption(var ExpandedKey: TAESExpandedKey128); overload;

procedure ExpandAESKeyForDecryption(const Key: TAESKey128;

  var ExpandedKey: TAESExpandedKey128); overload;

// Дешифрование текущего блока

procedure DecryptAES(const InBuf: TAESBuffer; const Key: TAESExpandedKey128;

  var OutBuf: TAESBuffer);

// Дешифрование потока (считывание поблочно из потока  и применение к каждому из  блоков процедуры DecryptAES)

procedure DecryptAESStreamECB(Source: TStream; Count: cardinal;

  const Key: TAESKey128; Dest: TStream); overload;

proedure DecryptAESStreamECB(Source: TStream; Count: cardinal;

  const ExpandedKey: TAESExpandedKey128; Dest: TStream); overload;

resourcestring

  SInvalidInBufSize = 'Неверный размер буфера для дешифрования';

  SReadError = 'Ошибка чтения из потока';

  SWriteError = 'Ошибка  записи в поток';

implementation

uses UnStop;

{$R *.DFM}

type

  PLongWord = ^LongWord; 

function Min(A, B: integer): integer; //Нахождение минимального из двух чисел

begin

  if A < B then

    Result := A

  else

    Result := B;

end;

const

  Rcon: array [1..30] of longword = (

    $00000001, $00000002, $00000004, $00000008, $00000010, $00000020,

    $00000040, $00000080, $0000001B, $00000036, $0000006C, $000000D8,

    $000000AB, $0000004D, $0000009A, $0000002F, $0000005E, $000000BC,

    $00000063, $000000C6, $00000097, $00000035, $0000006A, $000000D4,

    $000000B3, $0000007D, $000000FA, $000000EF, $000000C5, $00000091

Информация о работе Алгоритм шифрования AES