Построение таблицы расширенных ключей



МИНИСТЕРСТВО ОБРАЗОВАНИЯ И НАУКИ РОССИЙСКОЙ ФЕДЕРАЦИИ

 

ФЕДЕРАЛЬНОЕ ГОСУДАРСТВЕННОЕ БЮДЖЕТНОЕ ОБРАЗОВАТЕЛЬНОЕ УЧРЕЖДЕНИЕ

ВЫСШЕГО ОБРАЗОВАНИЯ

 

«НОВОСИБИРСКИЙ ГОСУДАРСТВЕННЫЙ ТЕХНИЧЕСКИЙ УНИВЕРСИТЕТ»

 

Кафедра вычислительной техники

 

 

КОНТРОЛЬНАЯ РАБОТА

ПО ДИСЦИПЛИНЕ «ЗАЩИТА ДАННЫХ»

 

 

Тема: Симметричный алгоритм: RC5. Ассиметричный алгоритм: RSA.

 

Студент: Селиванов Александр Владимирович

 

Группа: ЗФ-322

 

 

Преподаватель: Якименко Александр Александрович

 

Представлено к защите:  

 

Новосибирск 2018 г.

Содержание

Постановка задачи. 3

Введение. 3

Симметричные криптосистемы.. 4

Описание алгоритма шифрования. 4

Блок-схема алгоритма шифрования. 4

Процедура расширения ключа. 4

Шифрование. 6

Расшифровывание. 6

Текст программы.. 8

Результат работы программы.. 13

Асимметричные криптосистемы.. 15

Описание алгоритма шифрования. 15

Блок-схема алгоритма шифрования. 15

Генерация открытого и секретного ключей. 15

Шифрование. 16

Расшифровывание. 16

Текст программы.. 16

Результат работы программы.. 21

Заключение. 23

Список использованных источников. 24


Постановка задачи

Разработать и реализовать алгоритмы шифрования RC5 и RSA.

Выполнить замеры времени работы реализаций.

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

Введение

На протяжении долгого периода времени криптография использовалась в основном лишь для шифрования сообщений, которыми обменивались военные и государственные чиновника. Из-за этого данная наука была секретной, и круг «посвящённых» людей был весьма ограничен. Однако на протяжение нескольких последних десятилетий, в связи с развитием информационных технологий, эта наука стала весьма востребованной, особенно в бизнес-сфере. Это и межбанковские расчёты, и операции с виртуальными деньгами, а также «повседневные» операции обычных обывателей: расчёты в интернете, сотовая связь и прочее. Все эти операции должны быть защищены от чрезмерно любопытных людей и организаций. В наши дни в разработку и эксплуатацию средств защиты информации вовлечены многие IT-специалисты.


Симметричные криптосистемы

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

Симметричное шифрование бывает двух видов:

1. Блочное – сообщение делится на блоки фиксированной длины (например, 64 бита), затем эти блоки шифруются поочерёдно. В некоторых алгоритмах блоки шифруются независимо друг от друга, в других – результат шифрования текущего блока зависит от предыдущего;

2. Потоковое -  шифрование блоков единичной длины. Используется, когда данные идут потоком, и нельзя дожидаться формирования блока (например, телефонный разговор или прямая видеотрансляция).

Описание алгоритма шифрования

Для реализации симметричного шифрования был выбран блочный алгоритм RC5. Алгоритм RC5 был разработан криптологом Рональдом Ривестом – одним из разработчиков известнейшего ассиметричного алгоритма RSA.

Помимо секретного ключа часть параметров алгоритма являются переменными:

· Размер слова w (в битах); RC5 шифрует блоками по 2 слова;

· Количество раундов алгоритма R (от 0 до 255 включительно);

· Размер секретного ключа b (в байтах) – от 0 до 255 включительно.

Для уточнения параметров алгоритма применяется обозначение RC5-w/R/b.

Алгоритм RC5 очень распространён и имеет множество вариантов.

Блок-схема алгоритма шифрования

Перед шифрованием или расшифровыванием выполняется процедура расширения ключа.

Процедура расширения ключа

Процедура состоит из четырёх этапов:

1. Генерация констант;

2. Разбиение ключа на слова;

3. Построение таблицы расширенных ключей;

4. Перемешивание.

Генерация констант

Для заданного параметра w генерируются 2 псевдослучайные величины, с использованием математические констант e (экспонента) и f (золотое сечение).

где Odd(x) – округление до ближайшего нечётного целого.

Для w = 64 получаем следующие константы:

P = 0xB7E151628AED2A6B, Q = 0x9E3779B97F4A7C15.

