Файл: Программа поточного шифрования на языке программирования C. 4.docx

ВУЗ: Не указан

Категория: Не указан

Дисциплина: Не указана

Добавлен: 12.12.2023

Просмотров: 103

Скачиваний: 1

ВНИМАНИЕ! Если данный файл нарушает Ваши авторские права, то обязательно сообщите нам.


Содержание




Введение. 2

Глава 1. Теоретические сведения и практическая часть поточного шифра. 3

1.1 Поточный шифр. 3

1.2 Программа поточного шифрования на языке программирования C++. 4

Глава 2. Теоретические сведения и практическая часть асимметричного шифрования. 8

2.1 Асимметричное шифрования. 8

2.2 Программа ассиметричного шифрования на языке программирования C++. 10

Глава 3. Теоретические сведения и практическая часть шифра Гронсфельда. 17

3.1 Шифр Гронсфельда. 17

2.2 Программа шифра Гронсфельда на языке программирования C++. 17

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

Список литературы. 21


Введение.



Шифрование данных было всегда востребовано, начиная с древних времен и до наших дней.

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

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

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

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

Глава 1. Теоретические сведения и практическая часть поточного шифра.



1.1 Поточный шифр.



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


Рисунок 1. Поточное шифрование.
Простейшим видом сдвигового регистра с обратной связью является линейный сдвиговый регистр с обратной связью (linear feedback shift register, или LFSR). Обратная связь представляет собой просто XOR некоторых битов регистра, перечень этих битов называется отводной последовательностью (tap sequence). Иногда такой регистр называется конфигурацией Фиббоначи. Из-за простоты последовательности обратной связи для анализа LFSR можно использовать довольно развитую математическую теорию.


Поточный шифры на базе сдвиговых регистров часто использовались в годы войны, задолго до появления первых электри. Они были просты в проектировании и реализации.

В 1965 году Эрнст Селмер, главный криптограф норвежского правительства, разработал теорию последовательности сдвиговых регистров. Позже Соломон Голомб, математик Агентства Национальной Безопасности США, написал книгу под названием «Shift Register Sequences» («Последовательности сдвиговых регистров»), в которой изложил свои основные достижения в этой области, а также достижения Селмера.

Большую популярность потоковым шифрам принесла работа Клода Шеннона, опубликованная в 1949 году, в которой Шеннон доказал абсолютную стойкость шифра Вернама (также известного, как одноразовый блокнот). В шифре Вернама ключ имеет длину, равную длине самого передаваемого сообщения. Ключ используется в качестве гаммы, и если каждый бит ключа выбирается случайно, то вскрыть шифр невозможно (т.к. все возможные открытые тексты будут равновероятны). К настоящему времени создано большое количество алгоритмов потокового шифрования.

Принципом потокового шифрования является то что, генератор случайных чисел выдает определенную гамму, то есть числовую последовательность. Последняя из них накладывается на шифруемую информацию с применением операции XOR. На выходе получаются зашифрованные данные. Наиболее популярным является RC4 шифр. Надежность потокового шифрования зависит от числовой последовательности, выдаваемой генератором.

Сферой применения потоковых шифров являются: военные, сетевые, телефонные и другие системы, где происходит преобразование речевой информации в цифровую форму и надежное шифрование данных. Данный шифр популярен, так как прост в реализации и конструировании генераторов, а так же надежен и не имеет ошибок в потоковом шифре.

1.2 Программа поточного шифрования на языке программирования C++.



Для проверки работоспособности программы мною было выбрано слово "magnit", которое было сначала закодировано с помощью ASCII кодировки:

magnit = 109 97 103 110 105 116.



Рисунок 2. Кодовая таблица ASCII.
Программа:


#include

#include

#include

#include

using namespace std;

int main()

{

SetConsoleCP(1251);

SetConsoleOutputCP(1251);

int z{},

i{},

s{},

k[9]{},

sh[9]{},

r{},

W[10]{};

cout << "Какие биты необходимо зашифровать:\n";

for (i = 1; i <= 8; i++)

{

cin >> k[i];

}

cout << "Длина исходного текста (от 1 до 8): ";

cin >> z;

for (i = 1; i <= z; i++)

{

cout << "Код символа: ";

cin >> W[i];

r = W[i];

cout << r << " = ";

for (int j = 8; j > 0; j--)

{

if (r % 2 == 0)

{

sh[j] = 0;

}

if (r % 2 != 0)

{

sh[j] = 1;

}

r = r / 2;

}

for (int s = 1; s <= 8; s++)

cout << sh[s];

cout << " --> ";

for (int y = 1; y <= 8; y++)

{

if (sh[y] == k[y])

sh[y] = 0;

else

sh[y] = 1;

cout << sh[y];

}

cout << endl;

}

return 0;

}
Итог работы программы:


