Шифрование открытых данных в режиме простой замены

Автор работы: Пользователь скрыл имя, 17 Марта 2013 в 19:23, курсовая работа

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

Он полностью определяется ГОСТ 28147-89. Стандарт обязателен для организации предприятий и учреждений применяющих криптографическую защиту данных, хранимых и передаваемых в сетях ЭВМ и в отдельных вычислительных комплексах. Этот алгоритм может быть организован как аппаратно, так и программно. Он не накладывает ограничений на степень секретности защищаемых данных. Алгоритм представляет собой 64 битовый блочный алгоритм с 256 битовым ключом.

Содержание работы

Теоретическая часть
Режим простой замены (блок схема)
Шифрование открытых данных в режиме простой замены
Расшифрование данных в режиме простой замены
Листинг программы
Пример выполнения программы
Список использованной литературы

Содержимое работы - 1 файл

Lisovskaia GOST.docx

— 1.61 Мб (Скачать файл)

МИНИСТЕРСТВО ТРАНСПОРТА РОССИЙСКОЙ ФЕДЕРАЦИИ

ФЕДЕРАЛЬНОЕ АГЕНСТВО МОРСКОГО И  РЕЧНОГО ТРАНСПОРТА

ФГОУ ВПО «МГА имени адмирала Ф.Ф.Ушакова»

_____________________________________________________________________________

Кафедра «АВТ»

 

 

 

 

 

 

КУРСОВАЯ РАБОТА ПО ДИСЦИПЛИНЕ

«Информационная безопасность и защита информации»

 

 

 

 

Выполнил курсант:

Лисовская Ю.А.

Проверил :

к.т.н.Степанов В.Ф.

 

 

 

 

Новороссийск 2011 г.

Содержание:

  • Теоретическая часть
  • Режим простой замены (блок схема)
  • Шифрование открытых данных в режиме простой замены
  • Расшифрование данных в режиме простой замены
  • Листинг программы
  • Пример выполнения программы
  • Список использованной литературы

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Теоретическая часть

Отечественный стандарт шифрования данных.

Он полностью определяется ГОСТ 28147-89. Стандарт обязателен для  организации предприятий и учреждений применяющих криптографическую  защиту данных, хранимых и передаваемых в сетях ЭВМ и в отдельных  вычислительных комплексах. Этот алгоритм может быть организован как аппаратно, так и программно. Он не накладывает  ограничений на степень секретности  защищаемых данных. Алгоритм представляет собой 64 битовый блочный алгоритм с 256 битовым ключом.

При описании алгоритма используется:

- операция побитового сложения  по модулю 2;

 

□ - операция сложения по модулю 232 двух 32-разрядных двоичных чисел;

 

Два целых числа а, b,

где 0 ≤ a, 

b ≤ 232 —1,

а = (а32, а31,…,а2, a1),

b = (b32, b31, ...,b2, b1),

представленные  в двоичном виде, т.е.

а = а32*231 + а31 *230 +...+ а2 *21 * а1

b = b32*231 + b31 *230+...+ b2*21 + b1,

суммируются по модулю 232 (операция□ ) по следующему правилу:

a□b = а + b, если а + b< 232,

а□b = а + b - 232, если а + b, ≥ 232.

 

Режим простой  замены.

Блок схема:

 

 

Обозначения на схеме:

 

N1,N2 - 32-ух разрядные накопители (сдвигающие регистры)

СМ1– 32-ух разрядный сумматор по модулю 232

CM2 – 32-ух разрядный сумматор по модулю 2

R – 32-ух разрядный регистр циклического сдвига влево

КЗУ – ключевое запоминающее устройство на 256 бит, состоящее из восьми 32-ух разрядных накопителей x0,x1,x2,…,x7.