Разбиение ключа на слова

Копируем ключ  в массив слов , где c = b/u, u = w/8.

Если b не кратен w/8, то L дополняем нулевыми битами до ближайшего большего размера c, кратного w/8.

Построение таблицы расширенных ключей

Строим таблицу расширенных ключей , где

Перемешивание

Циклически N раз выполняем следующие действия:

где G, H, i, j – временные переменные, начальные значения которых равны 0.

Количество итераций N = max( 3c, ).

Шифрование

Перед первым раундом выполняем операции наложения расширенного ключа на шифруемые данные:

В каждом раунде выполняем следующие действия:

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

Используем обратные операции. Т.е. для i = R, R-1,…,1 выполняем следующие раунды:

После выполнения всех раундов, исходное сообщение находится следующим образом:

Рисунок 1 - Схема шифрования

Текст программы

//

// RC5.hpp

// RC5

//

// Created by Александр Селиванов on 09.09.2017.

// Copyright © 2017 Alexander Selivanov. All rights reserved.

//

 

#ifndef RC5_hpp

#define RC5_hpp

 

#include <cstdlib>

#include <stdlib.h>

#include <string>

#include <iostream>

 

using namespace std;

 

#define max(a, b) \

({ __typeof__ (a) _a = (a); \

__typeof__ (b) _b = (b); \

_a > _b ? _a : _b; })

 

typedef unsigned char uchar;

typedef unsigned long long ulong;

typedef unsigned int uint;

 

