шифрование прошивки
#включать
#включать
#включает в себя
#включают
// Шифрует содержимое входного файла 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; // Успех.
}
#включать
#включает в себя
#включают
// Шифрует содержимое входного файла 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; // Успех.
}