Рисунок 3. Итог работы программы.

Глава 2. Теоретические сведения и практическая часть асимметричного шифрования.




2.1 Асимметричное шифрования.


Криптография с открытым ключом, или асимметричная криптография, является областью криптографических систем, которые используют пары связанных ключей. Каждая пара ключей состоит из открытого ключа и соответствующего закрытого ключа. Пары ключей генерируются с помощью криптографических алгоритмов, основанных на математических задачах, называемых односторонними функциями. Безопасность криптографии с открытым ключом зависит от сохранения секретности закрытого ключа; открытый ключ может быть открыто, распространен без ущерба для безопасности.

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

Также асимметричные алгоритмы применяются для создания электронных подписей для подтверждения авторства и целостности данных. При этом подпись генерируется с помощью закрытого ключа, а проверяется с помощью открытого.

Начало асимметричным шифрам было положено в работе «Новые направления в современной криптографии» Уитфилда Диффи и Мартина Хеллмана, опубликованной в 1976 году. Находясь под влиянием работы Ральфа Меркле о распространении открытого ключа, они предложили метод получения секретных ключей, используя открытый канал. Этот метод экспоненциального обмена ключей, который стал известен как обмен ключами Диффи -- Хеллмана, был первым опубликованным практичным методом для установления разделения секретного ключа между заверенными пользователями канала. В 2002 году Хеллман предложил называть данный алгоритм «Диффи - Хеллмана - Меркле», признавая вклад Меркле в изобретение криптографии с открытым ключом. Эта же схема была разработана Малькольмом Вильямсоном в 1970-х, но держалась в секрете до 1997 года. Метод Меркле по распространению открытого ключа был изобретён в 1974 и опубликован в 1978 году, его также называют загадкой Меркле.

Самыми распространенными алгоритмами асимметричного шифрования являются:

  1. RSA (аббревиатура от Rivest, Shamir и Adelman, фамилий создателей алгоритма) — алгоритм, в основе которого лежит вычислительная сложность факторизации (разложения на множители) больших чисел. Применяется в защищенных протоколах SSL и TLS, стандартах шифрования, например в PGP и S/MIME, и так далее. Используется и для шифрования данных, и для создания цифровых подписей.

  2. DSA (Digital Signature Algorithm, «алгоритм цифровой подписи») — алгоритм, основанный на сложности вычисления дискретных логарифмов. Используется для генерации цифровых подписей. Является частью стандарта DSS (Digital Signature Standard, «стандарт цифровой подписи»).

  3. Схема Эль-Гамаля — алгоритм, основанный на сложности вычисления дискретных логарифмов. Лежит в основе DSA и устаревшего российского стандарта ГОСТ 34.10–94. Применяется как для шифрования, так и для создания цифровых подписей.

  4. ECDSA (Elliptic Curve Digital Signature Algorithm) — алгоритм, основанный на сложности вычисления дискретного логарифма в группе точек эллиптической кривой. Применяется для генерации цифровых подписей, в частности для подтверждения транзакций в криптовалюте Ripple.

  5. Rabin - криптографический алгоритм с открытым ключом. Ее безопасность, как и у RSA, связана с трудностью разложения на множители. Безопасность схемы Рабина опирается на сложность поиска квадратных корней по модулю составного числа. Сложность этого алгоритма аналогична проблеме разложения на множители. Главным неудобством практического применения криптосистемы Рабина является то, что при расшифровке текста получается четыре различных сообщения.

  6. McEliece - криптосистема с открытыми ключами на основе теории алгебраического кодирования, разработанная в 1978 году Робертом Мак-Элисом. Это была первая схема, использующая рандомизацию в процессе шифрования. Алгоритм не получил широко признания в криптографии, но в то же время является кандидатом для постквантовой криптографии, так как устойчив к атаке с использованием Алгоритма Шора.



2.2 Программа ассиметричного шифрования на языке программирования C++.


Для проверки работоспособности программы мною были выбраны p и q равные 187 и 140, а также e равное 871. Слово для шифрования: pereverzeva.

