страница 1 |
|
Похожие работы
|
Лабораторная работа №4 «симметричные криптоалгоритмы» Студенты гр. 03Сапр1 Турченков - страница №1/1
![]() ФЕДЕРАЛЬНОЕ АГЕНТСТВО ПО ОБРАЗОВАНИЮ РФБрянский государственный технический университетКафедра: «Компьютерные технологии и системы» Лабораторная работа №4 «СИММЕТРИЧНЫЕ КРИПТОАЛГОРИТМЫ» Студенты гр. 03САПР1 Турченков E.А. Никитин С.А. Купреенко В.А. Фатеев А.В. Бобков А. Преподаватель: Рощин С.М.
2. ВВЕДЕНИЕ Для современной криптографии характерно использование открытых алгоритмов шифрования, предполагающих использование вычислительных средств. Известно более десятка проверенных алгоритмов шифрования, которые при использовании ключа достаточной длины и корректной реализации алгоритма, криптографически стойки. Распространенные алгоритмы:
Во многих странах приняты национальные стандарты шифрования. В 2001 году в США принят стандарт симметричного шифрования AES на основе алгоритма Rijndael с длиной ключа 128, 192 и 256 бит. Алгоритм AES пришёл на смену прежнему алгоритму DES, который теперь рекомендовано использовать только в режиме Triple DES. В Российской Федерации действует стандарт ГОСТ 28147-89, описывающий алгоритм блочного шифрования с длиной ключа 256 бит, а также алгоритм цифровой подписи ГОСТ Р 34.10-2001. Алгоритмы шифрования реализуются программными или аппаратными средствами. Есть великое множество чисто программных реализаций различных алгоритмов. Из-за своей дешевизны (некoторые и вовсе бесплатны), а также все большего быстродействия процессоров, простоты работы и безотказности они весьма конкурентоспособны. Широко известна программа Diskreet из пакета Norton Utilities, реализующая DES. Нельзя не упомянуть пакет PGP (Pretty Good Privacy, версия 2.1, автор Philip Zimmermann), в котором комплексно решены практически все проблемы защиты передаваемой информации. Применены сжатие данных перед шифрованием, мощное управление ключами, симметричный (IDEA) и асимметричный (RSA) алгоритмы шифрования, вычисление контрольной функции для цифровой подписи, надежная генерация ключей. Аппаратная реализация алгоритмов возможна с помощью специализированных микросхем (производятся кристаллы для алгоритмов DH, RSA, DES, Skipjack, ГОСТ 28147-89) или с использованием компонентов широкого назначения (ввиду дешевизны и высокого быстродействия перспективны цифровые сигнальные процессоры - ЦСП, Digital Signal Processor, DSP). Среди российских разработок следует отметить платы "Криптон" (фирма "Анкад") и "Грим" (методология и алгоритмы фирмы "ЛАН-Крипто", техническая разработка НПЦ "ЭЛиПС") . "Криптон" - одноплатные устройства, использующие криптопроцессоры (специализированные 32-разрядные микроЭВМ, которые также называются "блюминг"). Блюминги аппаратно реализуют алгоритмы ГОСТ 28147-89, они состоят из вычислителя и ОЗУ для хранения ключей. Причем в криптопроцессоре есть три области для хранения ключей, что позволяет строить многоуровневые ключевые системы. В плате "Грим" используются цифровые сигнальные процессоры фирмы Analog Devices ADSP-2105 и ADSP-2101, что дает скорость шифрования соответственно 125 и 210 КБ/c. На плате есть физический ДСЧ и ПЗУ с программами начального теста, проверки прав доступа, загрузки и генерации ключей. Ключи хранятся на нестандартно форматированной дискете. Плата реализует алгоритмы ГОСТ 28147-89 и цифровой подписи.
RC6 является полностью параметризованным алгоритмом шифрования. Конкретная версия RC6 обозначается как RC6-w/r/b, где w обозначает длину слова в битах, r - ненулевое количество итерационных циклов шифрования, а b - длину ключа в байтах. Во всех вариантах RC6-w/r/b работает с четырьмя w-битовыми словами, используя шесть базовых операций, обозначаемых следующим образом: а + b- целочисленное сложение по модулю 2W; а - b- целочисленное вычитание по модулю 2W; а ![]() а x b - целочисленное умножение по модулю 2W; a « b - циклический сдвиг w-битового слова влево на величину, заданную log2w младшими битами b; a » b — циклический сдвиг w-битового слова вправо на величину, заданную log2W младшими битами b; Шифрование при помощи RC6-w/r/b описывается следующим образом: Вход: Исходный текст, записанный в 4 w-битовых входных регистрах А, В, С, D; Число циклов шифрования r; Ключевая таблица S[0; ... 2r + 3] w-битовых слов. Выход: Шифрованный текст в регистрах А, В, С, D. ![]() Расшифрование в этих обозначениях выглядит очень похоже: Вход: Шифрованный текст, записанный в 4 w-битовых входных регистрах А, В, С, D; Число циклов шифрования r; Ключевая таблица S[0; ... 2r + 3] w-битовых слов. Выход: Исходный текст в регистрах А, В, С, D.
Пользователь задает ключ длиной b байтов. Достаточное число ненулевых байтов дописываются в конец, чтобы получилось целое число слов. Затем эти байты записываются начиная с младшего в массив из с слов, т.е. первый байт ключа записывается в L[0], и т.д., a L[c - 1] при необходимости дополняется со стороны старших разрядов нулевыми байтами. В результате работы алгоритма генерации ключей будет вычислено 2r + 4 слов, которые будут записаны в массиве S[0; ...; 2r + 3]. Константы Р32 = B7E15163h and Q32 = 9E3779B9h - это константы, получаемые из двоичного представления е -2, где е -основание натуральных логарифмов, и ф - 1, где ф - золотое сечение, соответственно. Подобные же константы могут быть аналогичным образом получены и для RC6 с другим размером слова. Выбор констант является в некотором роде произвольным, и поэтому можно использовать и другие константы, получая при этом "частные" версии алгоритма. Вход: Определенный пользователем b-байтовый ключ, предварительно загруженный в массив L[0;.. .с - 1]; Число циклов шифрования r. Выход: Ключевая таблица S[0;...2r +4] из w-битовых слов.
Реализованная в данной лабораторной работе, программа реализующая алгоритм шифрования RC6 отвечает следующим условиям:
Программа была реализована на языке C++, в среде C++Builder 6.
В реализованной программе использовался алгоритм RC6-32/20 (RC6-w/r) , где w - длина слова в битах, r - число раундов. Рис. 1. Алгоритм RC6 5. ЛИСТИНГ ПРОГРАММЫ UNIT.cpp #include #pragma hdrstop
//--------------------------------------------------------------------------- #pragma package(smart_init) #pragma resource "*.dfm" TForm1 *Form1; //--------------------------------------------------------------------------- __fastcall TForm1::TForm1(TComponent* Owner) : TForm(Owner) {} //--------------------------------------------------------------------------- void __fastcall TForm1::Button1Click(TObject *Sender) { ini_key_encrypt(); encrypt(); } //--------------------------------------------------------------------------- void TForm1::ini_key_encrypt() { unsigned long P,Q,A,B; int i,j,v,c; div_t x;
strcpy(buf,KeyText->Text.c_str()); //ShowMessage((unsigned char)buf[0]); int length=KeyText->Text.Length(); int len_word=0; x=div(length,4); if (x.rem=0) {len_word=x.quot;} else{len_word=x.quot+1;} c=len_word*4; for (int h=0;h if (h else{L[h]=(unsigned char)255;} }
P=0xB7E15163; S[0]=P;
A=B=i=j=0; v=3*( (c>44)?c:44 );
A=S[i]=(S[i]+A+B)<<3; B=L[j]=(L[j]+A+B)<<(A+B);
x=div(i+1,44); // i=(i+1) mod (2r+4); i=x.rem;
x=div(j+1,c); //j=(j+1) mod c; j=x.rem;
}
void TForm1::encrypt() {
unsigned long A,B,C,D,t,u; char buf_c[500],buf[16]; int h=0;
Memo1->Clear(); for(int q=0;q for(int x=0;x<16;x++) {buf[x]=buf_c[q+x];} A=B=C=D=0; for (int k=0;k<16;k++){ h=div(k,4).rem; if (k<4){A+=(unsigned long)( pow(256,h)*((unsigned char)buf[k])); } if (k>=4 && k<8){B+=(unsigned long)( pow(256,h)*((unsigned char)buf[k])); } if (k>=8 && k<12){C+=(unsigned long)( pow(256,h)*((unsigned char)buf[k])); } if (k>=12 && k<16) {D+=(unsigned long)( pow(256,h)*((unsigned char)buf[k]));} };
D=D+S[1]; for(int i=1;i<=20;i++){ //r=20 t=(B*(2*B+1))<<5; //log2(32) u=(D*(2*D+1))<<5; A=((A^t)< C=((C^u)< Ax=A;Bx=B;Cx=C;Dx=D; A=Bx;B=Cx;C=Dx;D=Ax;
}
A=A+S[2*20+2]; Memo1->Lines->Add(FloatToStr(A)); Memo1->Lines->Add(FloatToStr(B)); Memo1->Lines->Add(FloatToStr(C)); Memo1->Lines->Add(FloatToStr(D)); } } //------------------------------------------------------------------------------- void TForm1::decrypt() { unsigned long A,B,C,D,t,u; unsigned long Ax,Bx,Cx,Dx; char buf[500],buf_dec[16]; buf[0]='\0'; AnsiString total_str; //ShowMessage(Memo1->Lines->Capacity); for(int y=0;y A=B=C=D=0; for (int i=0;i<=16;i++){buf_dec[i]='\0';} A=(unsigned long)StrToFloat(Memo1->Lines->Strings[y+0]); B=(unsigned long)StrToFloat(Memo1->Lines->Strings[y+1]); C=(unsigned long)StrToFloat(Memo1->Lines->Strings[y+2]); D=(unsigned long)StrToFloat(Memo1->Lines->Strings[y+3]); C=C-S[2*20+3]; A=A-S[2*20+2]; for(int i=20;i>=1;i--){ Ax=A;Bx=B;Cx=C;Dx=D; A=Dx;B=Ax;C=Bx;D=Cx; u=(D*(2*D+1))<<5; t=(B*(2*B+1))<<5; C=((C-S[2*i+1])>>t)^u; A=((A-S[2*i])>>u)^t; } D=D-S[1]; B=B-S[0]; for (int k=0;k<3;k++){ buf_dec[k]=div(A,pow(256,k+1)).rem; buf_dec[k+4]=div(B,pow(256,k+1)).rem; buf_dec[k+8]=div(C,pow(256,k+1)).rem; buf_dec[k+12]=div(D,pow(256,k+1)).rem; A-=(unsigned long)((unsigned char)buf_dec[k]); B-=(unsigned long)((unsigned char)buf_dec[k+4]); C-=(unsigned long)((unsigned char)buf_dec[k+8]); D-=(unsigned long)((unsigned char)buf_dec[k+12]); A/=256; B/=256; C/=256; D/=256; }
buf_dec[7]=(unsigned char)B; buf_dec[11]=(unsigned char)C; buf_dec[15]=(unsigned char)D; total_str+=buf_dec; } DeShifText->Text=total_str; } //----------------------------------------------------------------------------- void __fastcall TForm1::Button2Click(TObject *Sender) { ini_key_decrypt(); decrypt(); } //--------------------------------------------------------------------------- void TForm1::ini_key_decrypt() { unsigned long P,Q,A,B; int i,j,v,c; div_t x;
strcpy(buf,KeyForDec->Text.c_str());
int len_word=0; x=div(length,4); if (x.rem=0) {len_word=x.quot;} else{len_word=x.quot+1;} c=len_word*4; for (int h=0;h if (h else{L[h]=(unsigned char)255;} }
P=0xB7E15163; S[0]=P;
A=B=i=j=0; v=3*( (c>44)?c:44 );
A=S[i]=(S[i]+A+B)<<3; B=L[j]=(L[j]+A+B)<<(A+B);
x=div(i+1,44); // i=(i+1) mod (2r+4); i=x.rem;
x=div(j+1,c); //j=(j+1) mod c; j=x.rem;
}
Рис. 2. Окно работающей программы Алгоритм RC6 был разработан в 1998 г. рядом специалистов научного подразделения известнейшей фирмы RSA Data Security — RSA Laboratories: Рональдом Ривестом (Ronald Rivest, основатель RSA Data Security), Мэттом Робшоу (Matt Robshaw), Рэем Сидни (Ray Sidney) и Икван Лайзой Ин (Yiqun Lisa Yin) специально для участия в конкурсе AES. Алгоритм во многом унаследовал черты предыдущего алгоритма Рональда Ривеста — 64-битного блочного шифра RC5, разработанного в 1997 г. Фактически, алгоритм претерпел два принципиальных изменения: |
ещё >> |