Загрузка...

С++ OPENSSL AES генерация ключей, шифрование файлов

Тема в разделе C/C++ создана пользователем ilvwntr 28 ноя 2024. 264 просмотра

  1. ilvwntr
    ilvwntr Автор темы 28 ноя 2024 0 29 июл 2024
    Привет, подскажите, пожалуйста, кто работал уже с OPENSSL: Как сгенерировать AES ключ и шифровать/расшифровать файл им?
    Честно, я мало что понимаю в документации (она реально нечитаема)
     
  2. Scriptto6
    Scriptto6 28 ноя 2024 208 25 июн 2024
    1. ChatGPT
      Привет, Scriptto6! Конечно, помогу.

      Для работы с OpenSSL и AES в C/C++, можно использовать следующие шаги:

      1. **Генерация AES ключа:**
      CPP

      #include <openssl/rand.h>

      unsigned char key[32]; // 256 бит для AES-256
      if (!RAND_bytes(key, sizeof(key))) {
      // Обработка ошибки
      }
      2. **Шифрование файла:**
      CPP

      #include <openssl/evp.h>
      #include <openssl/aes.h>

      void encrypt(const unsigned char *plaintext, int plaintext_len, const unsigned char *key,
      unsigned char *ciphertext) {
      EVP_CIPHER_CTX *ctx = EVP_CIPHER_CTX_new();
      int len;
      int ciphertext_len;

      EVP_EncryptInit_ex(ctx, EVP_aes_256_cbc(), NULL, key, NULL);
      EVP_EncryptUpdate(ctx, ciphertext, &len, plaintext, plaintext_len);
      ciphertext_len = len;
      EVP_EncryptFinal_ex(ctx, ciphertext + len, &len);
      ciphertext_len += len;

      EVP_CIPHER_CTX_free(ctx);
      }
      3. **Расшифровка файла:**
      CPP

      void decrypt(const unsigned char *ciphertext, int ciphertext_len, const unsigned char *key,
      unsigned char *plaintext) {
      EVP_CIPHER_CTX *ctx = EVP_CIPHER_CTX_new();
      int len;
      int plaintext_len;

      EVP_DecryptInit_ex(ctx, EVP_aes_256_cbc(), NULL, key, NULL);
      EVP_DecryptUpdate(ctx, plaintext, &len, ciphertext, ciphertext_len);
      plaintext_len = len;
      EVP_DecryptFinal_ex(ctx, plaintext + len, &len);
      plaintext_len += len;

      EVP_CIPHER_CTX_free(ctx);
      }
      Обратите внимание, что для шифрования и расшифровки вам также потребуется инициализационный вектор (IV), который должен быть уникальным для каждого шифрования, но не секретным. Его можно передавать вместе с зашифрованными данными.

      Если у вас есть конкретные вопросы или проблемы с кодом, дайте знать!
    2. ilvwntr Автор темы
      ChatGPT, какая ты модель
    3. Посмотреть следующие комментарии (1)
  3. ilvwntr
    ilvwntr Автор темы 29 ноя 2024 0 29 июл 2024
    Обновление по теме: генерация ключа делается с помощью ф-ции RAND_bytes, куда мы передаем буфер и длину буфера.

    unsigned char* generateAESKey(const int keyLength = 32)
    {
    unsigned char* key = new unsigned char[keyLength];

    if (RAND_bytes(key, keyLength) != 1) {
    fprintf(stderr, "error generating AES key\n");
    delete[] key;
    return nullptr;
    }

    printf("AES Key generated successfully:\n");
    for (int i = 0; i < keyLength; i++) {
    printf("%x02", key);
    }
    printf("\n");
    return key;
    } - генерация ключа
     
Загрузка...
Top