Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include "stdafx.h"
- #include <iostream>
- #include <stdio.h>
- #include "openssl/aes.h"
- #include "openssl/evp.h"
- #include <cstdlib>
- static unsigned char key[] = "12345"; // Ключ
- static unsigned char iv[] = "013124"; // Рандомайзер
- // Функция шифровки строки
- unsigned char *aes_encrypt(EVP_CIPHER_CTX *e, unsigned char *plaintext, int *len)
- {
- int c_len = *len + AES_BLOCK_SIZE, f_len = 0;
- unsigned char *ciphertext = (unsigned char *)malloc(c_len);
- EVP_EncryptInit_ex(e, EVP_aes_256_cbc(), NULL, key, iv);
- EVP_EncryptUpdate(e, ciphertext, &c_len, plaintext, *len);
- EVP_EncryptFinal_ex(e, ciphertext + c_len, &f_len);
- *len = c_len + f_len;
- return ciphertext;
- }
- // Функция расшифровки строки
- unsigned char *aes_decrypt(EVP_CIPHER_CTX *e, unsigned char *ciphertext, int *len)
- {
- int p_len = *len, f_len = 0;
- unsigned char *plaintext = (unsigned char *)malloc(p_len);
- EVP_DecryptInit_ex(e, EVP_aes_256_cbc(), NULL, key, iv);
- EVP_DecryptUpdate(e, plaintext, &p_len, ciphertext, *len);
- EVP_DecryptFinal_ex(e, plaintext + p_len, &f_len);
- *len = p_len + f_len;
- return plaintext;
- }
- // Функция для добавления записи
- void add() {
- FILE *file = NULL; // Создаем пустой указатель на файл
- fopen_s(&file, "text.txt", "a"); // Открываем файл
- if (file == NULL) { // Проверяем, открылся ли файл
- std::cerr << "Ошибка при открытии файла\n";
- return;
- }
- unsigned char surname[100]; // <- Буфер для Фамилии
- unsigned char name[100]; // <- Буфер для Имени
- unsigned int pass; // <- Буфер для Номера паспорта
- /* Ввод данных в консоль */
- std::cout << "Введите Фамилию: ";
- std::cin >> surname;
- std::cout << "Введите Имя: ";
- std::cin >> name;
- std::cout << "Введите Номер паспорта: ";
- std::cin >> pass;
- char plaintext[100]; // Строка для шифровки
- unsigned char* cryptedtext[256]; // Зашифрованная строка
- sprintf_s(plaintext, "%s %s %i", surname, name, pass); // Заполняем строку для шифровки
- EVP_CIPHER_CTX *ctx = EVP_CIPHER_CTX_new();
- int len = strlen(plaintext); // Длина строки для шифровки
- auto str = aes_encrypt(ctx, (unsigned char*)plaintext, &len); // Шифруем строку
- str[len] = '\0'; // Указываем на конец строки
- fprintf_s(file, "%s\n",str); // Добавляем строку в файл
- fclose(file); // Закрываем и сохраняем файл
- EVP_CIPHER_CTX_free(ctx); // Удаление структуры
- std::cout << std::endl; // Отступ в консоли
- }
- // Функция для отображения всех записей из файла
- void print() {
- FILE *file = NULL; // Создаем пустой указатель на файл
- fopen_s(&file, "text.txt", "r"); // Открываем файл для чтения
- if (file == NULL) { // Проверяем, открылся ли файл
- std::cerr << "Ошибка при открытии файла\n";
- return;
- }
- EVP_CIPHER_CTX *ctx = EVP_CIPHER_CTX_new();
- char cryptedtext[256]; // Буфер для шифрованной строки
- int i = 1; // Счетчик
- while (fgets(cryptedtext, 100, file)) // Считываем каждую шифрованную строку из файла
- {
- int len = strlen(cryptedtext); // Длина шифрованной строки
- auto str = aes_decrypt(ctx, (unsigned char*)cryptedtext, &len); // Расшифровка строки
- str[len] = '\0'; // Указываем на конец строки
- std::cout << i << " " << str << std::endl; // Выводим запись
- i++;
- }
- fclose(file); // Заканчиваем чтение файла
- EVP_CIPHER_CTX_free(ctx); // Удаляем структуру
- }
- int main()
- {
- setlocale(LC_ALL, "RU"); // Русская локализация
- int mode; // Режим работы приложения
- while (true) {
- print();
- std::cout << "\nВведите режим работы\n1. Новая запись\n2. Отобразить все записи\n";
- std::cin >> mode;
- switch (mode)
- {
- case 1:
- add();
- break;
- case 2:
- print();
- break;
- default:
- std::cout << "Попробуйте еще раз.\n";
- break;
- }
- }
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement