Автор работы: Пользователь скрыл имя, 29 Ноября 2013 в 00:04, курсовая работа
Шифрування - спосіб перетворення відкритої інформації в закриту і назад. Застосовується для зберігання важливої інформації в ненадійних джерелах або передачі її по незахищених каналах зв'язку. Згідно ГОСТ 28147-89, шифрування підрозділяється на процес зашифровування і розшифрування. Залежно від алгоритму перетворення даних, методи шифрування поділяються на гарантованої або тимчасової криптостойкости. Мета роботи: Розробити програму шифрування/дешифрування. Для досягнення поставленої мети в роботі вирішувалися наступні завдання:
розробити ескізний і технічний проект програми;
розробити робочий проект програми.
Вступ………. 3
РОЗДIЛ I. Загальнi вiдомостi 4
1.1.Загальнi вiдомостi про AES 4
РОЗДIЛ II. Розробка проекту програми 6
2.1.Опис елементiв програми 6
2.2.Шифрування та процедури.. 9
2.3.Алгоротми та криптостiйкicть… 13
2.4.Тестування програми …. 17
Висновки….. 19
Список використаних джерел….. 20
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.
2.3.Алгоритми та криптостiйкicть.
Алгоритм обробки ключа.
Алгоритм обробки ключа складається з двох процедур:
Алгоритм розширення ключа.
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
Псевдокод Для 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
Варіанти алгоритму.
На базі алгоритму Rijndael, що лежить в основі AES, реалізовані альтернативні криптоалгоритми. Серед найбільш відомих - учасники конкурсу Nessie: Anubis на інволюцію, автором якого є Вінсент Реймі і посилений варіант шифру - Grand Cru Йохана Борстен.
Криптостійкість.
У червні 2003 року Агентство національної безпеки США ухвалило, що шифр AES є достатньо надійним, щоб використовувати його для захисту відомостей, що становлять державну таємницю (англ. classified information). Аж до рівня SECRET було дозволено використовувати ключі довжиною 128 біт, для рівня TOP SECRET були потрібні ключі довжиною 192 і 256 біт.
2.4.Тустування програми
Виберемо дію «Шифрування», потім виберемо файл з расшіреніем.txt, натискаємо на кнопку «Шифрувати» (також можна вибрати параметри шифрування зліва в полі «Виконання процесу»). Програма створює файл EncodedFile.txtрядом з вихідним файлом.
Виконаємо зворотну дію. У
полі вихідний файл виберемо створений
раніше програмою файл EncodedFile.txt, виберемо
дію «Дешифрувати». Програма створює
файл DecodedFile.txtрядом з
Список використаних джерел
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);
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);
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
);
ForwardTable: array [0..255] of longword = (
$A56363C6, $847C7CF8, $997777EE, $8D7B7BF6, $0DF2F2FF, $BD6B6BD6, $B16F6FDE, $54C5C591,
$50303060, $03010102, $A96767CE, $7D2B2B56, $19FEFEE7, $62D7D7B5, $E6ABAB4D, $9A7676EC,
$45CACA8F, $9D82821F, $40C9C989, $877D7DFA, $15FAFAEF, $EB5959B2, $C947478E, $0BF0F0FB,
$ECADAD41, $67D4D4B3, $FDA2A25F, $EAAFAF45, $BF9C9C23, $F7A4A453, $967272E4, $5BC0C09B,
$C2B7B775, $1CFDFDE1, $AE93933D, $6A26264C, $5A36366C, $413F3F7E, $02F7F7F5, $4FCCCC83,
$5C343468, $F4A5A551, $34E5E5D1, $08F1F1F9, $937171E2, $73D8D8AB, $53313162, $3F15152A,
$0C040408, $52C7C795, $65232346, $5EC3C39D, $28181830, $A1969637, $0F05050A, $B59A9A2F,
$0907070E, $36121224, $9B80801B, $3DE2E2DF, $26EBEBCD, $6927274E, $CDB2B27F, $9F7575EA,
$1B090912, $9E83831D, $742C2C58, $2E1A1A34, $2D1B1B36, $B26E6EDC, $EE5A5AB4, $FBA0A05B,
$F65252A4, $4D3B3B76, $61D6D6B7, $CEB3B37D, $7B292952, $3EE3E3DD, $712F2F5E, $97848413,
$F55353A6, $68D1D1B9, $00000000, $2CEDEDC1, $60202040, $1FFCFCE3, $C8B1B179, $ED5B5BB6,
$BE6A6AD4, $46CBCB8D, $D9BEBE67, $4B393972, $DE4A4A94, $D44C4C98, $E85858B0, $4ACFCF85,
$6BD0D0BB, $2AEFEFC5, $E5AAAA4F, $16FBFBED, $C5434386, $D74D4D9A, $55333366, $94858511,
$CF45458A, $10F9F9E9, $06020204, $817F7FFE, $F05050A0, $443C3C78, $BA9F9F25, $E3A8A84B,
$F35151A2, $FEA3A35D, $C0404080, $8A8F8F05, $AD92923F, $BC9D9D21, $48383870, $04F5F5F1,
$DFBCBC63, $C1B6B677, $75DADAAF, $63212142, $30101020, $1AFFFFE5, $0EF3F3FD, $6DD2D2BF,
$4CCDCD81, $140C0C18, $35131326, $2FECECC3, $E15F5FBE, $A2979735, $CC444488, $3917172E,
$57C4C493, $F2A7A755, $827E7EFC, $473D3D7A, $AC6464C8, $E75D5DBA, $2B191932, $957373E6,
$A06060C0, $98818119, $D14F4F9E, $7FDCDCA3, $66222244, $7E2A2A54, $AB90903B, $8388880B,
$CA46468C, $29EEEEC7, $D3B8B86B, $3C141428, $79DEDEA7, $E25E5EBC, $1D0B0B16, $76DBDBAD,
$3BE0E0DB, $56323264, $4E3A3A74, $1E0A0A14, $DB494992, $0A06060C, $6C242448, $E45C5CB8,
$5DC2C29F, $6ED3D3BD, $EFACAC43, $A66262C4, $A8919139, $A4959531, $37E4E4D3, $8B7979F2,
$32E7E7D5, $43C8C88B, $5937376E, $B76D6DDA, $8C8D8D01, $64D5D5B1, $D24E4E9C, $E0A9A949,
$B46C6CD8, $FA5656AC, $07F4F4F3, $25EAEACF, $AF6565CA, $8E7A7AF4, $E9AEAE47, $18080810,
$D5BABA6F, $887878F0, $6F25254A, $722E2E5C, $241C1C38, $F1A6A657, $C7B4B473, $51C6C697,
$23E8E8CB, $7CDDDDA1, $9C7474E8, $211F1F3E, $DD4B4B96, $DCBDBD61, $868B8B0D, $858A8A0F,
$907070E0, $423E3E7C, $C4B5B571, $AA6666CC, $D8484890, $05030306, $01F6F6F7, $120E0E1C,
$A36161C2, $5F35356A, $F95757AE, $D0B9B969, $91868617, $58C1C199, $271D1D3A, $B99E9E27,
$38E1E1D9, $13F8F8EB, $B398982B, $33111122, $BB6969D2, $70D9D9A9, $898E8E07, $A7949433,
$B69B9B2D, $221E1E3C, $92878715, $20E9E9C9, $49CECE87, $FF5555AA, $78282850, $7ADFDFA5,
$8F8C8C03, $F8A1A159, $80898909, $170D0D1A, $DABFBF65, $31E6E6D7, $C6424284, $B86868D0,
$C3414182, $B0999929, $772D2D5A, $110F0F1E, $CBB0B07B, $FC5454A8, $D6BBBB6D, $3A16162C
);
LastForwardTable: array [0..255] of longword = (
$00000063, $0000007C, $00000077, $0000007B, $000000F2, $0000006B, $0000006F, $000000C5,
$00000030, $00000001, $00000067, $0000002B, $000000FE, $000000D7, $000000AB, $00000076,
$000000CA, $00000082, $000000C9, $0000007D, $000000FA, $00000059, $00000047, $000000F0,
$000000AD, $000000D4, $000000A2, $000000AF, $0000009C, $000000A4, $00000072, $000000C0,
$000000B7, $000000FD, $00000093, $00000026, $00000036, $0000003F, $000000F7, $000000CC,
$00000034, $000000A5, $000000E5, $000000F1, $00000071, $000000D8, $00000031, $00000015,
$00000004, $000000C7, $00000023, $000000C3, $00000018, $00000096, $00000005, $0000009A,
$00000007, $00000012, $00000080, $000000E2, $000000EB, $00000027, $000000B2, $00000075,
$00000009, $00000083, $0000002C, $0000001A, $0000001B, $0000006E, $0000005A, $000000A0,
$00000052, $0000003B, $000000D6, $000000B3, $00000029, $000000E3, $0000002F, $00000084,
$00000053, $000000D1, $00000000, $000000ED, $00000020, $000000FC, $000000B1, $0000005B,
$0000006A, $000000CB, $000000BE, $00000039, $0000004A, $0000004C, $00000058, $000000CF,
$000000D0, $000000EF, $000000AA, $000000FB, $00000043, $0000004D, $00000033, $00000085,
$00000045, $000000F9, $00000002, $0000007F, $00000050, $0000003C, $0000009F, $000000A8,
$00000051, $000000A3, $00000040, $0000008F, $00000092, $0000009D, $00000038, $000000F5,
$000000BC, $000000B6, $000000DA, $00000021, $00000010, $000000FF, $000000F3, $000000D2,
$000000CD, $0000000C, $00000013, $000000EC, $0000005F, $00000097, $00000044, $00000017,
$000000C4, $000000A7, $0000007E, $0000003D, $00000064, $0000005D, $00000019, $00000073,
$00000060, $00000081, $0000004F, $000000DC, $00000022, $0000002A, $00000090, $00000088,
$00000046, $000000EE, $000000B8, $00000014, $000000DE, $0000005E, $0000000B, $000000DB,
$000000E0, $00000032, $0000003A, $0000000A, $00000049, $00000006, $00000024, $0000005C,
$000000C2, $000000D3, $000000AC, $00000062, $00000091, $00000095, $000000E4, $00000079,
$000000E7, $000000C8, $00000037, $0000006D, $0000008D, $000000D5, $0000004E, $000000A9,
$0000006C, $00000056, $000000F4, $000000EA, $00000065, $0000007A, $000000AE, $00000008,
$000000BA, $00000078, $00000025, $0000002E, $0000001C, $000000A6, $000000B4, $000000C6,
$000000E8, $000000DD, $00000074, $0000001F, $0000004B, $000000BD, $0000008B, $0000008A,
$00000070, $0000003E, $000000B5, $00000066, $00000048, $00000003, $000000F6, $0000000E,
$00000061, $00000035, $00000057, $000000B9, $00000086, $000000C1, $0000001D, $0000009E,
$000000E1, $000000F8, $00000098, $00000011, $00000069, $000000D9, $0000008E, $00000094,
$0000009B, $0000001E, $00000087, $000000E9, $000000CE, $00000055, $00000028, $000000DF,
$0000008C, $000000A1, $00000089, $0000000D, $000000BF, $000000E6, $00000042, $00000068,
$00000041, $00000099, $0000002D, $0000000F, $000000B0, $00000054, $000000BB, $00000016
);
InverseTable: array [0..255] of longword = (
$50A7F451, $5365417E, $C3A4171A, $965E273A, $CB6BAB3B, $F1459D1F, $AB58FAAC, $9303E34B,
$55FA3020, $F66D76AD, $9176CC88, $254C02F5, $FCD7E54F, $D7CB2AC5, $80443526, $8FA362B5,
$495AB1DE, $671BBA25, $980EEA45, $E1C0FE5D, $02752FC3, $12F04C81, $A397468D, $C6F9D36B,
$E75F8F03, $959C9215, $EB7A6DBF, $DA595295, $2D83BED4, $D3217458, $2969E049, $44C8C98E,
$6A89C275, $78798EF4, $6B3E5899, $DD71B927, $B64FE1BE, $17AD88F0, $66AC20C9, $B43ACE7D,
$184ADF63, $82311AE5, $60335197, $457F5362, $E07764B1, $84AE6BBB, $1CA081FE, $942B08F9,
$58684870, $19FD458F, $876CDE94, $B7F87B52, $23D373AB, $E2024B72, $578F1FE3, $2AAB5566,
$0728EBB2, $03C2B52F, $9A7BC586, $A50837D3, $F2872830, $B2A5BF23, $BA6A0302, $5C8216ED,
$2B1CCF8A, $92B479A7, $F0F207F3, $A1E2694E, $CDF4DA65, $D5BE0506, $1F6234D1, $8AFEA6C4,
$9D532E34, $A055F3A2, $32E18A05, $75EBF6A4, $39EC830B, $AAEF6040, $069F715E, $51106EBD,
$F98A213E, $3D06DD96, $AE053EDD, $46BDE64D, $B58D5491, $055DC471, $6FD40604, $FF155060,
$24FB9819, $97E9BDD6, $CC434089, $779ED967, $BD42E8B0, $888B8907, $385B19E7, $DBEEC879,
$470A7CA1, $E90F427C, $C91E84F8, $00000000, $83868009, $48ED2B32, $AC70111E, $4E725A6C,
$FBFF0EFD, $5638850F, $1ED5AE3D, $27392D36, $64D90F0A, $21A65C68, $D1545B9B, $3A2E3624,
$B1670A0C, $0FE75793, $D296EEB4, $9E919B1B, $4FC5C080, $A220DC61, $694B775A, $161A121C,
$0ABA93E2, $E52AA0C0, $43E0223C, $1D171B12, $0B0D090E, $ADC78BF2, $B9A8B62D, $C8A91E14,
$8519F157, $4C0775AF, $BBDD99EE, $FD607FA3, $9F2601F7, $BCF5725C, $C53B6644, $347EFB5B,
$7629438B, $DCC623CB, $68FCEDB6, $63F1E4B8, $CADC31D7, $10856342, $40229713, $2011C684,
$7D244A85, $F83DBBD2, $1132F9AE, $6DA129C7, $4B2F9E1D, $F330B2DC, $EC52860D, $D0E3C177,
$6C16B32B, $99B970A9, $FA489411, $2264E947, $C48CFCA8, $1A3FF0A0, $D82C7D56, $EF903322,