class RC5 {

 

private:

const uint ROUNDS = 15;

const uint WORD_LENGTH = 64;

const ulong Pw = 0xB7E151628AED2A6B;

const ulong Qw = 0x9E3779B97F4A7C15;

const uchar SECRET_SIGN = '#';

 

uchar *p_key;

ulong *p_K;

 

public:

RC5(string keyString) {

uint keyBytes = buildKey(keyString);

 

int i, iu, u = WORD_LENGTH / 8, m;

int j, c = keyBytes / u, s, t;

union {

uchar byte[4];

ulong word;

} byte_word;

ulong a, b, *p_L;

 

p_L = (ulong *) calloc(c, sizeof(ulong));

 

for (i = keyBytes; i <= c * u - 1; i++) {

p_key[i] = 0;

}

 

for (i = 0; i < c; i++) {

iu = i * u;

for (j = 0; j < u; j++) {

byte_word.byte[j] = p_key[iu + j];

}

p_L[i] = byte_word.word;

}

p_K = new ulong[2 * ROUNDS + 2];

 

p_K[0] = Pw;

for (i = 1; i <= 2 * ROUNDS + 1; i++) {

p_K[i] = p_K[i - 1] + Qw;

}

 

i = j = 0;

a = b = 0;

m = 2 * ROUNDS + 2;

t = max(c, m);

for (s = 1; s <= 3 * t; s++) {

p_K[i] = RC5_rotate_left(p_K[i] + a + b, 3);

a = p_K[i];

i = (i + 1) % m;

p_L[j] = RC5_rotate_left(p_L[j] + a + b, (a + b) & (WORD_LENGTH - 1));

b = p_L[j];

j = (j + 1) % c;

}

free(p_L);

}

 

virtual ~RC5() {

delete[] p_key;

delete[] p_K;

}

 

private:

ulong RC5_rotate_left(ulong val, ulong dist) {

return (val << dist) | (val >> (WORD_LENGTH - dist));

}

 

ulong RC5_rotate_right(ulong val, ulong dist) {

return (val >> dist) | (val << (WORD_LENGTH - dist));

}

 

void encrypt(ulong inA, ulong inB, ulong *outA, ulong *outB) {

int i, i2;

 

inA += p_K[0];

inB += p_K[1];

 

for (i = 1; i <= ROUNDS; ++i) {

i2 = i * 2;

inA = RC5_rotate_left(inA ^ inB, inB & (WORD_LENGTH - 1)) + p_K[i2];

inB = RC5_rotate_left(inB ^ inA, inA & (WORD_LENGTH - 1)) + p_K[i2 + 1];

}

 

*outA = inA;

*outB = inB;

}

 

void decrypt(ulong inA, ulong inB, ulong *outA, ulong *outB) {

int i, i2;

 

for (i = ROUNDS; i >= 1; i--) {

i2 = i * 2;

inB = RC5_rotate_right(inB - p_K[i2 + 1], inA & (WORD_LENGTH - 1)) ^ inA;

inA = RC5_rotate_right(inA - p_K[i2], inB & (WORD_LENGTH - 1)) ^ inB;

}

 

*outA = inA - p_K[0];

*outB = inB - p_K[1];

}

 

#pragma mark - initialization

 

string resizeString(string str, int size, char ch) {

string res = str;

while (res.length() < size) {

res = ch + res;

}

return res;

}

 

string resizeKey(string keyString) {

if ((keyString.length() % (WORD_LENGTH / 8)) != 0) {

uint newStringSize = ( keyString.length() / (WORD_LENGTH / 8) + 1 ) * (WORD_LENGTH / 8);

keyString = resizeString(keyString, newStringSize, SECRET_SIGN);

}

return keyString;

}

 

uint buildKey(string keyString) {

keyString = resizeKey(keyString);

p_key = new uchar[keyString.length()];

 

for (int i = 0; i < keyString.length(); ++i) {

p_key[i] = keyString[i];

}

 

return keyString.length();

}

 

#pragma mark - encoding

 

void string2ulong(string str, ulong *arr) {

for (int i = 0; i < str.length(); ++i) {

arr[i] = static_cast<ulong>(str[i]);

}

}

 

string ulong2ucharString(ulong val) {

string res = "";

 

for (int i = 0; i < 8; ++i) {

 

uchar seg = val - ((val >> 8) << 8);

val = (val - seg) >> 8;

uchar a = 0 + seg / 222 + 33;

uchar b = 0 + seg % 222 + 33;

res += a;

res += b;

}

 

return res;

}

 

string ulongArr2string(ulong *arr, uint arraySize) {

string res = "";

for (int i = 0; i < arraySize; ++i) {

string ucharString = ulong2ucharString(arr[i]);

res += ucharString;

}

return res;

}

 

#pragma mark - decoding

 

string ulong2string(ulong *arr, int size) {

string str = "";

for (int i = 0; i < size; ++i) {

str += (uchar) arr[i];

}

return str;

}

 

ulong ucharString2ulong(string str) {

ulong res = 0;

for (int i = str.length() - 2; i >= 0; i -= 2) {

res <<= 8;

res += (ulong)((uchar)str[i] - 33) * 222 + (uchar)str[i + 1] - 33;

}

return res;

}

 

void string2ulongArr2(string str, int arrSize, ulong *arr) {

for (int i = 0; i < arrSize; ++i) {

arr[i] = ucharString2ulong(str.substr(i * 16, 16));

}

}

 

public:

 

string encode(string inputString) {

 

int stringSize = inputString.length();

 

ulong *encArr = new ulong[inputString.length()];

string2ulong(inputString, encArr);

 

ulong a, b;

 

for (int i = 0; i < stringSize - 1; ++i) {

encrypt(encArr[i], encArr[i + 1], &a, &b);

encArr[i] = a;

encArr[i + 1] = b;

}

 

string encString = ulongArr2string(encArr, stringSize);

 

return encString;

 

}

 

string decode(string inputString) {

 

int stringSize = inputString.length() / 2 / 8;

 

ulong decArr[stringSize];

string2ulongArr2(inputString, stringSize, decArr);

 

ulong a, b;

 

for (int i = stringSize - 1; i > 0; --i) {

decrypt(decArr[i - 1], decArr[i], &a, &b);

decArr[i - 1] = a;

decArr[i] = b;

}

 

string decString = ulong2string(decArr, stringSize);

return decString;

}

};

 

#endif /* RC5_hpp */


 

Результат работы программы

В качестве шифруемого сообщения используем код класса RC5. В исходном сообщении 6265 символов.


 

В качестве ключа используем закрытый ключ, полученный далее при тестировании ассиметричного алгоритма: «1627102865,2715484207».


 

Зашифрованное сообщение длиннее исходного в 16 раз, т.к. каждый символ исходного сообщения шифруется в 64-битное слово, а оно разбивается на 8 частей, и каждая из них представляется двумя символами ASCII.

Среднее время шифрования данного сообщения с указанным ключом: 0.0037 сек.


 

Среднее время расшифровывания данного сообщения с указанным ключём: 0.0036 сек.


 

Асимметричные криптосистемы

Алгоритмы асимметричного шифрования – это такие алгоритмы, в которых для шифрования и расшифровывания сообщений используется два различных ключа: открытый – для шифрования сообщения, секретный – для расшифровывания. Ключи связаны между собой соотношением, гарантирующим лёгкость вычисления открытого ключа из секретного и невозможность (за ограниченное время при реальных ресурсах) вычисления закрытого из открытого при достаточно большой размерности операндов.


Дата добавления: 2021-06-02; просмотров: 57; Мы поможем в написании вашей работы!

Поделиться с друзьями:






Мы поможем в написании ваших работ!