S – блок подстановки состоящий из восьми узлов замены.

 

  • Шифрование открытых данных в режиме простой замены.
  •  

  • Открытые данные разбивают на 64-х разрядные блоки T0. Процедура шифрования одного блока T0 в этом режиме включает 32 цикла j=1,2,…,32.
  • В КЗУ вводят 256 бит ключа K в виде восьми 32-ух разрядных подключейKi

    K=K7,K6,K5,K4,K3,K2,K1,K0.

    Последовательность битов  блока T0=b32(0),b31(0),…,b1(0),a32(0),a31(0),…,a1(0). Разбивают на 2 последовательности по 32 бита: b(0), a(0).

    Эти последовательности вводят в накопители N1 и N2 перед началом первого цикла шифрования. Содержимое накопителя N1 принимают значения a(0), a накопитель N2 b(0).

    Первый цикл j=1 описывается  уравнением      

    a(1)=f(a(0) □k0) b(0))

    b(1)=a(0)

    a(1) – заполнение N1 после первого цикла шифрования.

    b(1) – заполнение N2 после  первого цикла шифрования.

    f – функция шифрования.

    Аргументом функции f  является сумма по модулю 232 числа a(0) и числа K0, считываемого из накопителя x0 КЗУ.

    Каждое из этих чисел равно 32 битам. Функция f включает в себя 2 операции над полученной 32-ух разрядной  суммой:

    Подстановка (замена) и выполняется блоком подстановки S.

     

      Блок подстановки  S состоит из 8 узлов замены с  памятью 64 бита каждый. Поступающие  из СМ1 на блок подстановки  S 32-ух разрядные векторы разбивают  на 8 последовательно идущих 4-х разрядных  векторов, каждый из которых преобразуется  в 4-х разрядный вектор соответствующим  узлом замены. Каждый узел замены  можно представить в виде таблицы  перестановки 16-ти четырех разрядных  двоичных чисел в диапазоне   от 0000 до 1111.

    Входной вектор указывает  адрес строки в таблице, а число  в этой строке является входным вектором. Затем 4-х разрядные выходные векторы  последовательно объединяются в 32-ух разрядный вектор. Узлы замены (таблицы  перестановки) представляют ключевые элементы, которые редко изменяются. Данные этих узлов замены должны сохраняться  в секрете.

    Циклический сдвиг  влево на 11 разрядов 32-ух разрядного вектора, полученного с выхода блока  подстановки S.

     

     Циклический сдвиг  выполняется регистром сдвига R. По сути дела это операция  перестановки. Далее результат работы  функции шифрования f суммируют поразрядно  по модулю 2 в сумматоре СМ2 c 32-ух  разрядным начальным заполнением  b(0) накопителя N2. Затем, полученный  на выходе Sn2 результат (значение a(1)) записывают в накопитель N1, а  старое значение N1(значение a(0)) переписывают  в накопитель N2, т.е b(1)=a(0). Первый  цикл завершен.

     Последующие циклы  осуществляются аналогично. При  этом во втором цикле из  КЗУ считывают подключ K1, в  третьем цикле подключ K2 и т.д.  В циклах с 9 по 16, а также  в циклах с 17 по 24 подключи из  КЗУ считываются в том же  порядке. В последних восьми  циклах (25-32) порядок считывания подключей  из КЗУ обратный (K7,K6,..,K0). Таким образом при шифровании в 8-и циклах осуществляется следующий порядок выборки из КЗУ подключей: K0,K1,K2,K3,K4,K5,K6,K7,K7,K6,K5,K4,K3,K2,K1,K0.

    В восьмом цикле (также  как и в 32 цикле) результат из сумматора Sn2 вводится в накопитель N2б а  в накопителе N1 сохраняется прежнее  значение.

     Полученные после 32-го  цикла шифрования заполнение  накопителей N1 и N2 являются блоком  зашифрованных данных Tш, соответствующих  блоку открытых данных То.

    Блок зашифрованных данных Tщ (64 бита) выводится из накопителей N1 и N2 в следующем порядке: из разрядов 1..32 накопителя N1, затем из разрядов 1..32 накопителя N2. Тоесть начиная с  младших разрядов. Tш=b32(32),b31(32),..,b1(32),a32(32),a31(32),..,a1(32).

    Остальные блоки открытых данных зашифровываются в режиме простой замены аналогично.

     

    Расшифрование в  режиме простой замены.

    Криптосхемареализующая  алгоритм расшифрования имеет тот  же вид что и при шифровании. В КЗУ вводят 256 бит ключа на котором выполнялось шифрование. Зашифрованные данные подлежащие расшифрованию  разбиваются на блоки Tш по 64 бита в каждом. Ввод блока Tш=b32(32),b31(32),..,a32(32),a31(32),..,a1(32). В накопителе N1 и N2  производят так, чтобы начальное заполнение накопителя N1 имело вид: a32(32),a31(32),…,a1(32), а накопителя N2 имело вид b32(32),b31(32),…,b1(32).

    Расшифрование осуществляется по тому же алгоритму, что и шифрование  с тем изменением, что заполнения накопителей x0,x1,….,x7 считывается из КЗУ в циклах расшифрования в следующем порядке: k0,k1,k2,k3,k4,k5,k6,k7,k7,k6,k5,k4,k3,k2,k1,k0.

    Полученные после 32 циклов работы заполнения накопителей N1 и N2 образуют блок открытых данных b32(0),b31(0),…,b1(0),a32(0),a31(0),….,a1(0). Аналогично расшифровываются остальные блоки зашифрованных данных.

    Если алгоритм шифрования в режиме простой замены 64 битового блока To обозначить через A(To)=A(b(0).a(0))=(b(32),a(32))=Tш.

    Следует иметь ввиду что  режим простой замены допустимо  использовать для шифрования данных только в ограниченных случаях, а  именно, при выработке ключа и  зашифрования его с обеспечением эмитозащиты для передачи по каналам  связи или для хранения его  в памяти ЭВМ

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

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

    #include <cstdlib>

    #include <iostream>

    #include <fstream>

    #include <windows.h>

     

    // Лисовская ---------------------------------------------------------------------------

     

    long filesize(FILE *stream)

    {

    long curpos, length;

    curpos = ftell(stream);

    fseek(stream, 0L, SEEK_END);

    length = ftell(stream);

    fseek(stream, curpos, SEEK_SET);

    return length;

    }

     

    // функция шифрования

    void rpz(int rezh, char* opener, char* saver)

    {

    FILE *f_begin, *f_end;

     

    // таблица замен

     byte Tab_Z[8][16] =

     {

      0x0,0x1,0x2,0x3,0x4,0x5,0x6,0x7,0x8,0x9,0xA,0xB,0xC,0xD,0xE,0xF,

      0x0,0x1,0x2,0x3,0x4,0x5,0x6,0x7,0x8,0x9,0xA,0xB,0xC,0xD,0xE,0xF,

      0x0,0x1,0x2,0x3,0x4,0x5,0x6,0x7,0x8,0x9,0xA,0xB,0xC,0xD,0xE,0xF,

      0x0,0x1,0x2,0x3,0x4,0x5,0x6,0x7,0x8,0x9,0xA,0xB,0xC,0xD,0xE,0xF,

      0x0,0x1,0x2,0x3,0x4,0x5,0x6,0x7,0x8,0x9,0xA,0xB,0xC,0xD,0xE,0xF,

      0x0,0x1,0x2,0x3,0x4,0x5,0x6,0x7,0x8,0x9,0xA,0xB,0xC,0xD,0xE,0xF,

      0x0,0x1,0x2,0x3,0x4,0x5,0x6,0x7,0x8,0x9,0xA,0xB,0xC,0xD,0xE,0xF,

      0x0,0x1,0x2,0x3,0x4,0x5,0x6,0x7,0x8,0x9,0xA,0xB,0xC,0xD,0xE,0xF

    };

     

    // ключ

    unsigned long key[8] =

    {

      0x0123,

      0x4567,

      0x89AB,

      0xCDEF,

      0x0123,

      0x4567,

      0x89AB,

      0xCDEF

    };

     

     char N[4]; // 32-разрядный накопитель

     

    unsigned long n1=0, n2=0, SUM232=0; // накопитель N1, N2 и суматор

     

    // открытие файла

    f_begin = fopen (opener,"rb");

    f_end = fopen (saver,"wb");

     

     // определение количества блоков

    float blokoff;

    blokoff = 8*filesize(f_begin);

    blokoff = blokoff/64;

    int block = (int)blokoff;

    if (blokoff-block>0) block++;

     

    int sh;

    if (filesize(f_begin)>=4) sh = 4; else sh = filesize(f_begin);

    int sh1 = 0;

    int flag=0;

     

    // считывание и преобоазование  блоков

     for (int i=0; i<block; i++)

     {

      // запись в накопитель N1

      for (int q=0; q<4; q++) *((byte *)&N+q) = 0x00;

      if ((sh1+sh)<filesize(f_begin))

      {

       fread (N,sh,1,f_begin);

       sh1+=sh;

      }

      else

      {

       sh=filesize(f_begin)-sh1;

       fread (N,sh,1,f_begin);

       flag=1;

      }

      n1 = *((unsigned long *)&N);

     

      // запись в накопитель N2

      for (int q=0; q<4; q++) *((byte *)&N+q) = 0x00;

      if ((sh1+sh)<filesize(f_begin))

      {

       fread (N,sh,1,f_begin);

       sh1+=sh;

      }

      else

      {

       if (flag==0)

       {

        sh=filesize(f_begin)-sh1;

        fread (N,sh,1,f_begin);

       }

      }

      n2 = *((unsigned long *)&N);

     

      // 32 цикла простой  замены

      int c = 0;

      for (int k=0; k<32; k++)

      {

       if (rezh==1) { if (k==24) c = 7; }

        else { if (k==8) c = 7; }

     

       // сумируем в  сумматоре СМ 1

       SUM232 = key[c] + n1;

     

       // заменяем по  таблице замен

       byte first_byte=0,second_byte=0,zam_symbol=0;

       int n = 7;

       for (int q=3; q>=0; q--)

       {

        zam_symbol = *((byte *)&SUM232+q);

        first_byte = (zam_symbol & 0xF0) >> 4;

        second_byte = (zam_symbol & 0x0F);

        first_byte = Tab_Z[n][first_byte];

        n--;

        second_byte = Tab_Z[n][second_byte];

        n--;

        zam_symbol = (first_byte << 4) | second_byte;

        *((byte *)&SUM232+q) = zam_symbol;

       }

      

       SUM232 = (SUM232<<11)|(SUM232>>21); // циклический сдвиг на 11

       SUM232 = n2^SUM232; // складываем  в сумматоре СМ 2

     

       if (k<31)

       {

        n2 = n1;

        n1 = SUM232;

       }

       if (rezh==1)

       {

        if (k<24)

        {

         c++;

         if (c>7) c = 0;

        }

        else

        {

         c--;

         if (c<0) c = 7;

        }

       }

       else

       {

        if (k<8)

        {

         c++;

         if (c>7) c = 0;

        }

       else

       {

        c--;

        if (c<0) c = 7;

       }

      }

    }

    n2 = SUM232;

     

    // вывода резултата  в файл

      char sym_rez;

      for (int q=0; q<=3; q++)

      {

       sym_rez = *((byte *)&n1+q);

       fprintf(f_end, "%c", sym_rez);

      }

      for (int q=0; q<=3; q++)

      {

       sym_rez = *((byte *)&n2+q);

       fprintf(f_end, "%c", sym_rez);

      }

    }

    fclose (f_begin);

    fclose (f_end);

    }

     

    //---------------------------------------------------------------------------

    int main()

    {

    int rezhim = 0;

    do

    {

      printf("Select mode\n1 - coding\n2 - decoding\n");

       scanf("%d", &rezhim);

    } while ((rezhim!=1)&&(rezhim!=2));

     

    char open_str[50], save_str[50];

    printf("select source file\n");

    scanf("%s", &open_str);

    printf("select result file\n");

    scanf("%s", &save_str);

     

    rpz(rezhim, open_str, save_str); //запуск код/декодирования

     return 0;

    }

     

    Пример выполнения программы

    Шифрование:

    В результате шифрования получаем файл в котором содержится:

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

     

     

     

     

    Получаем файл который  содержит исходное сообщение:

     

    Список использованной литературы.

    1. Конспект лекций по предмету «Информационная безопасность и защита информации». Лектор к.т.н. Степанов В.Ф, г.Новороссийск 2011 год.

     


    Информация о работе Шифрование открытых данных в режиме простой замены