Advertisement
Nexeon

Untitled

Mar 17th, 2018
89
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 4.57 KB | None | 0 0
  1. #include "stdafx.h"
  2.  
  3. #include <iostream>
  4. #include <stdio.h>
  5. #include "openssl/aes.h"
  6. #include "openssl/evp.h"
  7. #include <cstdlib>
  8.  
  9. static unsigned char key[] = "12345"; // Ключ
  10. static unsigned char iv[] = "013124"; // Рандомайзер
  11.  
  12. // Функция шифровки строки
  13. unsigned char *aes_encrypt(EVP_CIPHER_CTX *e, unsigned char *plaintext, int *len)
  14. {
  15.     int c_len = *len + AES_BLOCK_SIZE, f_len = 0;
  16.     unsigned char *ciphertext = (unsigned char *)malloc(c_len);
  17.  
  18.     EVP_EncryptInit_ex(e, EVP_aes_256_cbc(), NULL, key, iv);
  19.  
  20.     EVP_EncryptUpdate(e, ciphertext, &c_len, plaintext, *len);
  21.  
  22.     EVP_EncryptFinal_ex(e, ciphertext + c_len, &f_len);
  23.  
  24.     *len = c_len + f_len;
  25.     return ciphertext;
  26. }
  27.  
  28. // Функция расшифровки строки
  29. unsigned char *aes_decrypt(EVP_CIPHER_CTX *e, unsigned char *ciphertext, int *len)
  30. {
  31.     int p_len = *len, f_len = 0;
  32.     unsigned char *plaintext = (unsigned char *)malloc(p_len);
  33.  
  34.     EVP_DecryptInit_ex(e, EVP_aes_256_cbc(), NULL, key, iv);
  35.  
  36.     EVP_DecryptUpdate(e, plaintext, &p_len, ciphertext, *len);
  37.  
  38.     EVP_DecryptFinal_ex(e, plaintext + p_len, &f_len);
  39.  
  40.     *len = p_len + f_len;
  41.     return plaintext;
  42. }
  43.  
  44. // Функция для добавления записи
  45. void add() {
  46.     FILE *file = NULL; // Создаем пустой указатель на файл
  47.  
  48.     fopen_s(&file, "text.txt", "a"); // Открываем файл
  49.  
  50.     if (file == NULL) { // Проверяем, открылся ли файл
  51.         std::cerr << "Ошибка при открытии файла\n";
  52.         return;
  53.     }
  54.  
  55.     unsigned char surname[100]; // <- Буфер для Фамилии
  56.     unsigned char name[100]; // <- Буфер для Имени
  57.     unsigned int pass; // <- Буфер для Номера паспорта
  58.  
  59.     /* Ввод данных в консоль */
  60.    
  61.     std::cout << "Введите Фамилию: ";
  62.     std::cin >> surname;
  63.  
  64.     std::cout << "Введите Имя: ";
  65.     std::cin >> name;
  66.  
  67.  
  68.     std::cout << "Введите Номер паспорта: ";
  69.     std::cin >> pass;
  70.  
  71.     char plaintext[100]; // Строка для шифровки
  72.     unsigned char* cryptedtext[256]; // Зашифрованная строка
  73.  
  74.     sprintf_s(plaintext, "%s %s %i", surname, name, pass); // Заполняем строку для шифровки
  75.  
  76.     EVP_CIPHER_CTX *ctx = EVP_CIPHER_CTX_new();
  77.  
  78.     int len = strlen(plaintext); // Длина строки для шифровки
  79.     auto str = aes_encrypt(ctx, (unsigned char*)plaintext, &len); // Шифруем строку
  80.     str[len] = '\0'; // Указываем на конец строки
  81.  
  82.     fprintf_s(file, "%s\n",str); // Добавляем строку в файл
  83.  
  84.     fclose(file); // Закрываем и сохраняем файл
  85.     EVP_CIPHER_CTX_free(ctx); // Удаление структуры
  86.  
  87.     std::cout << std::endl; // Отступ в консоли
  88. }
  89.  
  90. // Функция для отображения всех записей из файла
  91. void print() {
  92.     FILE *file = NULL; // Создаем пустой указатель на файл
  93.  
  94.     fopen_s(&file, "text.txt", "r"); // Открываем файл для чтения
  95.  
  96.     if (file == NULL) { // Проверяем, открылся ли файл
  97.         std::cerr << "Ошибка при открытии файла\n";
  98.         return;
  99.     }
  100.  
  101.     EVP_CIPHER_CTX *ctx = EVP_CIPHER_CTX_new();
  102.  
  103.     char cryptedtext[256]; // Буфер для шифрованной строки
  104.  
  105.     int i = 1; // Счетчик
  106.     while (fgets(cryptedtext, 100, file)) // Считываем каждую шифрованную строку из файла
  107.     {
  108.         int len = strlen(cryptedtext); // Длина шифрованной строки
  109.         auto str = aes_decrypt(ctx, (unsigned char*)cryptedtext, &len); // Расшифровка строки
  110.         str[len] = '\0'; // Указываем на конец строки
  111.  
  112.         std::cout << i << " " << str << std::endl; // Выводим запись
  113.         i++;
  114.     }
  115.  
  116.     fclose(file); // Заканчиваем чтение файла
  117.     EVP_CIPHER_CTX_free(ctx); // Удаляем структуру
  118. }
  119.  
  120. int main()
  121. {
  122.     setlocale(LC_ALL, "RU"); // Русская локализация
  123.  
  124.     int mode; // Режим работы приложения
  125.  
  126.     while (true) {
  127.         print();
  128.  
  129.         std::cout << "\nВведите режим работы\n1. Новая запись\n2. Отобразить все записи\n";
  130.         std::cin >> mode;
  131.  
  132.         switch (mode)
  133.         {
  134.         case 1:
  135.             add();
  136.             break;
  137.         case 2:
  138.             print();
  139.             break;
  140.         default:
  141.             std::cout << "Попробуйте еще раз.\n";
  142.             break;
  143.         }
  144.     }
  145.  
  146.     return 0;
  147. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement