[Криптография] Пишем свой шифратор part 1 | End Way - форум программирования и сливов различных скриптов
  • Присоединяйтесь к нам в телеграм канал! EndWay канал | EndSoft канал | EWStudio канал
  • Хочешь поставить скрипт, но не умеешь?
    А может ты хочешь свой скрипт на основе слитого?

    Тогда добро пожаловать в нашу студию разработки!

    Телеграм бот: EWStudioBot
    Телеграм канал: EWStudio

[Криптография] Пишем свой шифратор part 1

Fischer

Джун
Автор темы
28 Янв 2024
2
0
0
ЭТО КОПИЯ СТАТЬИ С ДРУГОГО ФОРУМА


Введение
Шифрование текста - это процесс преобразования обычного текста в зашифрованный.

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

Шифры можно разделить на несколько основных видов:
  • Шифры замены. В этих шифрах каждая буква текста заменяется на другую букву, цифру или символ.
  • Шифры перестановки. В этих шифрах порядок букв в тексте изменяется.
  • Шифры гаммирования. В этих шифрах открытый текст умножается на некоторую матрицу. Например, в шифре RSA открытый текст умножается на матрицу, построенную на основе секретных чисел.

Теория
Шифры замены

В этом шифре каждая буква текста сдвигается в алфавите на определенное количество позиций. Например, если ключ шифрования равен 3, то буква "А" будет заменяться на букву "Д", буква "Б" будет заменяться на букву "Е" и так далее.
примером шифра замены является шифр Виженера. В этом шифре используется ключ, состоящий из нескольких букв. Каждая буква текста заменяется на букву, находящуюся на расстоянии, равном номеру соответствующей буквы ключа в алфавите. Например, если ключ шифрования равен "АВВА", то буква "А" открытого текста будет заменяться на букву "В", буква "Б" будет заменяться на букву "А", буква "В" будет заменяться на букву "В" и так далее.

Шифры перестановки
Одним из самых простых шифров перестановки является шифр перестановки. В этом шифре буквы текста переставляются в произвольном порядке. Например, если текст состоит из букв "А", "Б", "В", "Г", то после шифрования он может выглядеть следующим образом: "ГВБА".

Шифры гаммирования
Одним из самых известных шифров гаммирования является шифр RSA. В этом шифре используются два секретных числа, называемых ключом N и ключом e. текст умножается на матрицу, построенную на основе этих чисел. Расшифровать такой шифр можно только зная ключ d, который является обратным к ключу e.

Сложность написания своего алгоритма шифрования
  • Выбранный тип шифра
  • Опыт и знания
Пример
Обычная замена:
ВходВыход
AD
БE
ВF
ГG
ЛO
МJ


Практика. Пишем свой шифратор и придумываем алгоритм.
Начнем с самого простого шифратора - обычный перевернутый текст.
Пример:
Исходный текст: Hi EndWay
Зашифрованный текст: yaWdnE iH


C++:

#include <iostream> #include <string> using namespace std; string text(string str) { int len = str.length(); for (int i = 0; i < len / 2; i++) { char temp = str[i]; str[i] = str[len - 1 - i]; str[len - 1 - i] = temp; } return str; } int main() { setlocale(LC_ALL, "rus"); string str; cout << "Текст для шифрования: "; getline(cin, str); string reversedtext = text(str); cout << "Зашифрованный текст: " << reversedtext << endl; string Decryptext = text(reversedtext); cout << "Расшифрованный текст: " << Decryptext << endl; return 0; }

Посмотрим что и как тут работает:
  • text() принимает текст в качестве аргумента и возвращает ее перевернутую копию.
  • пользователь вводит текст.
  • с помощью функции reverseString() переворачиваем строку
  • с помощью функции reverseString() переворачиваем еще раз
Очень легко и просто, но как иначе? Всегда нужно начинать с простого.

Пример замены букв:
Пример:
Исходный текст: Hi EndWay
Зашифрованный текст: Kl HqgZdb


C++:

#include <iostream> #include <string> #include <unordered_map> using namespace std; unordered_map<char, char> encryptionMap; unordered_map<char, char> decryptionMap; void initializeMaps() { string alphabet = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"; for (size_t i = 0; i < alphabet.size(); ++i) { encryptionMap[alphabet[i]] = alphabet[(i + 3) % alphabet.size()]; } for (char c : alphabet) { char lowerCase = tolower(c); encryptionMap[lowerCase] = tolower(encryptionMap[c]); decryptionMap[encryptionMap[c]] = c; } } string encryptText(const string& input) { string encryptedText = input; for (char& character : encryptedText) { if (isalpha(character)) { character = encryptionMap[character]; } } return encryptedText; } string decryptText(const string& input) { string decryptedText = input; for (char& character : decryptedText) { if (isalpha(character)) { character = decryptionMap[character]; } } return decryptedText; } int main() { setlocale(LC_ALL, "rus"); initializeMaps(); string originalText; cout << "текст: "; getline(cin, originalText); string encryptedText = encryptText(originalText); string decryptedText = decryptText(encryptedText); cout << "Исходный текст: " << originalText << endl; cout << "Зашифрованный текст: " << encryptedText << endl; cout << "Расшифрованный текст: " << decryptedText << endl; return 0; }

Разберем код:
  1. initializeMaps(): Эта функция инициализирует encryptionMap и decryptionMap, которые представляют соответствие между буквами для шифрования и их дешифровки. Алгоритм шифрования заключается в том, чтобы сдвигать каждую букву на 3 позиции вперед в алфавите.
  2. string alphabet = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"; - Создается строка, представляющая собой английский алфавит в верхнем регистре.
  3. for (size_t i = 0; i < alphabet.size(); ++i): - Этот цикл создает соответствие для шифрования, где каждая буква заменяется на букву, находящуюся на 3 позиции впереди в алфавите.
  4. for (char c : alphabet): - Этот цикл добавляет соответствие для маленьких букв и создает обратное соответствие для дешифрования.
  5. string encryptText(const string& input): - Эта функция принимает строку и возвращает зашифрованную версию, заменяя каждую букву согласно encryptionMap.
  6. string decryptText(const string& input): - Эта функция принимает зашифрованную строку и возвращает ее дешифрованную версию, используя decryptionMap.

Но как же написать полностью свой алгоритм? Это уже намного сложнее. Во первых нужно изучить уже существующие алгоритмы, далее нужно понять какой цели вы хотите достичь - практика или использование. На основе изученной информации вам нужно придумать свой личный алгоритм. Этим мы и займёмся.

Делаем свой шифратор
Пойдем по пунктам и изучим существующие алгоритмы:
Base64:
Base64 - это не алгоритм шифрования, а метод кодирования данных. Он используется для преобразования двоичных данных в текстовую строку.
Он работает путем преобразования каждого байта исходных данных в трехсимвольную строку из символов A-Z, a-z, 0-9 и + или /.

AES (Advanced Encryption Standard):
AES является симметричным блочным шифром, то есть для шифрования и дешифрования используется один и тот же ключ.
Он принимает блок данных и ключ, и применяет серию подстановок и перестановок к блоку данных с использованием ключа. Эти операции повторяются несколько раз в зависимости от длины ключа.

RSA (Rivest–Shamir–Adleman):
RSA является асимметричным алгоритмом, использующим два ключа: открытый и закрытый.
Он базируется на математической проблеме факторизации больших чисел. Генерируется открытый ключ, который может использоваться для шифрования, и закрытый ключ, который используется для дешифрования.

MD5 (Message Digest Algorithm 5):
MD5 - это хеш-функция, предназначенная для создания фиксированного размера хеш-значения из произвольного ввода.
Он использует серию логических функций, сдвигов, операций и таблиц для преобразования входных данных в 128-битное хеш-значение.

