criptografia de firmwire

#incluir
#incluir
#includes
#incluir

// Criptografa o conteúdo do arquivo de entrada `arg1` e grava o conteúdo criptografado no arquivo de saída `arg2`.
// A criptografia é realizada usando AES-256-CBC com uma chave salgada derivada da senha `arg3`.
// Retorna 1 em caso de sucesso e 0 em caso de falha.
int32_t saltedEncrypt(char* arg1, char* arg2, char* arg3) {
ARQUIVO *inputArquivo = fopen(arg1, "rb");
if (arquivodeentrada == NULL) {
puts("Falha ao abrir arquivo de entrada");
0 voltar;
}

ARQUIVO *arquivosaída = fopen(arg2, "wb");
if (arquivosaída == NULL) {
puts("Falha ao criar arquivo de saída");
fclose(inputArquivo);
0 voltar;
}

const EVP_CIPHER *cipherType = EVP_aes_256_cbc();
sal de carvão não assinado[8];
if (RAND_bytes(salt, sizeof(salt)) != 1) { // Gera um salt aleatório.
puts("Falha ao gerar sal");
fclose(inputArquivo);
fclose(arquivosaída);
0 voltar;
}

// Escrevendo a string mágica "Salted__" e o salt no arquivo de saída.
fwrite("Salgado__", 1, 8, arquivosaída);
fwrite(sal, 1, sizeof(sal), arquivo de saída);

chave de caractere não assinada[EVP_MAX_KEY_LENGTH], iv[EVP_MAX_IV_LENGTH];
// Derive a chave e o IV da senha e do sal usando SHA-256.
if (!EVP_BytesToKey(cipherType, EVP_sha256(), salt, (unsigned char*)arg3, strlen(arg3), 1, key, iv)) {
puts("Falha ao gerar chave");
fclose(inputArquivo);
fclose(arquivosaída);
0 voltar;
}

EVP_CIPHER_CTX *ctx = EVP_CIPHER_CTX_new();
if (ctx == NULL || EVP_EncryptInit_ex(ctx, cipherType, NULL, key, iv) != 1) {
puts("Falha na inicialização da criptografia");
EVP_CIPHER_CTX_free(ctx);
fclose(inputArquivo);
fclose(arquivosaída);
0 voltar;
}

caractere não assinado inBuf[1024], outBuf[1024 + EVP_MAX_BLOCK_LENGTH];
int inLen, outLen;
while ((inLen = fread(inBuf, 1, sizeof(inBuf), inputFile)) > 0) {
if (EVP_EncryptUpdate(ctx, outBuf, &outLen, inBuf, inLen) != 1) {
handleErrors(); // Defina sua função de tratamento de erros.
// Sai ou limpa recursos.
}
fwrite(outBuf, 1, outLen, outputFile);
}

if (EVP_EncryptFinal_ex(ctx, outBuf, &outLen) != 1) {
handleErrors(); // Trata os erros adequadamente.
// Sai ou limpa recursos.
}
fwrite(outBuf, 1, outLen, outputFile);

EVP_CIPHER_CTX_free(ctx);
fclose(inputArquivo);
fclose(arquivosaída);

retornar 1; // Sucesso.
}

Formulário de Contato