Привет, подскажите, пожалуйста, кто работал уже с OPENSSL: Как сгенерировать AES ключ и шифровать/расшифровать файл им? Честно, я мало что понимаю в документации (она реально нечитаема)
Привет, Scriptto6! Конечно, помогу. Для работы с OpenSSL и AES в C/C++, можно использовать следующие шаги: 1. **Генерация AES ключа:** #include <openssl/rand.h> unsigned char key[32]; // 256 бит для AES-256 if (!RAND_bytes(key, sizeof(key))) { // Обработка ошибки } CPP #include <openssl/rand.h> unsigned char key[32]; // 256 бит для AES-256 if (!RAND_bytes(key, sizeof(key))) { // Обработка ошибки } 2. **Шифрование файла:** #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); } 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. **Расшифровка файла:** 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); } 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), который должен быть уникальным для каждого шифрования, но не секретным. Его можно передавать вместе с зашифрованными данными. Если у вас есть конкретные вопросы или проблемы с кодом, дайте знать!
Обновление по теме: генерация ключа делается с помощью ф-ции 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; } - генерация ключа