Автор: Пользователь скрыл имя, 26 Ноября 2011 в 09:27, курсовая работа
Шифрование — способ преобразования открытой информации в закрытую и обратно. Применяется для хранения важной информации в ненадёжных источниках или передачи её по незащищённым каналам связи. Согласно ГОСТ 28147-89, шифрование подразделяется на процесс зашифровывания и расшифровывания.
В зависимости от алгоритма преобразования данных, методы шифрования подразделяются на гарантированной или временной крипто-стойкости.
Введение 2
История AES 3
Описание AES 4
Программная реализация алгоритма AES 11
Листинг программы 13
Заключение 32
Список использованной литературы 33
где , и где bi есть i-ый бит b, а ci — i-ый бит константы c = 6316 = 9910 = 011000112. Таким образом, обеспечивается защита от атак, основанных на простых алгебраических свойствах.
ShiftRows()
В процедуре ShiftRows, байты в каждой строке state циклически сдвигаются влево. Размер смещения байтов каждой строки зависит от её номера
ShiftRows работает
со строками State. При этой трансформации
строки состояния циклически
сдвигаются на r байт по горизонтали,
в зависимости от номера
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, получает ключи для
всех раундов. Всего она
Функция 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 бит.
Пример 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(
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(
var ExpandedKey: TAESExpandedKey128); overload;
// Дешифрование текущего блока
procedure DecryptAES(const InBuf: TAESBuffer; const Key: TAESExpandedKey128;
var OutBuf: TAESBuffer);
// Дешифрование потока
(считывание поблочно из
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