SHA-256 (Secure Hash Algorithm 256-bit):
SHA-256 также является хеш-функцией, но обеспечивает более высокий уровень безопасности по сравнению с MD5.
Он принимает входные данные и разбивает их на блоки. Затем каждый блок обрабатывается серией логических функций и сдвигов, формируя 256-битное хеш-значение.
Думаю что для наших целей этого будет достаточно. Изобретать велосипед мы не будем, поэтому вот такой код получился:

C++:
include <iostream> #include <string> #include <random> using namespace std; string generateRandomKey(size_t length) { static const char charset[] = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789"; static random_device rd; static default_random_engine generator(rd()); static uniform_int_distribution<int> distribution(0, sizeof(charset) - 2); string key; for (size_t i = 0; i < length; ++i) { key += charset[distribution(generator)]; } return key; } string encrypt(const string& input, const string& key) { string result = input; for (size_t i = 0; i < input.size(); ++i) { result[I] = input[I] ^ key[i % key.size()]; } return result; } string decrypt(const string& input, const string& key) { return encrypt(input, key); } int main() { string originalText = "Hello, xss!"; string encryptionKey = generateRandomKey(originalText.size()); string encryptedText = encrypt(originalText, encryptionKey); string decryptedText = decrypt(encryptedText, encryptionKey); cout << "Original Text: " << originalText << endl; cout << "Encryption Key: " << encryptionKey << endl; cout << "Encrypted Text: " << encryptedText << endl; cout << "Decrypted Text: " << decryptedText << endl; return 0; }

Пояснение к коду:
Здесь реализуется простой алгоритм шифрования, основанный на операции исключающего ИЛИ (XOR). Алгоритм работает следующим образом:
  1. Создание случайного ключа: Генерируется случайная строка длиной, равной длине исходного текста. Эта строка будет использоваться в качестве ключа для шифрования и дешифрования текста.
  2. Шифрование текста: Исходный текст XOR-ится с ключом поэлементно, чтобы получить зашифрованный текст. В этом процессе каждый бит исходного текста XOR-ится с соответствующим битом ключа, что приводит к получению нового бита зашифрованного текста.
  3. Дешифрование текста: Зашифрованный текст XOR-ится с тем же ключом, который использовался для шифрования, чтобы получить исходный текст. Этот процесс повторяет операцию XOR, выполняемую при шифровании, что приводит к восстановлению исходного текста.
используются функции:
  • generateRandomKey(): Генерирует случайную строку длиной length из предоставленного набора символов.
  • encrypt(): Шифрует текст input с помощью ключа key. Функция XOR-ит каждый бит input с соответствующим битом key и возвращает полученный зашифрованный текст.
  • decrypt(): Дешифрует текст input с помощью ключа key. Функция XOR-ит каждый бит input с соответствующим битом key и возвращает полученный исходный текст.

Заключение
На практике методы показанные мной фактически не используются, и статья предназначена "вводной", то есть нужна лишь для ознакомления. На статус крутого шифратора я не претендую, и возможно код представленный мной может работать не идеально, но для примера подойдет на отлично.
Спасибо что прочитали статью! Возможно что продолжений не будет, т.к криптография - сложный процесс, который изучать у меня нет времени.
 
Последнее редактирование:

commit

Джун
11 Янв 2023
66
11
0
скрытая реклама форума xss )))) и не совсем понятно для чего называть (часть первая), если даже сам автор пишет, что "Возможно что продолжения не будет", копипастил бы полностью -

Шифрование. Пишем свой шифратор.(вводная статья)​


И ещё, лично я не против копий с подобным материалом здесь.
 
Последнее редактирование:

Click

Миддл
14 Июл 2023
40
18
0
Емае, не думал что мою статью будут копировать.
Указывай пожалуйста автора и источник. Не красиво воровать статьи
 
Активность:
Пока что здесь никого нет