Программа:

#include

long long Cipher_text[15];
unsigned int g_c_d(unsigned int a, unsigned int b)

{

if (a % b == 0)

return b;

if (b % a == 0)

return a;

if (a > b)

return g_c_d(a % b, b);

return g_c_d(a, b % a);

}

long gcd(long a, long b, long& x, long& y)

{

if (a == 0)

{

x = 0;

y = 1;

return b;

}

long x1, y1;

long d = gcd(b % a, a, x1, y1);

x = y1 - (b / a) * x1;

y = x1;

return d;

}

bool a_s(long a, long b,

long c, long& x0,

long& y0, long& g)

{

g = gcd(abs(a), abs(b), x0, y0);

if (c % g != 0)

return false;

x0 *= c / g;

y0 *= c / g;

if (a < 0) x0 *= -1;

if (b < 0) y0 *= -1;

return true;

}

bool p_x_s(long a, long b, long c,

long& x, long& y, long& g)

{

if (!a_s(a, b, c, x, y, g))

return false;

while (x < 0)

{

x += b / g;

y -= a / g;

}

return true;
}

int BT(int num, int bin_num[])

{

int i = 0, mod = 0;

while (num != 0)

{

mod = num % 2;

bin_num[i] = mod;

num = num / 2;

i++;

}

return i;

}
long long M_E(long long a, int b, int n)

{

std::cout << "a: " << a << " b: " << b << " n: " << n << std::endl;

int c = 0, bin_num[1000];

long long d = 1;

int k = BT(b, bin_num) - 1;
for (int i = k; i >= 0; i--)

{

c = 2 * c;

d = (d * d) % n;

if (bin_num[i] == 1)

{

c = c + 1;

d = (d * a) % n;

}

}

std::cout << "d: " << d << std::endl;

std::cout << '\n';

return d;

}

void RSA_E(int inp_mas[15], int c_e, int c_n)

{

int i = 0;

for (i = 0; i < 15; i++)

Cipher_text[i] = M_E(inp_mas[i], c_e, c_n);
std::cout << "\nЗашифрованное слово: ";

for (i = 0; i < 15; i++)

std::cout << Cipher_text[i] << " ";

std::cout << '\n' << '\n';

}
void RSA_D(int c_d, int c_n)

{

int i = 0;

for (i = 0; i < 15; i++)

Cipher_text[i] = M_E(Cipher_text[i], c_d, c_n);

std::cout << "\nРасшифрованное слово: ";

for (i = 0; i < 15; i++)

std::cout << Cipher_text[i] << " ";

std::cout << '\n' << '\n';

}
int main()

{

std::setlocale(LC_ALL, "Rus");

std::cout << "Введите значения p и q:\n";

int p{}, q{};

std::cin >> p >> q;

int n{ p * q }, fn{ (p - 1) * (q - 1) };

std::cout << "Введите значение e:\n";

int e{};

std::cin >> e;

if (g_c_d(e, fn) == 1)

std::cout << "Проверка НОД e и (p-1)*(q-1): true;\n";

else

{

std::cerr << "Проверка НОД e и (p-1)*(q-1): true; НОД = "

<< g_c_d(e, fn) << std::endl;

return 1;

}

long x, y, g;

if (!p_x_s(e, fn, 1, x, y, g))

{

std::cerr << "Невозможно посчитать корни линейного Диафантова уровнения!";

return 2;

}

else

std::cout << "\nЛинейное Диафантово уровнение:\n\n"

<< e << "*" << x << " + " << fn

<< "*" << y << " = " << 1 << ",\n\nгде " << x << " = x = d - значение закрытого ключа;\n"

<< y << " = y.\n";

std::cout << "\nВведите кодируемое слово (до 15-ти символов): \n";

std::string inp_mes{};

std::cin >> inp_mes;

int buff_str_mass[15]{};

for (int i{}; i < inp_mes.length(); i++)

buff_str_mass[i] = static_cast(inp_mes[i]);

int d{};

d = static_cast(x);

std::cout << "\nОткрытый ключ: e = " << e << "; n = " << n << ".\n"

<< "Закрытый ключ: e = " << d << "; n = " << n << ".\n\n"

<< "Зашифрованное слово:\n\n";

std::cout << "\nИсходное слово (Числовой вид): ";

for (int i{}; i < 15; i++)

std::cout << static_cast(buff_str_mass[i]) << " ";

std::cout << std::endl;

RSA_E(buff_str_mass, e, n);

std::cout << "\nРасшифровка слова :\n";

RSA_D(d, n);

std::cout << "\nДешифрованное слова (символьный вид): ";

for (int i{}; i < 15; i++)

std::cout << static_cast(Cipher_text[i]) << " ";

system("pause");

return 0;

}

