шифрование прошивки

#включать
#включать
#включает в себя
#включают

// Шифрует содержимое входного файла arg1 и записывает зашифрованное содержимое в выходной файл arg2.
// Шифрование выполняется с использованием AES-256-CBC с добавленным ключом, полученным из парольной фразы `arg3`.
// Возвращает 1 в случае успеха и 0 в случае неудачи.
int32_t saltedEncrypt(char* arg1, char* arg2, char* arg3) {
ФАЙЛ *inputFile = fopen(arg1, "rb");
если (входной файл == NULL) {
puts("Не удалось открыть входной файл");
0 вернуться;
}

ФАЙЛ *outputFile = fopen(arg2, "wb");
если (выходной файл == NULL) {
puts("Не удалось создать выходной файл");
fclose (входной файл);
0 вернуться;
}

const EVP_CIPHER *cipherType = EVP_aes_256_cbc();
беззнаковая каменноугольная соль[8];
if (RAND_bytes(salt, sizeof(salt)) != 1) { // Генерируем случайную соль.
puts("Не удалось создать соль");
fclose (входной файл);
fclose (выходной файл);
0 вернуться;
}

// Записываем магическую строку "Salted__" и соль в выходной файл.
fwrite("Salted__", 1, 8, выходной файл);
fwrite(salt, 1, sizeof(salt), outputFile);

ключ беззнакового символа[EVP_MAX_KEY_LENGTH], iv[EVP_MAX_IV_LENGTH];
// Получите ключ и IV из парольной фразы и соли, используя SHA-256.
if (!EVP_BytesToKey(cipherType, EVP_sha256(), salt, (unsigned char*)arg3, strlen(arg3), 1, key, iv)) {
puts("Не удалось сгенерировать ключ");
fclose (входной файл);
fclose (выходной файл);
0 вернуться;
}

EVP_CIPHER_CTX *ctx = EVP_CIPHER_CTX_new();
if (ctx == NULL || EVP_EncryptInit_ex(ctx, cipherType, NULL, key, iv) != 1) {
puts("Инициализация шифрования не удалась");
EVP_CIPHER_CTX_free(ctx);
fclose (входной файл);
fclose (выходной файл);
0 вернуться;
}

беззнаковый символ inBuf[1024], outBuf[1024 + EVP_MAX_BLOCK_LENGTH];
интервал inLen, outLen;
while ((inLen = fread(inBuf, 1, sizeof(inBuf), inputFile)) > 0) {
if (EVP_EncryptUpdate(ctx, outBuf, &outLen, inBuf, inLen) != 1) {
handleErrors(); // Определите функцию обработки ошибок.
// Выход или очистка ресурсов.
}
fwrite(outBuf, 1, outLen, выходной файл);
}

if (EVP_EncryptFinal_ex(ctx, outBuf, &outLen) != 1) {
handleErrors(); // Обрабатываем ошибки соответствующим образом.
// Выход или очистка ресурсов.
}
fwrite(outBuf, 1, outLen, выходной файл);

EVP_CIPHER_CTX_free(ctx);
fclose (входной файл);
fclose (выходной файл);

возврат 1; // Успех.
}