Итог работы программы:


Рисунок 4. Итог работы программы часть 1.



Рисунок 5. Итог работы программы часть 1.

Глава 3. Теоретические сведения и практическая часть шифра Гронсфельда.




3.1 Шифр Гронсфельда.


Шифр Гронсфельда является изменённым шифром Цезаря с помощью числового ключа. Для этого под буквами исходного сообщения записывают цифры числового ключа. Если ключ короче сообщения, то его запись циклически повторяют. Шифрованный текст получают примерно, как в шифре Цезаря, но отсчитывают по алфавиту не третью букву, а выбирают ту букву, которая смещена по алфавиту на соответствующую цифру ключа.



Рисунок 6 – Пример шифра Гронсфельда.

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

2.2 Программа шифра Гронсфельда на языке программирования C++.


Для проверки работоспособности программы мною был выбран ключ 140 (последние три цифры зачётки). Слово для шифрования: переверзева.
Программы:
#include

#include

#include

#include

#include

using namespace std;

int main()

{

SetConsoleCP(1251);

SetConsoleOutputCP(1251);

cout << "Введите слово для шифрования: ";

string p_str;

getline(std::cin, p_str);

vector m;

for (char tmp : p_str)

m.push_back(static_cast(tmp));

cout << "\nВведите ключ: ";

string k;

cin >> k;

cout << endl;

vector key_symbols;

vector key_symb_trans;

for (char tmp : k)

{

key_symbols.push_back(static_cast(tmp));

key_symb_trans.push_back(static_cast(tmp) - 48);

}

int j{}, tmp{};

string t_str{};

for (int i{}; i < m.size(); i++)

{

if (m[i] == 32)

{

tmp = -32 + (key_symb_trans[j] - 1);

t_str += static_cast(tmp);

}

else if ((m[i] >= (-32)) && (m[i] <= (-1)))

{

tmp = m[i] + key_symb_trans[j];

if (tmp >= (-1))

{

tmp = -32 + (key_symb_trans[j] - 1 - (-1 - (m[i])));

}

t_str += static_cast(tmp);

}

else

continue;

j++;

if (j > (key_symb_trans.size() - 1))

j = 0;

}

cout << "Зашифрованное слово: " << t_str << endl;

system("pause");

return 0;

}

Итог работы программы:

Рисунок 7 – Итог работы программы.

Заключение.



По итогу можно сказать что, криптографические методы защиты информации действительно являются основной часть любой информационной системы. Так как в современном мире информация играет важную роль её приходиться защищать, так как кража или порча может привести к печальным последствиям.

В процессе выполнения данной работы были изучены теоретической аспекты трёх методов шифрования таких как: поточный шифр, ассиметричный шифр и шифр Гронсфельда. А так же они были реализованы на практике.

Список литературы.
1. Алгоритмы шифрования. Специальный справочник. С. Панасенко. - М.: БХВ-Петербург, 2017. - 576 c.

2. Введение в криптографию. В.В. Ященко. 3-е изд., 2010. – 361 с.

3. Панасенко С.П. Алгоритмы шифрования. – М: Элиот, 2019. – 189 с.

4. Ю. В. Стасев / А. В. Потий / Ю. А. Избенко. Исследование методов криптоанализа поточных шифров, 2014. – 289 с.

5. Ю. Колотилов / Б. Кабулов / П. Кузнецов – Вопросы защиты информации – М: Элиот , 2018. – 258 с.

6. А.В.Яковлев. Криптографическая защита информации. – Т: Из-во Тамб. Гос. Тех. ун-та, 2016. – 253 с.

7. Саломаа А. Криптография с открытым ключом. – М: Мир, 2015. – 229 с.

8. Бабаш А.В. - Защита информации. Конфидент. – М: Элиот, 2016. – 274 с.

9. Кузьмин, Т. В. Криптографические методы защиты информации / Т.В. Кузьмин. - М: Питер2019. - 192 c.

10. Герман, О. Н. Теоретико-числовые методы в криптографии / О.Н. Герман, Ю.В. Нестеренко. - М.: Академия, 2020. - 272 c.